From b2163c457d2c9c0c079bae299e2fcfca1e998237 Mon Sep 17 00:00:00 2001 From: Juan RP Date: Tue, 2 Sep 2014 23:49:22 +0200 Subject: [PATCH] shared-mime-info: add patches from upstream that implement -n. update-mime-database from 1.3 takes a LONG WHILE each time is executed, because it's generating the cache unnecessarily. Those patches implement -n to only update the cache if there's any file with a newer mtime than the cache file. --- .../0007-Split-out-fdatasync-usage.patch | 80 +++++++++++++ ...c-usage-if-PKGSYSTEM_ENABLE_FSYNC-is.patch | 47 ++++++++ ...se-update-if-packages-are-older-than.patch | 105 ++++++++++++++++++ ...Add-n-option-to-update-mime-database.patch | 89 +++++++++++++++ srcpkgs/shared-mime-info/template | 2 +- 5 files changed, 322 insertions(+), 1 deletion(-) create mode 100644 srcpkgs/shared-mime-info/patches/0007-Split-out-fdatasync-usage.patch create mode 100644 srcpkgs/shared-mime-info/patches/0008-Disable-fdatasync-usage-if-PKGSYSTEM_ENABLE_FSYNC-is.patch create mode 100644 srcpkgs/shared-mime-info/patches/0013-Skip-mime-database-update-if-packages-are-older-than.patch create mode 100644 srcpkgs/shared-mime-info/patches/0014-Add-n-option-to-update-mime-database.patch diff --git a/srcpkgs/shared-mime-info/patches/0007-Split-out-fdatasync-usage.patch b/srcpkgs/shared-mime-info/patches/0007-Split-out-fdatasync-usage.patch new file mode 100644 index 00000000000..b1563d0a9a0 --- /dev/null +++ b/srcpkgs/shared-mime-info/patches/0007-Split-out-fdatasync-usage.patch @@ -0,0 +1,80 @@ +From fd48920cf82402a95f658cab93db0cf3786c4d6e Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Wed, 25 Jun 2014 17:23:50 +0200 +Subject: [PATCH 7/8] Split out fdatasync() usage + +--- + update-mime-database.c | 38 ++++++++++++++++++++++++-------------- + 1 file changed, 24 insertions(+), 14 deletions(-) + +diff --git a/update-mime-database.c b/update-mime-database.c +index c043606..c1a6f9f 100644 +--- update-mime-database.c ++++ update-mime-database.c +@@ -936,39 +936,49 @@ set_error_from_errno (GError **error) + g_strerror(errsv)); + } + +-/* Renames pathname by removing the .new extension */ +-static gboolean atomic_update(const gchar *pathname, GError **error) ++static int ++sync_file(const gchar *pathname, GError **error) + { +- gboolean ret = FALSE; +- gchar *new_name = NULL; +- int len; + int fd; + +- len = strlen(pathname); +- +- g_return_val_if_fail(strcmp(pathname + len - 4, ".new") == 0, FALSE); +- +- new_name = g_strndup(pathname, len - 4); +- + #ifdef HAVE_FDATASYNC + fd = open(pathname, O_RDWR); + if (fd == -1) + { + set_error_from_errno(error); +- goto out; ++ return -1; + } + if (fdatasync(fd) == -1) + { + set_error_from_errno(error); +- goto out; ++ return -1; + } + if (close(fd) == -1) + { + set_error_from_errno(error); +- goto out; ++ return -1; + } + #endif + ++ return 0; ++} ++ ++/* Renames pathname by removing the .new extension */ ++static gboolean atomic_update(const gchar *pathname, GError **error) ++{ ++ gboolean ret = FALSE; ++ gchar *new_name = NULL; ++ int len; ++ ++ len = strlen(pathname); ++ ++ g_return_val_if_fail(strcmp(pathname + len - 4, ".new") == 0, FALSE); ++ ++ new_name = g_strndup(pathname, len - 4); ++ ++ if (sync_file(pathname, error) == -1) ++ goto out; ++ + #ifdef _WIN32 + /* we need to remove the old file first! */ + remove(new_name); +-- +1.9.3 + diff --git a/srcpkgs/shared-mime-info/patches/0008-Disable-fdatasync-usage-if-PKGSYSTEM_ENABLE_FSYNC-is.patch b/srcpkgs/shared-mime-info/patches/0008-Disable-fdatasync-usage-if-PKGSYSTEM_ENABLE_FSYNC-is.patch new file mode 100644 index 00000000000..aa8ba418c42 --- /dev/null +++ b/srcpkgs/shared-mime-info/patches/0008-Disable-fdatasync-usage-if-PKGSYSTEM_ENABLE_FSYNC-is.patch @@ -0,0 +1,47 @@ +From 1f7683bfcbecbeffa802a1c361e1842db2fff4f8 Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Wed, 25 Jun 2014 17:25:50 +0200 +Subject: [PATCH 8/8] Disable fdatasync() usage if PKGSYSTEM_ENABLE_FSYNC is + set + +If the PKGSYSTEM_ENABLE_FSYNC envvar is set to a non-zero value, +the fdatasync() call will be skipped, at the expense of data integrity. + +https://bugs.freedesktop.org/show_bug.cgi?id=70366 +--- + update-mime-database.c | 14 ++++++++++++++ + 1 file changed, 14 insertions(+) + +diff --git a/update-mime-database.c b/update-mime-database.c +index c1a6f9f..894ac97 100644 +--- update-mime-database.c ++++ update-mime-database.c +@@ -936,11 +936,25 @@ set_error_from_errno (GError **error) + g_strerror(errsv)); + } + ++static gboolean ++sync_enabled(void) ++{ ++ const char *env; ++ ++ env = g_getenv("PKGSYSTEM_ENABLE_FSYNC"); ++ if (!env) ++ return TRUE; ++ return atoi(env); ++} ++ + static int + sync_file(const gchar *pathname, GError **error) + { + int fd; + ++ if (!sync_enabled()) ++ return 0; ++ + #ifdef HAVE_FDATASYNC + fd = open(pathname, O_RDWR); + if (fd == -1) +-- +1.9.3 + diff --git a/srcpkgs/shared-mime-info/patches/0013-Skip-mime-database-update-if-packages-are-older-than.patch b/srcpkgs/shared-mime-info/patches/0013-Skip-mime-database-update-if-packages-are-older-than.patch new file mode 100644 index 00000000000..77085395c98 --- /dev/null +++ b/srcpkgs/shared-mime-info/patches/0013-Skip-mime-database-update-if-packages-are-older-than.patch @@ -0,0 +1,105 @@ +From 4b3f9f774da8859d4f1f7e991b12832d6c09b63e Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Fri, 27 Jun 2014 16:57:08 +0200 +Subject: [PATCH 13/14] 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. +--- + update-mime-database.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 61 insertions(+) + +diff --git a/update-mime-database.c b/update-mime-database.c +index 894ac97..d1849a3 100644 +--- update-mime-database.c ++++ update-mime-database.c +@@ -10,6 +10,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -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, +-- +1.9.3 + diff --git a/srcpkgs/shared-mime-info/patches/0014-Add-n-option-to-update-mime-database.patch b/srcpkgs/shared-mime-info/patches/0014-Add-n-option-to-update-mime-database.patch new file mode 100644 index 00000000000..c13d6a72f82 --- /dev/null +++ b/srcpkgs/shared-mime-info/patches/0014-Add-n-option-to-update-mime-database.patch @@ -0,0 +1,89 @@ +From 29a04be6c9cbaf0865c8b57428b7b7c37fbda4c3 Mon Sep 17 00:00:00 2001 +From: Bastien Nocera +Date: Fri, 27 Jun 2014 18:25:57 +0200 +Subject: [PATCH 14/14] Add "-n" option to update-mime-database + +When "-n" is passed, the cache will only be updated if +$MIME_DIR/packages or one of the files in that directory is newer +than $MIME_DIR/version. + +This is useful for package pre- and post-installation scripts. +--- + update-mime-database.1 | 7 +++++++ + update-mime-database.c | 10 +++++++--- + 2 files changed, 14 insertions(+), 3 deletions(-) + +diff --git a/update-mime-database.1 b/update-mime-database.1 +index c9164e1..b18eac3 100644 +--- update-mime-database.1 ++++ update-mime-database.1 +@@ -16,6 +16,8 @@ update-mime-database \- a program to build the Shared MIME-Info database cache + .B \-v + | [ + .B \-V ++| ++.B \-n + ] + .I MIME-DIR + +@@ -38,6 +40,11 @@ Print out the version information. + .TP + \fB\-V\fR + Be verbose. ++.TP ++\fB\-n\fR ++Only update if \fBMIME-DIR\fR/packages/ or a file in that directory ++is newer than \fBMIME-DIR\fR/version. This is useful for package pre- ++and post-installation scripts. + + .SH ARGUMENTS + .TP +diff --git a/update-mime-database.c b/update-mime-database.c +index d1849a3..be4aba2 100644 +--- update-mime-database.c ++++ update-mime-database.c +@@ -194,7 +194,7 @@ fatal_gerror (GError *error) + + static void usage(const char *name) + { +- g_fprintf(stderr, _("Usage: %s [-hvV] MIME-DIR\n"), name); ++ g_fprintf(stderr, _("Usage: %s [-hvVn] MIME-DIR\n"), name); + } + + static void free_type(gpointer data) +@@ -3601,11 +3601,12 @@ int main(int argc, char **argv) + int opt; + GError *local_error = NULL; + GError **error = &local_error; ++ gboolean if_newer = FALSE; + + /* Install the filtering log handler */ + g_log_set_default_handler(g_log_handler, NULL); + +- while ((opt = getopt(argc, argv, "hvV")) != -1) ++ while ((opt = getopt(argc, argv, "hvVn")) != -1) + { + switch (opt) + { +@@ -3624,6 +3625,9 @@ int main(int argc, char **argv) + enabled_log_levels |= G_LOG_LEVEL_MESSAGE + | G_LOG_LEVEL_INFO; + break; ++ case 'n': ++ if_newer = TRUE; ++ break; + default: + return EXIT_FAILURE; + } +@@ -3666,7 +3670,7 @@ int main(int argc, char **argv) + return EXIT_FAILURE; + } + +- if (is_cache_up_to_date(mime_dir, package_dir)) { ++ if (if_newer && is_cache_up_to_date(mime_dir, package_dir)) { + g_message ("Skipping mime update as the cache is up-to-date"); + return EXIT_SUCCESS; + } +-- +1.9.3 + diff --git a/srcpkgs/shared-mime-info/template b/srcpkgs/shared-mime-info/template index c1ec2951326..22c7c65a5f0 100644 --- a/srcpkgs/shared-mime-info/template +++ b/srcpkgs/shared-mime-info/template @@ -3,7 +3,7 @@ disable_parallel_build=1 pkgname=shared-mime-info version=1.3 -revision=1 +revision=2 build_style=gnu-configure configure_args="--disable-update-mimedb" hostmakedepends="pkg-config intltool"