diff options
author | Alexander Larsson <alexl@redhat.com> | 2017-12-12 16:21:24 +0100 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2017-12-14 08:49:23 +0000 |
commit | 97683cfbe14c47a82aaac06e547d96c6d52bdc12 (patch) | |
tree | 3ec0ee7866c53284a2ee0920e0e6d5fe830be776 | |
parent | 9aa9825874444b04e173eec2b9c21ba4964a579a (diff) | |
download | flatpak-97683cfbe14c47a82aaac06e547d96c6d52bdc12.tar.gz |
override: Support global overrides
This lets you add overrides that affect all applications. Application
overrides have higher priority so will override the global overrides.
Closes: #1245
Approved by: alexlarsson
-rw-r--r-- | app/flatpak-builtins-override.c | 17 | ||||
-rw-r--r-- | common/flatpak-dir.c | 45 | ||||
-rw-r--r-- | doc/flatpak-override.xml | 6 |
3 files changed, 52 insertions, 16 deletions
diff --git a/app/flatpak-builtins-override.c b/app/flatpak-builtins-override.c index 1e24a65c..c971a9db 100644 --- a/app/flatpak-builtins-override.c +++ b/app/flatpak-builtins-override.c @@ -51,7 +51,7 @@ flatpak_builtin_override (int argc, char **argv, GCancellable *cancellable, GErr g_autoptr(FlatpakContext) overrides = NULL; g_autoptr(GError) my_error = NULL; - context = g_option_context_new (_("APP - Override settings for application")); + context = g_option_context_new (_("[APP] - Override settings [for application]")); g_option_context_set_translation_domain (context, GETTEXT_PACKAGE); arg_context = flatpak_context_new (); @@ -64,16 +64,17 @@ flatpak_builtin_override (int argc, char **argv, GCancellable *cancellable, GErr dir = g_ptr_array_index (dirs, 0); - if (argc < 2) - return usage_error (context, _("APP must be specified"), error); - if (argc > 2) return usage_error (context, _("Too many arguments"), error); - app = argv[1]; - - if (!flatpak_is_valid_name (app, &my_error)) - return flatpak_fail (error, _("'%s' is not a valid application name: %s"), app, my_error->message); + if (argc >= 2) + { + app = argv[1]; + if (!flatpak_is_valid_name (app, &my_error)) + return flatpak_fail (error, _("'%s' is not a valid application name: %s"), app, my_error->message); + } + else + app = NULL; metakey = flatpak_load_override_keyfile (app, flatpak_dir_is_user (dir), &my_error); if (metakey == NULL) diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c index d4b4285c..2ac25e6a 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c @@ -149,6 +149,8 @@ struct FlatpakDeploy GKeyFile *metadata; FlatpakContext *system_overrides; FlatpakContext *user_overrides; + FlatpakContext *system_app_overrides; + FlatpakContext *user_app_overrides; }; typedef struct @@ -242,6 +244,8 @@ flatpak_deploy_finalize (GObject *object) g_clear_pointer (&self->metadata, g_key_file_unref); g_clear_pointer (&self->system_overrides, flatpak_context_free); g_clear_pointer (&self->user_overrides, flatpak_context_free); + g_clear_pointer (&self->system_app_overrides, flatpak_context_free); + g_clear_pointer (&self->user_app_overrides, flatpak_context_free); G_OBJECT_CLASS (flatpak_deploy_parent_class)->finalize (object); } @@ -319,9 +323,15 @@ flatpak_deploy_get_overrides (FlatpakDeploy *deploy) if (deploy->system_overrides) flatpak_context_merge (overrides, deploy->system_overrides); + if (deploy->system_app_overrides) + flatpak_context_merge (overrides, deploy->system_app_overrides); + if (deploy->user_overrides) flatpak_context_merge (overrides, deploy->user_overrides); + if (deploy->user_app_overrides) + flatpak_context_merge (overrides, deploy->user_app_overrides); + return overrides; } @@ -1018,7 +1028,11 @@ flatpak_dir_load_override (FlatpakDir *self, char *metadata_contents; override_dir = g_file_get_child (self->basedir, "overrides"); - file = g_file_get_child (override_dir, app_id); + + if (app_id) + file = g_file_get_child (override_dir, app_id); + else + file = g_file_get_child (override_dir, "global"); if (!g_file_load_contents (file, NULL, &metadata_contents, length, NULL, NULL)) @@ -1099,7 +1113,11 @@ flatpak_save_override_keyfile (GKeyFile *metakey, base_dir = flatpak_get_system_default_base_dir_location (); override_dir = g_file_get_child (base_dir, "overrides"); - file = g_file_get_child (override_dir, app_id); + + if (app_id) + file = g_file_get_child (override_dir, app_id); + else + file = g_file_get_child (override_dir, "global"); filename = g_file_get_path (file); parent = g_path_get_dirname (filename); @@ -1153,20 +1171,33 @@ flatpak_dir_load_deployed (FlatpakDir *self, ref_parts = g_strsplit (ref, "/", -1); g_assert (g_strv_length (ref_parts) == 4); - /* Only apps have overrides */ + /* Only load system global overrides for system installed apps */ + if (!self->user) + { + deploy->system_overrides = flatpak_load_override_file (NULL, FALSE, error); + if (deploy->system_overrides == NULL) + return NULL; + } + + /* Always load user global overrides */ + deploy->user_overrides = flatpak_load_override_file (NULL, TRUE, error); + if (deploy->user_overrides == NULL) + return NULL; + + /* Only apps have app overrides */ if (strcmp (ref_parts[0], "app") == 0) { /* Only load system overrides for system installed apps */ if (!self->user) { - deploy->system_overrides = flatpak_load_override_file (ref_parts[1], FALSE, error); - if (deploy->system_overrides == NULL) + deploy->system_app_overrides = flatpak_load_override_file (ref_parts[1], FALSE, error); + if (deploy->system_app_overrides == NULL) return NULL; } /* Always load user overrides */ - deploy->user_overrides = flatpak_load_override_file (ref_parts[1], TRUE, error); - if (deploy->user_overrides == NULL) + deploy->user_app_overrides = flatpak_load_override_file (ref_parts[1], TRUE, error); + if (deploy->user_app_overrides == NULL) return NULL; } diff --git a/doc/flatpak-override.xml b/doc/flatpak-override.xml index 86757b37..b5ce3784 100644 --- a/doc/flatpak-override.xml +++ b/doc/flatpak-override.xml @@ -32,7 +32,7 @@ <cmdsynopsis> <command>flatpak override</command> <arg choice="opt" rep="repeat">OPTION</arg> - <arg choice="plain">APP</arg> + <arg choice="opt">APP</arg> </cmdsynopsis> </refsynopsisdiv> @@ -50,6 +50,10 @@ flatpak run, or every time by using flatpak override. </para> <para> + If the application id is not specified then the overrides affect all applications, + but the per-application overrides can override the global overrides. + </para> + <para> Unless overridden with the --user or --installation options, this command changes the default system-wide installation. </para> |