gnu: glib: Graft patch to detect changes to the installed applications.
Fixes <https://bugs.gnu.org/35594>. Reported by sirgazil <sirgazil@zoho.com> and others. * gnu/packages/patches/glib-appinfo-watch.patch: New file. * gnu/local.mk (dist_patch_DATA): Add it. * gnu/packages/glib.scm (glib)[replacement]: New field. (glib-with-gio-patch): New variable. (glib-with-documentation): Use 'package/inherit'.
This commit is contained in:
parent
a30e7a72fc
commit
ae10ec441a
@ -1050,6 +1050,7 @@ dist_patch_DATA = \
|
||||
%D%/packages/patches/ghostscript-no-header-id.patch \
|
||||
%D%/packages/patches/ghostscript-no-header-uuid.patch \
|
||||
%D%/packages/patches/ghostscript-no-header-creationdate.patch \
|
||||
%D%/packages/patches/glib-appinfo-watch.patch \
|
||||
%D%/packages/patches/glib-tests-timer.patch \
|
||||
%D%/packages/patches/glibc-CVE-2018-11236.patch \
|
||||
%D%/packages/patches/glibc-CVE-2018-11237.patch \
|
||||
|
@ -181,6 +181,7 @@ shared NFS home directories.")
|
||||
(package
|
||||
(name "glib")
|
||||
(version "2.62.6")
|
||||
(replacement glib-with-gio-patch)
|
||||
(source (origin
|
||||
(method url-fetch)
|
||||
(uri (string-append "mirror://gnome/sources/"
|
||||
@ -387,11 +388,20 @@ dynamic loading, and an object system.")
|
||||
(home-page "https://developer.gnome.org/glib/")
|
||||
(license license:lgpl2.1+)))
|
||||
|
||||
(define glib-with-gio-patch
|
||||
;; GLib with a fix for <https://bugs.gnu.org/35594>.
|
||||
;; TODO: Fold into 'glib' above in the next rebuild cycle.
|
||||
(package
|
||||
(inherit glib)
|
||||
(source (origin
|
||||
(inherit (package-source glib))
|
||||
(patches (cons (search-patch "glib-appinfo-watch.patch")
|
||||
(origin-patches (package-source glib))))))))
|
||||
|
||||
(define-public glib-with-documentation
|
||||
;; glib's doc must be built in a separate package since it requires gtk-doc,
|
||||
;; which in turn depends on glib.
|
||||
(package
|
||||
(inherit glib)
|
||||
(package/inherit glib
|
||||
(properties (alist-delete 'hidden? (package-properties glib)))
|
||||
(outputs (cons "doc" (package-outputs glib))) ; 20 MiB of GTK-Doc reference
|
||||
(native-inputs
|
||||
|
92
gnu/packages/patches/glib-appinfo-watch.patch
Normal file
92
gnu/packages/patches/glib-appinfo-watch.patch
Normal file
@ -0,0 +1,92 @@
|
||||
This patch lets GLib's GDesktopAppInfo API watch and notice changes
|
||||
to the Guix user and system profiles. That way, the list of available
|
||||
applications shown by the desktop environment is immediately updated
|
||||
when the user runs "guix install", "guix remove", or "guix system
|
||||
reconfigure" (see <https://issues.guix.gnu.org/35594>).
|
||||
|
||||
It does so by monitoring /var/guix/profiles (for changes to the system
|
||||
profile) and /var/guix/profiles/per-user/USER (for changes to the user
|
||||
profile) and crawling their share/applications sub-directory when
|
||||
changes happen.
|
||||
|
||||
diff --git a/gio/gdesktopappinfo.c b/gio/gdesktopappinfo.c
|
||||
index f1e2fdd..095c110 100644
|
||||
--- a/gio/gdesktopappinfo.c
|
||||
+++ b/gio/gdesktopappinfo.c
|
||||
@@ -148,6 +148,7 @@ typedef struct
|
||||
gchar *alternatively_watching;
|
||||
gboolean is_config;
|
||||
gboolean is_setup;
|
||||
+ gchar *guix_profile_watch_dir;
|
||||
GFileMonitor *monitor;
|
||||
GHashTable *app_names;
|
||||
GHashTable *mime_tweaks;
|
||||
@@ -180,6 +181,7 @@ desktop_file_dir_unref (DesktopFileDir *dir)
|
||||
{
|
||||
desktop_file_dir_reset (dir);
|
||||
g_free (dir->path);
|
||||
+ g_free (dir->guix_profile_watch_dir);
|
||||
g_free (dir);
|
||||
}
|
||||
}
|
||||
@@ -204,6 +206,13 @@ desktop_file_dir_get_alternative_dir (DesktopFileDir *dir)
|
||||
{
|
||||
gchar *parent;
|
||||
|
||||
+ /* If DIR is a profile, watch the specified directory--e.g.,
|
||||
+ * /var/guix/profiles/per-user/$USER/ for the user profile. Do not watch
|
||||
+ * ~/.guix-profile or /run/current-system/profile because GFileMonitor does
|
||||
+ * not pass IN_DONT_FOLLOW and thus cannot notice any change. */
|
||||
+ if (dir->guix_profile_watch_dir != NULL)
|
||||
+ return g_strdup (dir->guix_profile_watch_dir);
|
||||
+
|
||||
/* If the directory itself exists then we need no alternative. */
|
||||
if (g_access (dir->path, R_OK | X_OK) == 0)
|
||||
return NULL;
|
||||
@@ -249,11 +258,11 @@ desktop_file_dir_changed (GFileMonitor *monitor,
|
||||
*
|
||||
* If this is a notification for a parent directory (because the
|
||||
* desktop directory didn't exist) then we shouldn't fire the signal
|
||||
- * unless something actually changed.
|
||||
+ * unless something actually changed or it's in /var/guix/profiles.
|
||||
*/
|
||||
g_mutex_lock (&desktop_file_dir_lock);
|
||||
|
||||
- if (dir->alternatively_watching)
|
||||
+ if (dir->alternatively_watching && dir->guix_profile_watch_dir == NULL)
|
||||
{
|
||||
gchar *alternative_dir;
|
||||
|
||||
@@ -1555,6 +1564,32 @@ desktop_file_dirs_lock (void)
|
||||
for (i = 0; dirs[i]; i++)
|
||||
g_ptr_array_add (desktop_file_dirs, desktop_file_dir_new (dirs[i]));
|
||||
|
||||
+ {
|
||||
+ /* Monitor the system and user profile under /var/guix/profiles and
|
||||
+ * treat modifications to them as if they were modifications to their
|
||||
+ * /share sub-directory. */
|
||||
+ const gchar *user;
|
||||
+ DesktopFileDir *system_profile_dir, *user_profile_dir;
|
||||
+
|
||||
+ system_profile_dir =
|
||||
+ desktop_file_dir_new ("/var/guix/profiles/system/profile/share");
|
||||
+ system_profile_dir->guix_profile_watch_dir = g_strdup ("/var/guix/profiles");
|
||||
+ g_ptr_array_add (desktop_file_dirs, desktop_file_dir_ref (system_profile_dir));
|
||||
+
|
||||
+ user = g_get_user_name ();
|
||||
+ if (user != NULL)
|
||||
+ {
|
||||
+ gchar *profile_dir, *user_data_dir;
|
||||
+
|
||||
+ profile_dir = g_build_filename ("/var/guix/profiles/per-user", user, NULL);
|
||||
+ user_data_dir = g_build_filename (profile_dir, "guix-profile", "share", NULL);
|
||||
+ user_profile_dir = desktop_file_dir_new (user_data_dir);
|
||||
+ user_profile_dir->guix_profile_watch_dir = profile_dir;
|
||||
+ g_ptr_array_add (desktop_file_dirs, desktop_file_dir_ref (user_profile_dir));
|
||||
+ g_free (user_data_dir);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* The list of directories will never change after this, unless
|
||||
* g_get_user_config_dir() changes due to %G_TEST_OPTION_ISOLATE_DIRS. */
|
||||
desktop_file_dirs_config_dir = user_config_dir;
|
Loading…
Reference in New Issue
Block a user