summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2017-12-12 16:21:24 +0100
committerAtomic Bot <atomic-devel@projectatomic.io>2017-12-14 08:49:23 +0000
commit97683cfbe14c47a82aaac06e547d96c6d52bdc12 (patch)
tree3ec0ee7866c53284a2ee0920e0e6d5fe830be776
parent9aa9825874444b04e173eec2b9c21ba4964a579a (diff)
downloadflatpak-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.c17
-rw-r--r--common/flatpak-dir.c45
-rw-r--r--doc/flatpak-override.xml6
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>