summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2014-06-27 16:57:08 +0200
committerBastien Nocera <hadess@hadess.net>2014-06-27 18:31:18 +0200
commit4b3f9f774da8859d4f1f7e991b12832d6c09b63e (patch)
tree83810c29508ce96e61a4e6b81e02db2b5150e164
parenta936f399ecdee8842e46b4d2f40087e62f4599d4 (diff)
Skip mime database update if packages are older than cache
Check for the mtime of the version file, the last one to be created when updating the database to see against the mtime of the newest packages file. If one of the files inside the packages directory is newer than the version file, really update the database.
-rw-r--r--update-mime-database.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/update-mime-database.c b/update-mime-database.c
index 894ac97..d1849a3 100644
--- a/update-mime-database.c
+++ b/update-mime-database.c
@@ -10,6 +10,7 @@
#include <stdio.h>
#include <glib.h>
#include <glib/gprintf.h>
+#include <glib/gstdio.h>
#include <errno.h>
#include <dirent.h>
#include <libxml/parser.h>
@@ -3538,6 +3539,61 @@ fclose_gerror(FILE *f, GError **error)
return TRUE;
}
+static gint64
+newest_mtime(const char *packagedir)
+{
+ GDir *dir;
+ GStatBuf statbuf;
+ gint64 mtime = G_MININT64;
+ const char *name;
+ int retval;
+
+ retval = g_stat(packagedir, &statbuf);
+ if (retval < 0)
+ return mtime;
+ mtime = statbuf.st_mtime;
+
+ dir = g_dir_open(packagedir, 0, NULL);
+ if (!dir)
+ return mtime;
+
+ while ((name = g_dir_read_name(dir))) {
+ char *path;
+
+ path = g_build_filename(packagedir, name, NULL);
+ retval = g_stat(path, &statbuf);
+ g_free(path);
+ if (retval < 0)
+ continue;
+ if (statbuf.st_mtime > mtime)
+ mtime = statbuf.st_mtime;
+ }
+
+ g_dir_close(dir);
+ return mtime;
+}
+
+static gboolean
+is_cache_up_to_date (const char *mimedir, const char *packagedir)
+{
+ GStatBuf version_stat;
+ gint64 package_mtime;
+ char *mimeversion;
+ int retval;
+
+ mimeversion = g_build_filename(mimedir, "/version", NULL);
+ retval = g_stat(mimeversion, &version_stat);
+ g_free(mimeversion);
+ if (retval < 0)
+ return FALSE;
+
+ package_mtime = newest_mtime(packagedir);
+ if (package_mtime < 0)
+ return FALSE;
+
+ return version_stat.st_mtime >= package_mtime;
+}
+
int main(int argc, char **argv)
{
char *mime_dir = NULL;
@@ -3610,6 +3666,11 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
}
+ if (is_cache_up_to_date(mime_dir, package_dir)) {
+ g_message ("Skipping mime update as the cache is up-to-date");
+ return EXIT_SUCCESS;
+ }
+
types = g_hash_table_new_full(g_str_hash, g_str_equal,
g_free, free_type);
globs_hash = g_hash_table_new_full(g_str_hash, g_str_equal,