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 ). 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; rdinator-agent command. Change-Id: Ide6dde0e88aa0dc851b6295095f414ca2ddc72ac Reviewed-by: Maxim Cournoyer <maxim.cournoyer@gmail> Andreas Enge 2024-06-06services: guix-build-coordinator: Don't log with timestamps....As the shepherd adds these to the logs. * gnu/services/guix.scm (make-guix-build-coordinator-start-script): Pass #:timestamp-log-output? #f to make-build-coordinator. (guix-build-coordinator-agent-shepherd-services): Add --timestamp-log-output=false to the arguments. Change-Id: I9073ee7b1cefa894d38fdf3831c59de693e087f6 Christopher Baines 2024-06-02Revert "services: home: Use pairs instead of lists."...This reverts commit dbeef44f3c520816251bde74c1005915a637e1ef. Despite the more semantically correct data type, it doesn't follow the style of the most services and also breaks user-facing API. Change-Id: Ib4ef4e9cd2f53ac853a5b7c7c90e57c35c99a5ea Andrew Tropin 2024-06-02services: home: Use pairs instead of lists....* gnu/services/guix.scm: Use pairs instead of lists. * doc/guix.texi: Update accordingly. * gnu/tests/guix.scm: Update accordingly. Change-Id: I0b8d3fa5b214add89bdb84a11fa20d1b319435f0 Andrew Tropin