diff --git a/flatpak-add-support-for-preinstalling-flatpaks.patch b/flatpak-add-support-for-preinstalling-flatpaks.patch index 446bbb7..e1e1314 100644 --- a/flatpak-add-support-for-preinstalling-flatpaks.patch +++ b/flatpak-add-support-for-preinstalling-flatpaks.patch @@ -1,7 +1,7 @@ -From 67165cf06b31da919cfcb9162b7d54704bc5ace4 Mon Sep 17 00:00:00 2001 +From 4d171a522dfef4039adea792f8ff856036f14686 Mon Sep 17 00:00:00 2001 From: Kalev Lember Date: Tue, 16 Apr 2024 12:18:59 +0200 -Subject: [PATCH 1/3] Add initial support for preinstalling flatpaks +Subject: Add initial support for preinstalling flatpaks This adds new FlatpakTransaction API, and a new top level CLI command to preinstall flatpaks, that is to install flatpaks that are considered @@ -13,8 +13,7 @@ installs and removes apps based on the current configuration. A drop-in loupe.preinstall file can look something like this: -[Flatpak Preinstall] -Name=org.gnome.Loupe +[Flatpak Preinstall org.gnome.Loupe] Branch=stable IsRuntime=false @@ -23,31 +22,37 @@ which can be implemented by GUI clients to drive the actual installs on system startup. Resolves: https://github.com/flatpak/flatpak/issues/5579 +Co-authored-by: Sebastian Wick --- - app/flatpak-builtins-preinstall.c | 160 +++++++++++++++ + app/flatpak-builtins-preinstall.c | 156 ++++++++++ app/flatpak-builtins.h | 1 + app/flatpak-main.c | 1 + app/meson.build | 1 + - common/flatpak-dir-private.h | 18 +- - common/flatpak-dir.c | 175 ++++++++++++++++- + common/flatpak-dir-private.h | 23 +- + common/flatpak-dir.c | 406 +++++++++++++++++++++++++- common/flatpak-installation.c | 2 +- - common/flatpak-transaction.c | 166 ++++++++++++++-- + common/flatpak-transaction.c | 187 ++++++++++-- common/flatpak-transaction.h | 3 + doc/flatpak-docs.xml.in | 1 + - doc/flatpak-preinstall.xml | 273 ++++++++++++++++++++++++++ + doc/flatpak-preinstall.xml | 276 +++++++++++++++++ doc/meson.build | 1 + po/POTFILES.in | 1 + system-helper/flatpak-system-helper.c | 5 +- - 14 files changed, 785 insertions(+), 23 deletions(-) + tests/libtest.sh | 1 + + tests/test-basic.sh | 2 +- + tests/test-matrix/meson.build | 1 + + tests/test-preinstall.sh | 226 ++++++++++++++ + 18 files changed, 1264 insertions(+), 30 deletions(-) create mode 100644 app/flatpak-builtins-preinstall.c create mode 100644 doc/flatpak-preinstall.xml + create mode 100755 tests/test-preinstall.sh diff --git a/app/flatpak-builtins-preinstall.c b/app/flatpak-builtins-preinstall.c new file mode 100644 -index 0000000..4ac6c4d +index 00000000..3d52cb8b --- /dev/null +++ b/app/flatpak-builtins-preinstall.c -@@ -0,0 +1,160 @@ +@@ -0,0 +1,156 @@ +/* vi:set et sw=2 sts=2 cin cino=t0,f0,(0,{s,>2s,n-s,^-s,e-s: + * Copyright © 2024 Red Hat, Inc + * @@ -141,9 +146,6 @@ index 0000000..4ac6c4d + if (opt_noninteractive) + opt_yes = TRUE; /* Implied */ + -+ if (!opt_noninteractive) -+ g_print (_("Syncing preinstalled flatpaks…\n")); -+ + if (opt_noninteractive) + transaction = flatpak_quiet_transaction_new (dir, error); + else @@ -168,7 +170,6 @@ index 0000000..4ac6c4d + + if (flatpak_transaction_is_empty (transaction)) + { -+ g_print ("\n"); + g_print (_("Nothing to do.\n")); + + return TRUE; @@ -209,7 +210,7 @@ index 0000000..4ac6c4d + return TRUE; +} diff --git a/app/flatpak-builtins.h b/app/flatpak-builtins.h -index 32a9c95..20eb227 100644 +index 32a9c952..20eb2272 100644 --- a/app/flatpak-builtins.h +++ b/app/flatpak-builtins.h @@ -127,6 +127,7 @@ BUILTINPROTO (repair) @@ -221,7 +222,7 @@ index 32a9c95..20eb227 100644 #undef BUILTINPROTO diff --git a/app/flatpak-main.c b/app/flatpak-main.c -index 4549889..d5794d9 100644 +index 45498895..d5794d99 100644 --- a/app/flatpak-main.c +++ b/app/flatpak-main.c @@ -89,6 +89,7 @@ static FlatpakCommand commands[] = { @@ -233,7 +234,7 @@ index 4549889..d5794d9 100644 /* translators: please keep the leading newline and space */ { N_("\n Find applications and runtimes") }, diff --git a/app/meson.build b/app/meson.build -index 258d582..8e6ef1d 100644 +index 258d582a..8e6ef1dd 100644 --- a/app/meson.build +++ b/app/meson.build @@ -100,6 +100,7 @@ sources = [ @@ -245,10 +246,10 @@ index 258d582..8e6ef1d 100644 'flatpak-builtins-remote-add.c', 'flatpak-builtins-remote-delete.c', diff --git a/common/flatpak-dir-private.h b/common/flatpak-dir-private.h -index 871f40b..a10a202 100644 +index ffcff5ff..2c75890c 100644 --- a/common/flatpak-dir-private.h +++ b/common/flatpak-dir-private.h -@@ -180,6 +180,7 @@ typedef enum { +@@ -187,6 +187,7 @@ typedef enum { FLATPAK_HELPER_DEPLOY_FLAGS_APP_HINT = 1 << 5, FLATPAK_HELPER_DEPLOY_FLAGS_INSTALL_HINT = 1 << 6, FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE_PINNED = 1 << 7, @@ -256,7 +257,7 @@ index 871f40b..a10a202 100644 } FlatpakHelperDeployFlags; #define FLATPAK_HELPER_DEPLOY_FLAGS_ALL (FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE | \ -@@ -189,18 +190,21 @@ typedef enum { +@@ -196,18 +197,21 @@ typedef enum { FLATPAK_HELPER_DEPLOY_FLAGS_NO_INTERACTION | \ FLATPAK_HELPER_DEPLOY_FLAGS_APP_HINT | \ FLATPAK_HELPER_DEPLOY_FLAGS_INSTALL_HINT | \ @@ -280,22 +281,27 @@ index 871f40b..a10a202 100644 typedef enum { FLATPAK_HELPER_CONFIGURE_REMOTE_FLAGS_NONE = 0, -@@ -364,6 +368,14 @@ gboolean flatpak_remove_override_keyfile (const char *app_id, +@@ -371,6 +375,19 @@ gboolean flatpak_remove_override_keyfile (const char *app_id, gboolean user, GError **error); -+char ** flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, -+ GError **error); -+gboolean flatpak_parse_preinstall_config_file (const char *file_path, -+ const char *default_arch, -+ FlatpakDecomposed **ref_out, -+ char **collection_id_out, -+ GError **error); ++typedef struct ++{ ++ FlatpakDecomposed *ref; ++ char *collection_id; ++} FlatpakPreinstallConfig; ++ ++GPtrArray * flatpak_get_preinstall_config (const char *default_arch, ++ GCancellable *cancellable, ++ GError **error); ++gboolean flatpak_dir_uninitialized_mark_preinstalled (FlatpakDir *self, ++ const GPtrArray *preinstall_config, ++ GError **error); + int flatpak_deploy_data_get_version (GBytes *deploy_data); const char * flatpak_deploy_data_get_origin (GBytes *deploy_data); const char * flatpak_deploy_data_get_commit (GBytes *deploy_data); -@@ -679,6 +691,7 @@ gboolean flatpak_dir_deploy_install (Fla +@@ -687,6 +704,7 @@ gboolean flatpak_dir_deploy_install (Fla const char **previous_ids, gboolean reinstall, gboolean pin_on_deploy, @@ -303,7 +309,7 @@ index 871f40b..a10a202 100644 GCancellable *cancellable, GError **error); gboolean flatpak_dir_install (FlatpakDir *self, -@@ -688,6 +701,7 @@ gboolean flatpak_dir_install (Fla +@@ -696,6 +714,7 @@ gboolean flatpak_dir_install (Fla gboolean reinstall, gboolean app_hint, gboolean pin_on_deploy, @@ -312,178 +318,409 @@ index 871f40b..a10a202 100644 FlatpakDecomposed *ref, const char *opt_commit, diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index 6936d45..295f610 100644 +index 1c304525..6300f3cc 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c -@@ -84,6 +84,15 @@ +@@ -86,6 +86,16 @@ #define FLATPAK_REMOTES_DIR "remotes.d" #define FLATPAK_REMOTES_FILE_EXT ".flatpakrepo" +#define FLATPAK_PREINSTALL_DIR "preinstall.d" +#define FLATPAK_PREINSTALL_FILE_EXT ".preinstall" + -+#define FLATPAK_PREINSTALL_GROUP "Flatpak Preinstall" ++#define FLATPAK_PREINSTALL_GROUP_PREFIX "Flatpak Preinstall " +#define FLATPAK_PREINSTALL_IS_RUNTIME_KEY "IsRuntime" +#define FLATPAK_PREINSTALL_NAME_KEY "Name" +#define FLATPAK_PREINSTALL_BRANCH_KEY "Branch" +#define FLATPAK_PREINSTALL_COLLECTION_ID_KEY "CollectionID" ++#define FLATPAK_PREINSTALL_INSTALL_KEY "Install" + #define SIDELOAD_REPOS_DIR_NAME "sideload-repos" #define FLATPAK_TRIGGERS_DIR "triggers" -@@ -1899,6 +1908,151 @@ get_system_locations (GCancellable *cancellable, +@@ -2043,6 +2053,381 @@ get_system_locations (GCancellable *cancellable, return g_steal_pointer (&locations); } -+char ** -+flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, -+ GError **error) ++typedef struct ++{ ++ char *name; ++ char *branch; ++ gboolean is_runtime; ++ char *collection_id; ++ gboolean install; ++} PreinstallConfig; ++ ++static PreinstallConfig * ++preinstall_config_new (const char *name) ++{ ++ PreinstallConfig *config = g_new0 (PreinstallConfig, 1); ++ ++ config->name = g_strdup (name); ++ config->branch = g_strdup ("master"); ++ config->install = TRUE; ++ ++ return config; ++} ++ ++static void ++preinstall_config_free (PreinstallConfig *config) ++{ ++ g_clear_pointer (&config->name, g_free); ++ g_clear_pointer (&config->branch, g_free); ++ g_clear_pointer (&config->collection_id, g_free); ++ g_free (config); ++} ++ ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (PreinstallConfig, preinstall_config_free) ++ ++static void ++flatpak_preinstall_config_free (FlatpakPreinstallConfig *preinstall) ++{ ++ g_clear_pointer (&preinstall->ref, flatpak_decomposed_unref); ++ g_clear_pointer (&preinstall->collection_id, g_free); ++ g_free (preinstall); ++} ++ ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (FlatpakPreinstallConfig, flatpak_preinstall_config_free) ++ ++static void ++flatpak_parse_preinstall_config_file (GKeyFile *keyfile, ++ GHashTable *configs) ++{ ++ g_auto(GStrv) groups = NULL; ++ ++ groups = g_key_file_get_groups (keyfile, NULL); ++ ++ for (int i = 0; groups[i] != NULL; i++) ++ { ++ const char *group_name = groups[i]; ++ const char *name; ++ g_autoptr(PreinstallConfig) config = NULL; ++ g_autoptr(GError) local_error = NULL; ++ g_autofree char *owned_name = NULL; ++ g_autofree char *branch = NULL; ++ gboolean is_runtime = FALSE; ++ g_autofree char *collection_id = NULL; ++ gboolean install = TRUE; ++ ++ if (!g_str_has_prefix (group_name, FLATPAK_PREINSTALL_GROUP_PREFIX) || ++ *(group_name + strlen (FLATPAK_PREINSTALL_GROUP_PREFIX)) == '\0') ++ { ++ g_info ("Skipping unknown group %s", group_name); ++ continue; ++ } ++ ++ name = group_name + strlen (FLATPAK_PREINSTALL_GROUP_PREFIX); ++ ++ if (!g_hash_table_steal_extended (configs, name, ++ (gpointer *)&owned_name, ++ (gpointer *)&config)) ++ { ++ config = preinstall_config_new (name); ++ owned_name = g_strdup (name); ++ } ++ ++ branch = g_key_file_get_string (keyfile, ++ group_name, ++ FLATPAK_PREINSTALL_BRANCH_KEY, ++ NULL); ++ if (branch) ++ { ++ g_clear_pointer (&config->branch, g_free); ++ if (*branch != '\0') ++ config->branch = g_steal_pointer (&branch); ++ } ++ ++ is_runtime = g_key_file_get_boolean (keyfile, ++ group_name, ++ FLATPAK_PREINSTALL_IS_RUNTIME_KEY, ++ &local_error); ++ if (!local_error) ++ { ++ config->is_runtime = is_runtime; ++ } ++ else if (!g_error_matches (local_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) ++ { ++ g_info ("Invalid file format, %s is not a boolean", ++ FLATPAK_PREINSTALL_IS_RUNTIME_KEY); ++ continue; ++ } ++ g_clear_error (&local_error); ++ ++ collection_id = g_key_file_get_string (keyfile, ++ group_name, ++ FLATPAK_PREINSTALL_COLLECTION_ID_KEY, ++ NULL); ++ if (collection_id) ++ { ++ g_clear_pointer (&config->collection_id, g_free); ++ if (*collection_id != '\0') ++ config->collection_id = g_steal_pointer (&collection_id); ++ } ++ ++ install = g_key_file_get_boolean (keyfile, ++ group_name, ++ FLATPAK_PREINSTALL_INSTALL_KEY, ++ &local_error); ++ if (!local_error) ++ { ++ config->install = install; ++ } ++ else if (!g_error_matches (local_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) ++ { ++ g_info ("Invalid file format, %s is not a boolean", ++ FLATPAK_PREINSTALL_INSTALL_KEY); ++ continue; ++ } ++ g_clear_error (&local_error); ++ ++ g_hash_table_insert (configs, ++ g_steal_pointer (&owned_name), ++ g_steal_pointer (&config)); ++ } ++} ++ ++typedef struct ++{ ++ char *name; ++ GFile *file; ++} PreinstallConfigFile; ++ ++static gint ++preinstall_config_file_sort (gconstpointer a, ++ gconstpointer b) ++{ ++ const PreinstallConfigFile *ca = a; ++ const PreinstallConfigFile *cb = b; ++ ++ return g_strcmp0 (ca->name, cb->name); ++} ++ ++static void ++preinstall_config_file_free (PreinstallConfigFile *preinstall_config_file) ++{ ++ g_clear_pointer (&preinstall_config_file->name, g_free); ++ g_clear_object (&preinstall_config_file->file); ++ g_free (preinstall_config_file); ++} ++ ++G_DEFINE_AUTOPTR_CLEANUP_FUNC (PreinstallConfigFile, preinstall_config_file_free); ++ ++static gboolean ++scan_preinstall_config_files (const char *config_dir, ++ GHashTable *configs, ++ GCancellable *cancellable, ++ GError **error) +{ -+ g_autoptr(GPtrArray) paths = NULL; + g_autoptr(GFile) conf_dir = NULL; + g_autoptr(GFileEnumerator) dir_enum = NULL; -+ g_autoptr(GError) my_error = NULL; -+ g_autofree char *config_dir = NULL; -+ -+ paths = g_ptr_array_new_with_free_func (g_free); -+ config_dir = g_strdup_printf ("%s/%s", -+ get_config_dir_location (), -+ FLATPAK_PREINSTALL_DIR); ++ g_autoptr(GPtrArray) config_files = NULL; ++ g_autoptr(GError) local_error = NULL; + + if (!g_file_test (config_dir, G_FILE_TEST_IS_DIR)) + { + g_info ("Skipping missing preinstall config directory %s", config_dir); -+ goto out; ++ return TRUE; + } + + conf_dir = g_file_new_for_path (config_dir); + dir_enum = g_file_enumerate_children (conf_dir, + G_FILE_ATTRIBUTE_STANDARD_NAME "," G_FILE_ATTRIBUTE_STANDARD_TYPE, + G_FILE_QUERY_INFO_NONE, -+ cancellable, &my_error); -+ if (my_error != NULL) ++ cancellable, ++ &local_error); ++ if (local_error != NULL) + { + g_info ("Unexpected error retrieving preinstalls from %s: %s", -+ config_dir, my_error->message); -+ g_propagate_error (error, g_steal_pointer (&my_error)); -+ return NULL; ++ config_dir, ++ local_error->message); ++ ++ g_propagate_error (error, g_steal_pointer (&local_error)); ++ return FALSE; + } + ++ config_files = g_ptr_array_new_with_free_func ((GDestroyNotify)preinstall_config_file_free); ++ + while (TRUE) + { + GFileInfo *file_info; + GFile *path; + const char *name; + guint32 type; ++ g_autoptr(PreinstallConfigFile) config_file = NULL; + -+ if (!g_file_enumerator_iterate (dir_enum, &file_info, &path, -+ cancellable, &my_error)) ++ if (!g_file_enumerator_iterate (dir_enum, ++ &file_info, ++ &path, ++ cancellable, ++ &local_error)) + { + g_info ("Unexpected error reading file in %s: %s", -+ config_dir, my_error->message); -+ g_propagate_error (error, g_steal_pointer (&my_error)); -+ return NULL; ++ config_dir, ++ local_error->message); ++ ++ g_propagate_error (error, g_steal_pointer (&local_error)); ++ return FALSE; + } + + if (file_info == NULL) + break; + -+ name = g_file_info_get_attribute_byte_string (file_info, "standard::name"); -+ type = g_file_info_get_attribute_uint32 (file_info, "standard::type"); ++ name = g_file_info_get_name (file_info); ++ type = g_file_info_get_file_type (file_info); + -+ if (type == G_FILE_TYPE_REGULAR && g_str_has_suffix (name, FLATPAK_PREINSTALL_FILE_EXT)) -+ { -+ g_autofree char *path_str = g_file_get_path (path); -+ g_ptr_array_add (paths, g_steal_pointer (&path_str)); -+ } ++ if (type != G_FILE_TYPE_REGULAR || ++ !g_str_has_suffix (name, FLATPAK_PREINSTALL_FILE_EXT)) ++ continue; ++ ++ config_file = g_new0 (PreinstallConfigFile, 1); ++ config_file->name = g_strdup (name); ++ config_file->file = g_object_ref (path); ++ g_ptr_array_add (config_files, g_steal_pointer (&config_file)); + } + -+out: -+ g_ptr_array_add (paths, NULL); -+ return (char **) g_ptr_array_free (g_steal_pointer (&paths), FALSE); -+} ++ g_ptr_array_sort (config_files, preinstall_config_file_sort); + -+static gboolean -+parse_preinstall_keyfile (GKeyFile *keyfile, -+ char **name_out, -+ char **branch_out, -+ gboolean *is_runtime_out, -+ char **collection_id_out, -+ GError **error) -+{ -+ g_autofree char *name = NULL; -+ g_autofree char *branch = NULL; -+ gboolean is_runtime = FALSE; -+ g_autofree char *collection_id = NULL; ++ for (int i = 0; i < config_files->len; i++) ++ { ++ PreinstallConfigFile *config_file = g_ptr_array_index (config_files, i); ++ g_autofree char *path = NULL; ++ g_autoptr(GKeyFile) keyfile = NULL; ++ g_autoptr(GError) load_error = NULL; + -+ *name_out = NULL; -+ *branch_out = NULL; -+ *is_runtime_out = FALSE; -+ *collection_id_out = NULL; ++ path = g_file_get_path (config_file->file); + -+ if (!g_key_file_has_group (keyfile, FLATPAK_PREINSTALL_GROUP)) -+ return flatpak_fail_error (error, FLATPAK_ERROR_INVALID_DATA, _("Invalid file format, no %s group"), FLATPAK_PREINSTALL_GROUP); ++ g_info ("Parsing config file %s", path); + -+ name = g_key_file_get_string (keyfile, FLATPAK_PREINSTALL_GROUP, -+ FLATPAK_PREINSTALL_NAME_KEY, NULL); -+ if (name == NULL) -+ return flatpak_fail_error (error, FLATPAK_ERROR_INVALID_DATA, _("Invalid file format, no %s specified"), FLATPAK_PREINSTALL_NAME_KEY); ++ keyfile = g_key_file_new (); + -+ branch = g_key_file_get_string (keyfile, FLATPAK_PREINSTALL_GROUP, -+ FLATPAK_PREINSTALL_BRANCH_KEY, NULL); -+ if (branch == NULL) -+ branch = g_strdup ("master"); ++ if (!g_key_file_load_from_file (keyfile, path, G_KEY_FILE_NONE, &load_error)) ++ g_info ("Parsing config file %s failed: %s", path, load_error->message); + -+ is_runtime = g_key_file_get_boolean (keyfile, FLATPAK_PREINSTALL_GROUP, -+ FLATPAK_PREINSTALL_IS_RUNTIME_KEY, NULL); -+ -+ collection_id = flatpak_keyfile_get_string_non_empty (keyfile, FLATPAK_PREINSTALL_GROUP, -+ FLATPAK_PREINSTALL_COLLECTION_ID_KEY); -+ -+ *name_out = g_steal_pointer (&name); -+ *branch_out = g_steal_pointer (&branch); -+ *is_runtime_out = is_runtime; -+ *collection_id_out = g_steal_pointer (&collection_id); ++ flatpak_parse_preinstall_config_file (keyfile, configs); ++ } + + return TRUE; +} + -+gboolean -+flatpak_parse_preinstall_config_file (const char *file_path, -+ const char *default_arch, -+ FlatpakDecomposed **ref_out, -+ char **collection_id_out, -+ GError **error) ++GPtrArray * ++flatpak_get_preinstall_config (const char *default_arch, ++ GCancellable *cancellable, ++ GError **error) +{ -+ g_autofree char *name = NULL; -+ g_autofree char *branch = NULL; -+ gboolean is_runtime = FALSE; -+ g_autofree char *collection_id = NULL; -+ g_autoptr(FlatpakDecomposed) ref = NULL; -+ g_autoptr(GKeyFile) keyfile = NULL; ++ g_autoptr(GHashTable) configs = NULL; ++ g_autoptr(GPtrArray) preinstalls = NULL; ++ g_autofree char *config_dir = NULL; ++ g_autofree char *data_dir = NULL; ++ GHashTableIter iter; ++ PreinstallConfig *config; + -+ keyfile = g_key_file_new (); ++ configs = g_hash_table_new_full (g_str_hash, g_str_equal, ++ g_free, (GDestroyNotify)preinstall_config_free); + -+ if (!g_key_file_load_from_file (keyfile, file_path, G_KEY_FILE_NONE, error)) -+ return FALSE; ++ /* scan directories in reverse priority order */ ++ data_dir = g_build_filename (get_data_dir_location (), FLATPAK_PREINSTALL_DIR, NULL); ++ if (!scan_preinstall_config_files (data_dir, configs, cancellable, error)) ++ return NULL; + -+ if (!parse_preinstall_keyfile (keyfile, &name, &branch, &is_runtime, &collection_id, error)) -+ return FALSE; ++ config_dir = g_build_filename (get_config_dir_location (), FLATPAK_PREINSTALL_DIR, NULL); ++ if (!scan_preinstall_config_files (config_dir, configs, cancellable, error)) ++ return NULL; + -+ ref = flatpak_decomposed_new_from_parts (is_runtime ? FLATPAK_KINDS_RUNTIME : FLATPAK_KINDS_APP, -+ name, default_arch, branch, error); -+ if (ref == NULL) -+ return FALSE; ++ preinstalls = g_ptr_array_new_with_free_func ((GDestroyNotify)flatpak_preinstall_config_free); ++ ++ g_hash_table_iter_init (&iter, configs); ++ while (g_hash_table_iter_next (&iter, NULL, (gpointer *)&config)) ++ { ++ g_autoptr(FlatpakPreinstallConfig) preinstall = NULL; ++ g_autoptr(FlatpakDecomposed) ref = NULL; ++ g_autoptr(GError) local_error = NULL; ++ ++ if (!config->install) ++ { ++ g_info ("Skipping preinstall of %s because it is configured to not install", ++ config->name); ++ continue; ++ } ++ ++ ref = flatpak_decomposed_new_from_parts (config->is_runtime ? ++ FLATPAK_KINDS_RUNTIME : ++ FLATPAK_KINDS_APP, ++ config->name, ++ default_arch, ++ config->branch, ++ &local_error); ++ if (ref == NULL) ++ { ++ g_info ("Skipping preinstall of %s because of problems in the configuration: %s", ++ config->name, ++ local_error->message); ++ continue; ++ } ++ ++ preinstall = g_new0 (FlatpakPreinstallConfig, 1); ++ preinstall->ref = g_steal_pointer (&ref); ++ preinstall->collection_id = g_strdup (config->collection_id); ++ ++ g_info ("Found preinstall ref %s", ++ flatpak_decomposed_get_ref (preinstall->ref)); ++ ++ g_ptr_array_add (preinstalls, g_steal_pointer (&preinstall)); ++ } ++ ++ return g_steal_pointer (&preinstalls); ++} ++ ++gboolean ++flatpak_dir_uninitialized_mark_preinstalled (FlatpakDir *self, ++ const GPtrArray *preinstall_config, ++ GError **error) ++{ ++ const char *existing_preinstalls; ++ g_autoptr(GError) local_error = NULL; ++ ++ existing_preinstalls = flatpak_dir_get_config (self, ++ "preinstalled", ++ &local_error); ++ ++ if (existing_preinstalls != NULL) ++ return TRUE; ++ ++ if (!g_error_matches (local_error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_KEY_NOT_FOUND)) ++ { ++ g_propagate_error (error, g_steal_pointer (&local_error)); ++ return FALSE; ++ } ++ ++ g_clear_error (&local_error); ++ ++ for (int i = 0; i < preinstall_config->len; i++) ++ { ++ const FlatpakPreinstallConfig *config = g_ptr_array_index (preinstall_config, i); ++ GError **append_error = local_error == NULL ? &local_error : NULL; ++ ++ flatpak_dir_config_append_pattern (self, ++ "preinstalled", ++ flatpak_decomposed_get_ref (config->ref), ++ FALSE, ++ NULL, ++ append_error); ++ } ++ ++ if (local_error) ++ { ++ g_propagate_error (error, g_steal_pointer (&local_error)); ++ return FALSE; ++ } + -+ *ref_out = g_steal_pointer (&ref); -+ *collection_id_out = g_steal_pointer (&collection_id); + return TRUE; +} + GPtrArray * flatpak_get_system_base_dir_locations (GCancellable *cancellable, GError **error) -@@ -9168,6 +9322,7 @@ flatpak_dir_deploy_install (FlatpakDir *self, +@@ -9255,6 +9640,7 @@ flatpak_dir_deploy_install (FlatpakDir *self, const char **previous_ids, gboolean reinstall, gboolean pin_on_deploy, @@ -491,7 +728,7 @@ index 6936d45..295f610 100644 GCancellable *cancellable, GError **error) { -@@ -9273,6 +9428,14 @@ flatpak_dir_deploy_install (FlatpakDir *self, +@@ -9360,6 +9746,14 @@ flatpak_dir_deploy_install (FlatpakDir *self, TRUE, NULL, error)) goto out; @@ -506,7 +743,7 @@ index 6936d45..295f610 100644 ret = TRUE; commit = flatpak_dir_read_active (self, ref, cancellable); -@@ -9873,6 +10036,7 @@ flatpak_dir_install (FlatpakDir *self, +@@ -9960,6 +10354,7 @@ flatpak_dir_install (FlatpakDir *self, gboolean reinstall, gboolean app_hint, gboolean pin_on_deploy, @@ -514,7 +751,7 @@ index 6936d45..295f610 100644 FlatpakRemoteState *state, FlatpakDecomposed *ref, const char *opt_commit, -@@ -10085,6 +10249,9 @@ flatpak_dir_install (FlatpakDir *self, +@@ -10174,6 +10569,9 @@ flatpak_dir_install (FlatpakDir *self, if (pin_on_deploy) helper_flags |= FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE_PINNED; @@ -524,7 +761,7 @@ index 6936d45..295f610 100644 helper_flags |= FLATPAK_HELPER_DEPLOY_FLAGS_INSTALL_HINT; if (!flatpak_dir_system_helper_call_deploy (self, -@@ -10122,6 +10289,7 @@ flatpak_dir_install (FlatpakDir *self, +@@ -10212,6 +10610,7 @@ flatpak_dir_install (FlatpakDir *self, { if (!flatpak_dir_deploy_install (self, ref, state->remote_name, opt_subpaths, opt_previous_ids, reinstall, pin_on_deploy, @@ -532,7 +769,7 @@ index 6936d45..295f610 100644 cancellable, error)) return FALSE; -@@ -10412,7 +10580,7 @@ flatpak_dir_install_bundle (FlatpakDir *self, +@@ -10502,7 +10901,7 @@ flatpak_dir_install_bundle (FlatpakDir *self, } else { @@ -541,7 +778,7 @@ index 6936d45..295f610 100644 return FALSE; } -@@ -10842,6 +11010,7 @@ flatpak_dir_uninstall (FlatpakDir *self, +@@ -10933,6 +11332,7 @@ flatpak_dir_uninstall (FlatpakDir *self, g_autoptr(GBytes) deploy_data = NULL; gboolean keep_ref = flags & FLATPAK_HELPER_UNINSTALL_FLAGS_KEEP_REF; gboolean force_remove = flags & FLATPAK_HELPER_UNINSTALL_FLAGS_FORCE_REMOVE; @@ -549,7 +786,7 @@ index 6936d45..295f610 100644 name = flatpak_decomposed_dup_id (ref); -@@ -10948,6 +11117,10 @@ flatpak_dir_uninstall (FlatpakDir *self, +@@ -11039,6 +11439,10 @@ flatpak_dir_uninstall (FlatpakDir *self, if (!flatpak_dir_mark_changed (self, error)) return FALSE; @@ -561,7 +798,7 @@ index 6936d45..295f610 100644 { const char *branch = flatpak_decomposed_get_branch (ref); diff --git a/common/flatpak-installation.c b/common/flatpak-installation.c -index c7d2e1d..38d4e8d 100644 +index 3a8677e8..be706174 100644 --- a/common/flatpak-installation.c +++ b/common/flatpak-installation.c @@ -1929,7 +1929,7 @@ flatpak_installation_install_full (FlatpakInstallation *self, @@ -570,14 +807,14 @@ index c7d2e1d..38d4e8d 100644 (flags & FLATPAK_INSTALL_FLAGS_NO_STATIC_DELTAS) != 0, - FALSE, FALSE, FALSE, state, + FALSE, FALSE, FALSE, FALSE, state, - ref, NULL, (const char **) subpaths, NULL, NULL, NULL, NULL, + ref, NULL, (const char **) subpaths, NULL, NULL, NULL, NULL, NULL, progress, cancellable, error)) return NULL; diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c -index 7339aca..e4de909 100644 +index b498e4d4..22b7ad8c 100644 --- a/common/flatpak-transaction.c +++ b/common/flatpak-transaction.c -@@ -111,6 +111,7 @@ struct _FlatpakTransactionOperation +@@ -116,6 +116,7 @@ struct _FlatpakTransactionOperation gboolean skip; gboolean update_only_deploy; gboolean pin_on_deploy; @@ -585,7 +822,7 @@ index 7339aca..e4de909 100644 gboolean resolved; char *resolved_commit; -@@ -650,7 +651,8 @@ flatpak_transaction_operation_new (const char *remote, +@@ -701,7 +702,8 @@ flatpak_transaction_operation_new (const char *remote, const char *commit, GFile *bundle, FlatpakTransactionOperationType kind, @@ -595,7 +832,7 @@ index 7339aca..e4de909 100644 { FlatpakTransactionOperation *self; -@@ -665,6 +667,7 @@ flatpak_transaction_operation_new (const char *remote, +@@ -716,6 +718,7 @@ flatpak_transaction_operation_new (const char *remote, self->bundle = g_object_ref (bundle); self->kind = kind; self->pin_on_deploy = pin_on_deploy; @@ -603,7 +840,7 @@ index 7339aca..e4de909 100644 return self; } -@@ -2115,7 +2118,8 @@ flatpak_transaction_add_op (FlatpakTransaction *self, +@@ -2176,7 +2179,8 @@ flatpak_transaction_add_op (FlatpakTransaction *self, const char *commit, GFile *bundle, FlatpakTransactionOperationType kind, @@ -613,7 +850,7 @@ index 7339aca..e4de909 100644 { FlatpakTransactionPrivate *priv = flatpak_transaction_get_instance_private (self); FlatpakTransactionOperation *op; -@@ -2145,7 +2149,8 @@ flatpak_transaction_add_op (FlatpakTransaction *self, +@@ -2206,7 +2210,8 @@ flatpak_transaction_add_op (FlatpakTransaction *self, } op = flatpak_transaction_operation_new (remote, ref, subpaths, previous_ids, @@ -623,7 +860,7 @@ index 7339aca..e4de909 100644 g_hash_table_insert (priv->last_op_for_ref, flatpak_decomposed_ref (ref), op); priv->ops = g_list_prepend (priv->ops, op); -@@ -2253,7 +2258,7 @@ add_related (FlatpakTransaction *self, +@@ -2314,7 +2319,7 @@ add_related (FlatpakTransaction *self, related_op = flatpak_transaction_add_op (self, rel->remote, rel->ref, NULL, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, @@ -632,7 +869,7 @@ index 7339aca..e4de909 100644 related_op->non_fatal = TRUE; related_op->fail_if_op_fails = op; flatpak_transaction_operation_add_related_to_op (related_op, op); -@@ -2282,7 +2287,7 @@ add_related (FlatpakTransaction *self, +@@ -2343,7 +2348,7 @@ add_related (FlatpakTransaction *self, (const char **) rel->subpaths, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, @@ -641,7 +878,7 @@ index 7339aca..e4de909 100644 related_op->non_fatal = TRUE; related_op->fail_if_op_fails = op; flatpak_transaction_operation_add_related_to_op (related_op, op); -@@ -2513,7 +2518,7 @@ add_new_dep_op (FlatpakTransaction *self, +@@ -2574,7 +2579,7 @@ add_new_dep_op (FlatpakTransaction *self, return FALSE; *dep_op = flatpak_transaction_add_op (self, dep_remote, dep_ref, NULL, NULL, NULL, NULL, @@ -650,7 +887,7 @@ index 7339aca..e4de909 100644 } else { -@@ -2523,7 +2528,7 @@ add_new_dep_op (FlatpakTransaction *self, +@@ -2584,7 +2589,7 @@ add_new_dep_op (FlatpakTransaction *self, g_info ("Updating dependency %s of %s", flatpak_decomposed_get_pref (dep_ref), flatpak_decomposed_get_pref (op->ref)); *dep_op = flatpak_transaction_add_op (self, dep_remote, dep_ref, NULL, NULL, NULL, NULL, @@ -659,15 +896,15 @@ index 7339aca..e4de909 100644 (*dep_op)->non_fatal = TRUE; } } -@@ -2618,6 +2623,7 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, - GFile *bundle, +@@ -2680,6 +2685,7 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, + FlatpakImageSource *image_source, const char *external_metadata, gboolean pin_on_deploy, + gboolean update_preinstalled_on_deploy, FlatpakTransactionOperation **out_op, GError **error) { -@@ -2741,7 +2747,8 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, +@@ -2803,7 +2809,8 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, } op = flatpak_transaction_add_op (self, remote, ref, subpaths, previous_ids, @@ -675,42 +912,59 @@ index 7339aca..e4de909 100644 + commit, bundle, kind, pin_on_deploy, + update_preinstalled_on_deploy); - if (external_metadata) - op->external_metadata = g_bytes_new (external_metadata, strlen (external_metadata)); -@@ -2796,7 +2803,7 @@ flatpak_transaction_add_install (FlatpakTransaction *self, + if (image_source) + op->image_source = g_object_ref (image_source); +@@ -2861,7 +2868,7 @@ flatpak_transaction_add_install (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, decomposed, subpaths, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL, -- NULL, NULL, pin_on_deploy, NULL, error)) -+ NULL, NULL, pin_on_deploy, FALSE, NULL, error)) +- NULL, NULL, NULL, pin_on_deploy, NULL, error)) ++ NULL, NULL, NULL, pin_on_deploy, FALSE, NULL, error)) return FALSE; return TRUE; -@@ -2856,7 +2863,7 @@ flatpak_transaction_add_rebase (FlatpakTransaction *self, +@@ -2921,7 +2928,9 @@ flatpak_transaction_add_rebase (FlatpakTransaction *self, if (dir_ref_is_installed (priv->dir, decomposed, &installed_origin, NULL)) remote = installed_origin; -- return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, FALSE, NULL, error); -+ return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, FALSE, FALSE, NULL, error); +- return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, NULL, FALSE, NULL, error); ++ return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, ++ FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, ++ NULL, NULL, NULL, FALSE, FALSE, NULL, error); } /** -@@ -2932,12 +2939,12 @@ flatpak_transaction_add_rebase_and_uninstall (FlatpakTransaction *self, +@@ -2997,25 +3006,22 @@ flatpak_transaction_add_rebase_and_uninstall (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, new_decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, -- NULL, NULL, FALSE, &rebase_op, error)) -+ NULL, NULL, FALSE, FALSE, &rebase_op, error)) +- NULL, NULL, NULL, FALSE, &rebase_op, error)) ++ NULL, NULL, NULL, FALSE, FALSE, &rebase_op, error)) return FALSE; if (!flatpak_transaction_add_ref (self, NULL, old_decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, -- NULL, NULL, FALSE, &uninstall_op, &local_error)) -+ NULL, NULL, FALSE, FALSE, &uninstall_op, &local_error)) +- NULL, NULL, NULL, FALSE, &uninstall_op, &local_error)) ++ NULL, NULL, NULL, FALSE, FALSE, &uninstall_op, &local_error)) { /* If the user is trying to install an eol-rebased app from scratch, the * @old_ref can’t be uninstalled because it’s not installed already. -@@ -3024,6 +3031,125 @@ flatpak_transaction_add_install_flatpakref (FlatpakTransaction *self, + * Silently ignore that. */ +- if (g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) +- { +- g_clear_error (&local_error); +- } +- else ++ if (!g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) + { + g_propagate_error (error, g_steal_pointer (&local_error)); + return FALSE; + } ++ g_clear_error (&local_error); + } + + /* Link the ops together so that the install/update is done first, and if +@@ -3119,6 +3125,134 @@ flatpak_transaction_add_install_flatpakref (FlatpakTransaction *self, return TRUE; } @@ -733,7 +987,7 @@ index 7339aca..e4de909 100644 + g_autoptr(GPtrArray) install_refs = g_ptr_array_new_with_free_func (g_free); + g_autoptr(GPtrArray) preinstalled_refs = NULL; + g_auto(GStrv) remotes = NULL; -+ g_auto(GStrv) preinstall_paths = NULL; ++ g_autoptr(GPtrArray) configs = NULL; + + remotes = flatpak_dir_list_remotes (priv->dir, NULL, error); + if (remotes == NULL) @@ -741,32 +995,34 @@ index 7339aca..e4de909 100644 + + preinstalled_refs = flatpak_dir_get_config_patterns (priv->dir, "preinstalled"); + -+ preinstall_paths = flatpak_get_preinstall_config_file_paths (NULL, error); -+ if (preinstall_paths == NULL) ++ configs = flatpak_get_preinstall_config (priv->default_arch, NULL, error); ++ if (configs == NULL) + return FALSE; + ++ /* If the system has not had any apps pre-installed (i.e. the key in the ++ * config is missing) we mark all apps we would pre-install as pre-installed. ++ * This makes sure we will uninstall them when the config says that they no ++ * longer should be installed. */ ++ if (!flatpak_dir_uninitialized_mark_preinstalled (priv->dir, configs, NULL)) ++ g_message (_("Warning: Could not mark already installed apps as preinstalled")); ++ + /* Find preinstalls that should get installed */ -+ for (int i = 0; preinstall_paths[i] != NULL; i++) ++ for (int i = 0; i < configs->len; i++) + { -+ const char *path = preinstall_paths[i]; -+ g_autoptr(FlatpakDecomposed) decomposed = NULL; -+ g_autofree char *collection_id = NULL; -+ -+ if (!flatpak_parse_preinstall_config_file (path, priv->default_arch, &decomposed, &collection_id, error)) -+ return FALSE; -+ -+ g_info ("Found preinstall ref %s from config file %s", flatpak_decomposed_get_ref (decomposed), path); ++ const FlatpakPreinstallConfig *config = g_ptr_array_index (configs, i); + + /* Store for later */ -+ g_ptr_array_add (install_refs, flatpak_decomposed_dup_ref (decomposed)); ++ g_ptr_array_add (install_refs, flatpak_decomposed_dup_ref (config->ref)); + + /* Skip over if it's listed as previously preinstalled - it's now under + * user's control and we no longer install it again, even if the user + * manually removes it. */ + if (!priv->reinstall && -+ flatpak_g_ptr_array_contains_string (preinstalled_refs, flatpak_decomposed_get_ref (decomposed))) ++ flatpak_g_ptr_array_contains_string (preinstalled_refs, ++ flatpak_decomposed_get_ref (config->ref))) + { -+ g_info ("Preinstall ref %s is marked as already preinstalled; skipping", flatpak_decomposed_get_ref (decomposed)); ++ g_info ("Preinstall ref %s is marked as already preinstalled; skipping", ++ flatpak_decomposed_get_ref (config->ref)); + continue; + } + @@ -779,27 +1035,33 @@ index 7339aca..e4de909 100644 + if (flatpak_dir_get_remote_disabled (priv->dir, remote)) + continue; + -+ remote_collection_id = flatpak_dir_get_remote_collection_id (priv->dir, remote); ++ remote_collection_id = flatpak_dir_get_remote_collection_id (priv->dir, ++ remote); + + /* Choose the first match if the collection ID was not specified */ -+ if (collection_id != NULL && -+ g_strcmp0 (remote_collection_id, collection_id) != 0) ++ if (config->collection_id != NULL && ++ g_strcmp0 (remote_collection_id, config->collection_id) != 0) + continue; + -+ g_info ("Adding preinstall of %s from remote %s", flatpak_decomposed_get_ref (decomposed), remote); ++ g_info ("Adding preinstall of %s from remote %s", ++ flatpak_decomposed_get_ref (config->ref), ++ remote); + -+ if (!flatpak_transaction_add_ref (self, remote, decomposed, NULL, NULL, NULL, ++ if (!flatpak_transaction_add_ref (self, remote, config->ref, NULL, NULL, NULL, + FLATPAK_TRANSACTION_OPERATION_INSTALL, -+ NULL, NULL, FALSE, TRUE, NULL, ++ NULL, NULL, NULL, FALSE, TRUE, NULL, + &local_error)) -+ g_info ("Failed to add preinstall ref %s: %s", flatpak_decomposed_get_ref (decomposed), -+ local_error->message); ++ { ++ g_info ("Failed to add preinstall ref %s: %s", ++ flatpak_decomposed_get_ref (config->ref), ++ local_error->message); ++ } + } + } + + /* Find previously preinstalled refs that are no longer in the preinstall + * list and should now get uninstalled */ -+ for (guint i = 0; i < preinstalled_refs->len; i++) ++ for (int i = 0; i < preinstalled_refs->len; i++) + { + const char *ref = g_ptr_array_index (preinstalled_refs, i); + @@ -813,19 +1075,20 @@ index 7339aca..e4de909 100644 + if (decomposed == NULL) + return FALSE; + -+ g_info ("Preinstalled ref %s is no longer listed as wanted in preinstall.d config; uninstalling", flatpak_decomposed_get_ref (decomposed)); ++ g_info ("Preinstalled ref %s is no longer listed as wanted in preinstall.d config; uninstalling", ++ flatpak_decomposed_get_ref (decomposed)); + -+ if (!flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, FALSE, TRUE, NULL, &local_error)) ++ if (!flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, ++ FLATPAK_TRANSACTION_OPERATION_UNINSTALL, ++ NULL, NULL, NULL, FALSE, TRUE, NULL, ++ &local_error)) + { -+ if (g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) -+ { -+ g_clear_error (&local_error); -+ } -+ else ++ if (!g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) + { + g_propagate_error (error, g_steal_pointer (&local_error)); + return FALSE; + } ++ g_clear_error (&local_error); + } + } + } @@ -836,43 +1099,53 @@ index 7339aca..e4de909 100644 /** * flatpak_transaction_add_update: * @self: a #FlatpakTransaction -@@ -3059,7 +3185,7 @@ flatpak_transaction_add_update (FlatpakTransaction *self, +@@ -3154,7 +3288,7 @@ flatpak_transaction_add_update (FlatpakTransaction *self, return FALSE; /* Note: we implement the merge when subpaths == NULL in flatpak_transaction_add_ref() */ -- return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, FALSE, NULL, error); -+ return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, FALSE, FALSE, NULL, error); +- return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, NULL, FALSE, NULL, error); ++ return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, NULL, FALSE, FALSE, NULL, error); } /** -@@ -3086,7 +3212,7 @@ flatpak_transaction_add_uninstall (FlatpakTransaction *self, +@@ -3181,7 +3315,7 @@ flatpak_transaction_add_uninstall (FlatpakTransaction *self, if (decomposed == NULL) return FALSE; -- return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, FALSE, NULL, error); -+ return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, FALSE, FALSE, NULL, error); +- return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, NULL, FALSE, NULL, error); ++ return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, NULL, FALSE, FALSE, NULL, error); } static gboolean -@@ -3198,7 +3324,7 @@ flatpak_transaction_add_auto_install (FlatpakTransaction *self, +@@ -3293,7 +3427,7 @@ flatpak_transaction_add_auto_install (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, auto_install_ref, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, -- NULL, NULL, FALSE, NULL, -+ NULL, NULL, FALSE, FALSE, NULL, +- NULL, NULL, NULL, FALSE, NULL, ++ NULL, NULL, NULL, FALSE, FALSE, NULL, &local_error)) g_info ("Failed to add auto-install ref %s: %s", flatpak_decomposed_get_ref (auto_install_ref), local_error->message); -@@ -4701,7 +4827,7 @@ flatpak_transaction_resolve_bundles (FlatpakTransaction *self, +@@ -4808,7 +4942,7 @@ flatpak_transaction_resolve_bundles (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, ref, NULL, NULL, commit, FLATPAK_TRANSACTION_OPERATION_INSTALL_BUNDLE, -- data->file, metadata, FALSE, NULL, error)) -+ data->file, metadata, FALSE, FALSE, NULL, error)) +- data->file, NULL, metadata, FALSE, NULL, error)) ++ data->file, NULL, metadata, FALSE, FALSE, NULL, error)) return FALSE; } -@@ -4773,6 +4899,7 @@ _run_op_kind (FlatpakTransaction *self, +@@ -4875,7 +5009,8 @@ flatpak_transaction_resolve_images (FlatpakTransaction *self, + + if (!flatpak_transaction_add_ref (self, remote, ref, NULL, NULL, NULL, + FLATPAK_TRANSACTION_OPERATION_INSTALL, +- NULL, image_source, metadata_label, FALSE, &op, error)) ++ NULL, image_source, metadata_label, FALSE, FALSE, ++ &op, error)) + return FALSE; + } + +@@ -4947,6 +5082,7 @@ _run_op_kind (FlatpakTransaction *self, priv->reinstall, priv->max_op >= APP_UPDATE, op->pin_on_deploy, @@ -880,7 +1153,7 @@ index 7339aca..e4de909 100644 remote_state, op->ref, op->resolved_commit, (const char **) op->subpaths, -@@ -4811,7 +4938,7 @@ _run_op_kind (FlatpakTransaction *self, +@@ -4986,7 +5122,7 @@ _run_op_kind (FlatpakTransaction *self, if (flatpak_decomposed_is_app (op->ref)) *out_needs_triggers = TRUE; @@ -889,7 +1162,7 @@ index 7339aca..e4de909 100644 *out_needs_cache_drop = TRUE; } } -@@ -4915,6 +5042,9 @@ _run_op_kind (FlatpakTransaction *self, +@@ -5091,6 +5227,9 @@ _run_op_kind (FlatpakTransaction *self, if (priv->force_uninstall) flags |= FLATPAK_HELPER_UNINSTALL_FLAGS_FORCE_REMOVE; @@ -899,7 +1172,7 @@ index 7339aca..e4de909 100644 emit_new_op (self, op, progress); res = flatpak_dir_uninstall (priv->dir, op->ref, flags, -@@ -5095,7 +5225,7 @@ add_uninstall_unused_ops (FlatpakTransaction *self, +@@ -5271,7 +5410,7 @@ add_uninstall_unused_ops (FlatpakTransaction *self, uninstall_op = flatpak_transaction_add_op (self, origin, unused_ref, NULL, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, @@ -909,10 +1182,10 @@ index 7339aca..e4de909 100644 } } diff --git a/common/flatpak-transaction.h b/common/flatpak-transaction.h -index 0b8f2de..6e67a7b 100644 +index dfa3d039..ae305c34 100644 --- a/common/flatpak-transaction.h +++ b/common/flatpak-transaction.h -@@ -330,6 +330,9 @@ gboolean flatpak_transaction_add_install_flatpakref (FlatpakTransacti +@@ -339,6 +339,9 @@ gboolean flatpak_transaction_add_install_flatpakref (FlatpakTransacti GBytes *flatpakref_data, GError **error); FLATPAK_EXTERN @@ -923,7 +1196,7 @@ index 0b8f2de..6e67a7b 100644 const char *ref, const char **subpaths, diff --git a/doc/flatpak-docs.xml.in b/doc/flatpak-docs.xml.in -index 581bf68..4de8d1f 100644 +index 581bf685..4de8d1f9 100644 --- a/doc/flatpak-docs.xml.in +++ b/doc/flatpak-docs.xml.in @@ -52,6 +52,7 @@ @@ -936,10 +1209,10 @@ index 581bf68..4de8d1f 100644 diff --git a/doc/flatpak-preinstall.xml b/doc/flatpak-preinstall.xml new file mode 100644 -index 0000000..cbbe095 +index 00000000..b774c618 --- /dev/null +++ b/doc/flatpak-preinstall.xml -@@ -0,0 +1,273 @@ +@@ -0,0 +1,276 @@ + + @@ -985,13 +1258,13 @@ index 0000000..cbbe095 + + + -+ Preinstalled flatpaks are defined by dropping .preinstall files into /etc/flatpak/preinstall.d/ directory. Each .preinstall file defines one flatpak to install. The OS runs flatpak preinstall -y (or its GUI equivalent) on system startup, which then does the actual installation. ++ Preinstalled flatpaks are defined by dropping .preinstall files into the directories /usr/share/flatpak/preinstall.d/ and /etc/flatpak/preinstall.d/. The OS runs flatpak preinstall -y (or its GUI equivalent) on system startup, which then does the actual installation. + + + + This system allows the OS vendor to define the list of flatpaks that are installed together with the OS, and also makes it possible for the OS vendor to make changes to the list in the future, which is then applied once flatpak preinstall is run next time. + -+ Users can opt out of preinstalled flatpaks by simply removing them, at which point they won't get automatically reinstalled again. ++ Users can opt out of preinstalled flatpaks by simply uninstalling them, at which point they won't get automatically reinstalled again. + + + @@ -999,31 +1272,36 @@ index 0000000..cbbe095 + File format + + -+ The .preinstall file is using the same .ini file format that is used for -+ systemd unit files or application .desktop files. ++ The .preinstall file is using the same .ini file format that is used for systemd unit files or application .desktop files. + + + -+ [Flatpak Preinstall] ++ [Flatpak Preinstall NAME] + + -+ All the information is contained in the [Flatpak Preinstall] group. ++ The NAME is the fully qualified name of the runtime or application. All the information for a single runtime or application is contained in one [Flatpak Preinstall NAME] group. Multiple groups can be defined in a single file. + + + The following keys can be present in this group: + + + -+ (string) -+ The fully qualified name of the runtime or application. This key is mandatory. ++ (boolean) ++ ++ Whether this group should be installed. If this key is not specified, the group will be installed. ++ + + + (string) -+ The name of the branch from which to install the application or runtime. If this key is not specified, the "master" branch is used. ++ ++ The name of the branch from which to install the application or runtime. If this key is not specified, the "master" branch is used. ++ + + + (boolean) -+ Whether this file refers to a runtime. If this key is not specified, the file is assumed to refer to an application. ++ ++ Whether this group refers to a runtime. If this key is not specified, the group is assumed to refer to an application. ++ + + + (string) @@ -1038,8 +1316,7 @@ index 0000000..cbbe095 + + Example + -+[Flatpak Preinstall] -+Name=org.gnome.Loupe ++[Flatpak Preinstall org.gnome.Loupe] +Branch=stable +IsRuntime=false + @@ -1209,12 +1486,11 @@ index 0000000..cbbe095 + + flatpak1, + -+ + + + diff --git a/doc/meson.build b/doc/meson.build -index a4cedfb..9ef8eee 100644 +index a4cedfbe..9ef8eee1 100644 --- a/doc/meson.build +++ b/doc/meson.build @@ -26,6 +26,7 @@ man1 = [ @@ -1226,7 +1502,7 @@ index a4cedfb..9ef8eee 100644 'flatpak-pin', 'flatpak-list', diff --git a/po/POTFILES.in b/po/POTFILES.in -index b3cb79c..52600ab 100644 +index b3cb79c0..52600abd 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -30,6 +30,7 @@ app/flatpak-builtins-permission-reset.c @@ -1238,10 +1514,10 @@ index b3cb79c..52600ab 100644 app/flatpak-builtins-remote-add.c app/flatpak-builtins-remote-delete.c diff --git a/system-helper/flatpak-system-helper.c b/system-helper/flatpak-system-helper.c -index a58ab2c..c39d0d7 100644 +index 1f950b20..623c2fa0 100644 --- a/system-helper/flatpak-system-helper.c +++ b/system-helper/flatpak-system-helper.c -@@ -403,6 +403,7 @@ handle_deploy (FlatpakSystemHelper *object, +@@ -404,6 +404,7 @@ handle_deploy (FlatpakSystemHelper *object, gboolean local_pull; gboolean reinstall; gboolean update_pinned; @@ -1249,7 +1525,7 @@ index a58ab2c..c39d0d7 100644 g_autofree char *url = NULL; g_autoptr(OngoingPull) ongoing_pull = NULL; g_autofree gchar *src_dir = NULL; -@@ -488,6 +489,7 @@ handle_deploy (FlatpakSystemHelper *object, +@@ -489,6 +490,7 @@ handle_deploy (FlatpakSystemHelper *object, local_pull = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_LOCAL_PULL) != 0; reinstall = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_REINSTALL) != 0; update_pinned = (arg_flags & FLATPAK_HELPER_DEPLOY_FLAGS_UPDATE_PINNED) != 0; @@ -1257,7 +1533,7 @@ index a58ab2c..c39d0d7 100644 deploy_dir = flatpak_dir_get_if_deployed (system, ref, NULL, NULL); -@@ -704,7 +706,8 @@ handle_deploy (FlatpakSystemHelper *object, +@@ -667,7 +669,8 @@ handle_deploy (FlatpakSystemHelper *object, if (!flatpak_dir_deploy_install (system, ref, arg_origin, (const char **) arg_subpaths, (const char **) arg_previous_ids, @@ -1267,253 +1543,273 @@ index a58ab2c..c39d0d7 100644 { flatpak_invocation_return_error (invocation, error, "Error deploying"); return G_DBUS_METHOD_INVOCATION_HANDLED; - -From 46878bfa88f8e10a799fd75f698535718aefa8b1 Mon Sep 17 00:00:00 2001 -From: Kalev Lember -Date: Wed, 6 Nov 2024 15:40:52 +0100 -Subject: [PATCH 2/3] dir: Search for preinstall config files in both /etc and - /usr/share - ---- - common/flatpak-dir.c | 59 +++++++++++++++++++++++++++++++++----------- - 1 file changed, 44 insertions(+), 15 deletions(-) - -diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index 295f610..e7d6e9d 100644 ---- a/common/flatpak-dir.c -+++ b/common/flatpak-dir.c -@@ -1908,25 +1908,20 @@ get_system_locations (GCancellable *cancellable, - return g_steal_pointer (&locations); - } - --char ** --flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, -- GError **error) -+static gboolean -+scan_preinstall_config_files (const char *config_dir, -+ GHashTable *config_file_map, -+ GCancellable *cancellable, -+ GError **error) - { -- g_autoptr(GPtrArray) paths = NULL; - g_autoptr(GFile) conf_dir = NULL; - g_autoptr(GFileEnumerator) dir_enum = NULL; - g_autoptr(GError) my_error = NULL; -- g_autofree char *config_dir = NULL; -- -- paths = g_ptr_array_new_with_free_func (g_free); -- config_dir = g_strdup_printf ("%s/%s", -- get_config_dir_location (), -- FLATPAK_PREINSTALL_DIR); - - if (!g_file_test (config_dir, G_FILE_TEST_IS_DIR)) - { - g_info ("Skipping missing preinstall config directory %s", config_dir); -- goto out; -+ return TRUE; - } - - conf_dir = g_file_new_for_path (config_dir); -@@ -1939,7 +1934,7 @@ flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, - g_info ("Unexpected error retrieving preinstalls from %s: %s", - config_dir, my_error->message); - g_propagate_error (error, g_steal_pointer (&my_error)); -- return NULL; -+ return FALSE; - } - - while (TRUE) -@@ -1955,7 +1950,7 @@ flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, - g_info ("Unexpected error reading file in %s: %s", - config_dir, my_error->message); - g_propagate_error (error, g_steal_pointer (&my_error)); -- return NULL; -+ return FALSE; - } - - if (file_info == NULL) -@@ -1966,11 +1961,45 @@ flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, - - if (type == G_FILE_TYPE_REGULAR && g_str_has_suffix (name, FLATPAK_PREINSTALL_FILE_EXT)) - { -- g_autofree char *path_str = g_file_get_path (path); -- g_ptr_array_add (paths, g_steal_pointer (&path_str)); -+ /* already found in another directory */ -+ if (g_hash_table_contains (config_file_map, name)) -+ continue; +diff --git a/tests/libtest.sh b/tests/libtest.sh +index 7dad594f..69ae0fef 100644 +--- a/tests/libtest.sh ++++ b/tests/libtest.sh +@@ -105,6 +105,7 @@ export FLATPAK_SYSTEM_DIR=${TEST_DATA_DIR}/system + export FLATPAK_SYSTEM_CACHE_DIR=${TEST_DATA_DIR}/system-cache + export FLATPAK_SYSTEM_HELPER_ON_SESSION=1 + export FLATPAK_CONFIG_DIR=${TEST_DATA_DIR}/config ++export FLATPAK_DATA_DIR=${TEST_DATA_DIR}/datadir + export FLATPAK_RUN_DIR=${TEST_DATA_DIR}/run + export FLATPAK_FANCY_OUTPUT=0 + export FLATPAK_FORCE_ALLOW_FUZZY_MATCHING=1 +diff --git a/tests/test-basic.sh b/tests/test-basic.sh +index 76369b35..9f1cfb20 100755 +--- a/tests/test-basic.sh ++++ b/tests/test-basic.sh +@@ -71,7 +71,7 @@ for cmd in install update uninstall list info config repair create-usb \ + remote-modify remote-delete remote-ls remote-info build-init \ + build build-finish build-export build-bundle build-import-bundle \ + build-sign build-update-repo build-commit-from repo kill history \ +- mask; ++ mask preinstall; + do + ${FLATPAK} $cmd --help > help_out + head -2 help_out > help_out2 +diff --git a/tests/test-matrix/meson.build b/tests/test-matrix/meson.build +index fd0b5034..3c20abed 100644 +--- a/tests/test-matrix/meson.build ++++ b/tests/test-matrix/meson.build +@@ -45,3 +45,4 @@ wrapped_tests += {'name' : 'test-unused.sh', 'script' : 'test-unused.sh'} + wrapped_tests += {'name' : 'test-prune.sh', 'script' : 'test-prune.sh'} + wrapped_tests += {'name' : 'test-seccomp.sh', 'script' : 'test-seccomp.sh'} + wrapped_tests += {'name' : 'test-repair.sh', 'script' : 'test-repair.sh'} ++wrapped_tests += {'name' : 'test-preinstall.sh', 'script' : 'test-preinstall.sh'} +diff --git a/tests/test-preinstall.sh b/tests/test-preinstall.sh +new file mode 100755 +index 00000000..23ae094c +--- /dev/null ++++ b/tests/test-preinstall.sh +@@ -0,0 +1,226 @@ ++#!/bin/bash ++# ++# Copyright (C) 2025 Red Hat, Inc ++# ++# This library is free software; you can redistribute it and/or ++# modify it under the terms of the GNU Lesser General Public ++# License as published by the Free Software Foundation; either ++# version 2 of the License, or (at your option) any later version. ++# ++# This library is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ++# Lesser General Public License for more details. ++# ++# You should have received a copy of the GNU Lesser General Public ++# License along with this library; if not, write to the ++# Free Software Foundation, Inc., 59 Temple Place - Suite 330, ++# Boston, MA 02111-1307, USA. + -+ g_hash_table_insert (config_file_map, g_strdup (name), g_object_ref (path)); - } - } - -+ return TRUE; -+} ++set -euo pipefail + -+char ** -+flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, -+ GError **error) -+{ -+ g_autoptr(GHashTable) config_file_map = NULL; -+ g_autoptr(GPtrArray) paths = NULL; -+ g_autofree char *config_dir = NULL; ++. $(dirname $0)/libtest.sh + -+ config_file_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); -+ paths = g_ptr_array_new_with_free_func (g_free); -+ config_dir = g_strdup_printf ("%s/%s", -+ get_config_dir_location (), -+ FLATPAK_PREINSTALL_DIR); ++mkdir -p $FLATPAK_DATA_DIR/preinstall.d ++mkdir -p $FLATPAK_CONFIG_DIR/preinstall.d + -+ /* scan directories in priority order */ -+ if (!scan_preinstall_config_files (config_dir, -+ config_file_map, cancellable, error)) -+ goto out; -+ if (!scan_preinstall_config_files (FLATPAK_BASEDIR "/" FLATPAK_PREINSTALL_DIR, -+ config_file_map, cancellable, error)) -+ goto out; ++cat << EOF > hello-install.preinstall ++[Flatpak Preinstall org.test.Hello] ++EOF + -+ GLNX_HASH_TABLE_FOREACH_KV (config_file_map, const char *, name, GFile *, path) -+ { -+ g_autofree char *path_str = g_file_get_path (path); -+ g_ptr_array_add (paths, g_steal_pointer (&path_str)); -+ } ++cat << EOF > hello-not-install.preinstall ++[Flatpak Preinstall org.test.Hello] ++Install=false ++EOF + - out: - g_ptr_array_add (paths, NULL); - return (char **) g_ptr_array_free (g_steal_pointer (&paths), FALSE); - -From d2792d319088d4f8f57fb2781428258a1e8d624b Mon Sep 17 00:00:00 2001 -From: Kalev Lember -Date: Wed, 6 Nov 2024 15:53:11 +0100 -Subject: [PATCH 3/3] fixup! Add initial support for preinstalling flatpaks - ---- - common/flatpak-dir.c | 14 ++++++++------ - 1 file changed, 8 insertions(+), 6 deletions(-) - -diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index e7d6e9d..fe3d145 100644 ---- a/common/flatpak-dir.c -+++ b/common/flatpak-dir.c -@@ -1956,8 +1956,8 @@ scan_preinstall_config_files (const char *config_dir, - if (file_info == NULL) - break; - -- name = g_file_info_get_attribute_byte_string (file_info, "standard::name"); -- type = g_file_info_get_attribute_uint32 (file_info, "standard::type"); -+ name = g_file_info_get_name (file_info); -+ type = g_file_info_get_file_type (file_info); - - if (type == G_FILE_TYPE_REGULAR && g_str_has_suffix (name, FLATPAK_PREINSTALL_FILE_EXT)) - { -@@ -1982,9 +1982,7 @@ flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, - - config_file_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); - paths = g_ptr_array_new_with_free_func (g_free); -- config_dir = g_strdup_printf ("%s/%s", -- get_config_dir_location (), -- FLATPAK_PREINSTALL_DIR); -+ config_dir = g_build_filename (get_config_dir_location (), FLATPAK_PREINSTALL_DIR, NULL); - - /* scan directories in priority order */ - if (!scan_preinstall_config_files (config_dir, -@@ -2024,7 +2022,11 @@ parse_preinstall_keyfile (GKeyFile *keyfile, - *collection_id_out = NULL; - - if (!g_key_file_has_group (keyfile, FLATPAK_PREINSTALL_GROUP)) -- return flatpak_fail_error (error, FLATPAK_ERROR_INVALID_DATA, _("Invalid file format, no %s group"), FLATPAK_PREINSTALL_GROUP); -+ { -+ /* empty files are allowed and expected, in order to allow overriding -+ /usr configuration in /etc */ -+ return TRUE; -+ } - - name = g_key_file_get_string (keyfile, FLATPAK_PREINSTALL_GROUP, - FLATPAK_PREINSTALL_NAME_KEY, NULL); -From 72e418793ff28299a834b81abfb0d9bdc943b67e Mon Sep 17 00:00:00 2001 -From: Sebastian Wick -Date: Fri, 10 Jan 2025 14:06:44 +0100 -Subject: fixup! dir: Search for preinstall config files in both /etc and - /usr/share - - -diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index fe3d1458..fe423b7a 100644 ---- a/common/flatpak-dir.c -+++ b/common/flatpak-dir.c -@@ -1979,16 +1979,19 @@ flatpak_get_preinstall_config_file_paths (GCancellable *cancellable, - g_autoptr(GHashTable) config_file_map = NULL; - g_autoptr(GPtrArray) paths = NULL; - g_autofree char *config_dir = NULL; -+ g_autofree char *data_dir = NULL; - - config_file_map = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_object_unref); - paths = g_ptr_array_new_with_free_func (g_free); -- config_dir = g_build_filename (get_config_dir_location (), FLATPAK_PREINSTALL_DIR, NULL); - - /* scan directories in priority order */ -+ config_dir = g_build_filename (get_config_dir_location (), FLATPAK_PREINSTALL_DIR, NULL); - if (!scan_preinstall_config_files (config_dir, - config_file_map, cancellable, error)) - goto out; -- if (!scan_preinstall_config_files (FLATPAK_BASEDIR "/" FLATPAK_PREINSTALL_DIR, ++cat << EOF > hello-install-multi.preinstall ++[Flatpak Preinstall org.test.Hello] ++[Flatpak Preinstall org.test.Hello2] ++EOF + -+ data_dir = g_build_filename (get_data_dir_location (), FLATPAK_PREINSTALL_DIR, NULL); -+ if (!scan_preinstall_config_files (data_dir, - config_file_map, cancellable, error)) - goto out; - -From 9ef338d2508002a88e913a48f2b01c09e33b4312 Mon Sep 17 00:00:00 2001 -From: Sebastian Wick -Date: Fri, 10 Jan 2025 14:15:57 +0100 -Subject: fixup! Add initial support for preinstalling flatpaks ++cat << EOF > hello-install-devel.preinstall ++[Flatpak Preinstall org.test.Hello] ++Branch=devel ++EOF ++ ++cat << EOF > bad.preinstall ++[Wrong Group] ++a=b ++ ++[Flatpak Preinstall ] ++Install=false ++ ++[Flatpak Preinstall] ++Install=true ++EOF ++ ++# Set up the runtimes ++# org.test.Platform//master and org.test.Platform//devel ++# and the apps ++# org.test.Hello//master, org.test.Hello//devel, ++# org.test.Hello2//master, org.test.Hello2//devel ++setup_repo ++make_updated_runtime test org.test.Collection.test devel HELLO_DEVEL org.test.Hello ++make_updated_app test org.test.Collection.test devel HELLO_DEVEL org.test.Hello ++make_updated_app test org.test.Collection.test master HELLO2_MASTER org.test.Hello2 ++make_updated_app test org.test.Collection.test devel HELLO2_DEVEL org.test.Hello2 ++ ++# make the test repo available by adding the test remote ++cat << EOF > test.flatpakrepo ++[Flatpak Repo] ++Url=http://127.0.0.1:${port}/test ++GPGKey=${FL_GPG_BASE64} ++Title=The Title ++Comment=The Comment ++Description=The Description ++Homepage=https://the.homepage/ ++Icon=https://the.icon/ ++EOF ++ ++${FLATPAK} ${U} remote-add test test.flatpakrepo >&2 ++ ++echo "1..9" ++ ++# just checking that the test remote got added ++assert_remote_has_config test url "http://127.0.0.1:${port}/test" ++ ++ok "setup" ++ ++# if we have nothing configured and nothing is marked as preinstalled ++# calling preinstall should be a no-op ++${FLATPAK} ${U} preinstall -y > nothingtodo ++assert_file_has_content nothingtodo "Nothing to do" ++ ++ok "no config" ++ ++# make sure nothing is installed ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_file_empty list-log ++ ++# The preinstall config wants org.test.Hello. ++cp hello-install.preinstall $FLATPAK_DATA_DIR/preinstall.d/ ++ ++${FLATPAK} ${U} preinstall -y >&2 ++ ++# Make sure it and the runtime were installed ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_file_has_content list-log "^org\.test\.Hello/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/devel$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Platform/.*/devel$" ++ ++ok "simple preinstall" ++ ++# Make sure calling preinstall with the same config again is a no-op... ++${FLATPAK} ${U} preinstall -y > nothingtodo ++assert_file_has_content nothingtodo "Nothing to do" ++ ++# ...and everything is still installed ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_file_has_content list-log "^org\.test\.Hello/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/devel$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Platform/.*/devel$" ++ ++ok "simple preinstall no op" ++ ++${FLATPAK} ${U} uninstall -y org.test.Hello >&2 ++ ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/devel$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Platform/.*/devel$" ++ ++# Make sure calling preinstall with the same config again is a no-op ++# Even if the user uninstalled the app (it is marked as preinstalled) ++${FLATPAK} ${U} preinstall -y > nothingtodo ++assert_file_has_content nothingtodo "Nothing to do" ++ ++# Make sure nothing has changed ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/devel$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Platform/.*/devel$" ++ ++ok "uninstall preinstall" ++ ++${FLATPAK} ${U} install test -y org.test.Hello master >&2 ++ ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_file_has_content list-log "^org\.test\.Hello/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/devel$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Platform/.*/devel$" ++ ++# Add a config to /etc which overwrites the config in /usr ($FLATPAK_DATA_DIR) ++# It has the Install=false setting which means it shall not be installed. ++cp hello-not-install.preinstall $FLATPAK_CONFIG_DIR/preinstall.d/ ++ ++${FLATPAK} ${U} preinstall -y >&2 ++ ++# Make sure preinstall removed org.test.Hello as indicated by the config ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/devel$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Platform/.*/devel$" ++ ++ok "preinstall install false" ++ ++# Remove the existing configs ++rm -rf $FLATPAK_CONFIG_DIR/preinstall.d/* ++rm -rf $FLATPAK_DATA_DIR/preinstall.d/* ++ ++# Add a config file which wants org.test.Hello and org.test.Hello2 installed ++cp hello-install-multi.preinstall $FLATPAK_CONFIG_DIR/preinstall.d/ ++ ++${FLATPAK} ${U} preinstall -y >&2 ++ ++# Make sure both apps got installed ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_file_has_content list-log "^org\.test\.Hello/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Hello2/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Platform/.*/devel$" ++ ++ok "install multi" ++ ++# Overwrite the branch of org.test.Hello from master to devel ++cp hello-install-devel.preinstall $FLATPAK_CONFIG_DIR/preinstall.d/ ++ ++${FLATPAK} ${U} preinstall -y >&2 ++ ++# Make sure org.test.Hello//devel replaced org.test.Hello//master ++${FLATPAK} ${U} list --columns=ref > list-log ++assert_not_file_has_content list-log "^org\.test\.Hello/.*/master$" ++assert_file_has_content list-log "^org\.test\.Hello/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Hello2/.*/master$" ++assert_not_file_has_content list-log "^org\.test\.Hello2/.*/devel$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/master$" ++assert_file_has_content list-log "^org\.test\.Platform/.*/devel$" ++ ++ok "overwrite branch" ++ ++# Make sure some config file parsing edge cases don't blow up ++cp bad.preinstall $FLATPAK_CONFIG_DIR/preinstall.d/ ++ ++${FLATPAK} ${U} preinstall -y > nothingtodo ++assert_file_has_content nothingtodo "Nothing to do" ++ ++ok "bad config" +\ No newline at end of file +-- +2.47.1 - -diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c -index e4de9091..9b777c38 100644 ---- a/common/flatpak-transaction.c -+++ b/common/flatpak-transaction.c -@@ -2949,15 +2949,12 @@ flatpak_transaction_add_rebase_and_uninstall (FlatpakTransaction *self, - /* If the user is trying to install an eol-rebased app from scratch, the - * @old_ref can’t be uninstalled because it’s not installed already. - * Silently ignore that. */ -- if (g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) -- { -- g_clear_error (&local_error); -- } -- else -+ if (!g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) - { - g_propagate_error (error, g_steal_pointer (&local_error)); - return FALSE; - } -+ g_clear_error (&local_error); - } - - /* Link the ops together so that the install/update is done first, and if -@@ -3116,7 +3113,7 @@ flatpak_transaction_add_sync_preinstalled (FlatpakTransaction *self, - - /* Find previously preinstalled refs that are no longer in the preinstall - * list and should now get uninstalled */ -- for (guint i = 0; i < preinstalled_refs->len; i++) -+ for (int i = 0; i < preinstalled_refs->len; i++) - { - const char *ref = g_ptr_array_index (preinstalled_refs, i); - -@@ -3134,15 +3131,12 @@ flatpak_transaction_add_sync_preinstalled (FlatpakTransaction *self, - - if (!flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, FALSE, TRUE, NULL, &local_error)) - { -- if (g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) -- { -- g_clear_error (&local_error); -- } -- else -+ if (!g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) - { - g_propagate_error (error, g_steal_pointer (&local_error)); - return FALSE; - } -+ g_clear_error (&local_error); - } - } - } diff --git a/flatpak-allow-direct-installation-from-oci-images.patch b/flatpak-allow-direct-installation-from-oci-images.patch index 1990800..76a0475 100644 --- a/flatpak-allow-direct-installation-from-oci-images.patch +++ b/flatpak-allow-direct-installation-from-oci-images.patch @@ -1,7 +1,7 @@ -From 7a77045bdd30b0000207cbf066c0ef105be0764b Mon Sep 17 00:00:00 2001 +From 7255a7ff96d9066c5c8e090f3a6d76de2f38ba50 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Mon, 14 Oct 2024 09:12:39 -0400 -Subject: [PATCH 01/12] image-source: Refactor - add FlatpakImageSource type +Subject: [PATCH 01/12]image-source: Refactor - add FlatpakImageSource type To avoid passing around combinations of a FlaptakOciRegistry with repository and digest, add a FlatpakImageSource type. @@ -24,7 +24,7 @@ this independently retrieved the repository and image config. create mode 100644 common/flatpak-image-source.c diff --git a/app/flatpak-builtins-build-import-bundle.c b/app/flatpak-builtins-build-import-bundle.c -index d5d6fc2..f350870 100644 +index d5d6fc26..f3508709 100644 --- a/app/flatpak-builtins-build-import-bundle.c +++ b/app/flatpak-builtins-build-import-bundle.c @@ -30,9 +30,10 @@ @@ -121,7 +121,7 @@ index d5d6fc2..f350870 100644 if (commit_checksum == NULL) return NULL; diff --git a/common/flatpak-common-types-private.h b/common/flatpak-common-types-private.h -index 0513014..d7f3913 100644 +index 05130144..d7f3913b 100644 --- a/common/flatpak-common-types-private.h +++ b/common/flatpak-common-types-private.h @@ -53,6 +53,7 @@ typedef enum { @@ -133,7 +133,7 @@ index 0513014..d7f3913 100644 typedef struct _FlatpakOciManifest FlatpakOciManifest; typedef struct _FlatpakOciImage FlatpakOciImage; diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index fe423b7..338573e 100644 +index 6936d45f..b0c29a70 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c @@ -52,6 +52,7 @@ @@ -144,7 +144,7 @@ index fe423b7..338573e 100644 #include "flatpak-oci-registry-private.h" #include "flatpak-ref.h" #include "flatpak-repo-utils-private.h" -@@ -1058,14 +1059,16 @@ lookup_oci_registry_uri_from_summary (GVariant *summary, +@@ -1049,14 +1050,16 @@ lookup_oci_registry_uri_from_summary (GVariant *summary, return g_steal_pointer (®istry_uri); } @@ -164,7 +164,7 @@ index fe423b7..338573e 100644 if (!flatpak_remote_state_ensure_summary (self, error)) return NULL; -@@ -1074,13 +1077,13 @@ flatpak_remote_state_new_oci_registry (FlatpakRemoteState *self, +@@ -1065,13 +1068,13 @@ flatpak_remote_state_new_oci_registry (FlatpakRemoteState *self, if (registry_uri == NULL) return NULL; @@ -182,7 +182,7 @@ index fe423b7..338573e 100644 } static GVariant * -@@ -1092,9 +1095,7 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, +@@ -1083,9 +1086,7 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, GCancellable *cancellable, GError **error) { @@ -193,7 +193,7 @@ index fe423b7..338573e 100644 g_autofree char *oci_digest = NULL; g_autofree char *latest_rev = NULL; VarRefInfoRef latest_rev_info; -@@ -1109,10 +1110,6 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, +@@ -1100,10 +1101,6 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, g_autoptr(GVariantBuilder) metadata_builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); g_autoptr(GVariant) metadata_v = NULL; @@ -204,7 +204,7 @@ index fe423b7..338573e 100644 /* We extract the rev info from the latest, even if we don't use the latest digest, assuming refs don't move */ if (!flatpak_remote_state_lookup_ref (self, ref, &latest_rev, NULL, &latest_rev_info, NULL, error)) return NULL; -@@ -1130,25 +1127,11 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, +@@ -1121,25 +1118,11 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, oci_digest = g_strconcat ("sha256:", checksum, NULL); @@ -233,7 +233,7 @@ index fe423b7..338573e 100644 if (labels) flatpak_oci_parse_commit_labels (labels, ×tamp, &subject, &body, -@@ -6123,7 +6106,7 @@ flatpak_dir_mirror_oci (FlatpakDir *self, +@@ -5935,7 +5918,7 @@ flatpak_dir_mirror_oci (FlatpakDir *self, GCancellable *cancellable, GError **error) { @@ -242,7 +242,7 @@ index fe423b7..338573e 100644 g_autofree char *oci_digest = NULL; g_autofree char *latest_rev = NULL; VarRefInfoRef latest_rev_info; -@@ -6156,15 +6139,15 @@ flatpak_dir_mirror_oci (FlatpakDir *self, +@@ -5968,15 +5951,15 @@ flatpak_dir_mirror_oci (FlatpakDir *self, oci_digest = g_strconcat ("sha256:", rev, NULL); @@ -261,7 +261,7 @@ index fe423b7..338573e 100644 progress, cancellable, error); if (!res) -@@ -6186,9 +6169,8 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -5998,9 +5981,8 @@ flatpak_dir_pull_oci (FlatpakDir *self, GCancellable *cancellable, GError **error) { @@ -273,7 +273,7 @@ index fe423b7..338573e 100644 const char *oci_repository = NULL; const char *delta_url = NULL; g_autofree char *oci_digest = NULL; -@@ -6219,23 +6201,8 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -6031,23 +6013,8 @@ flatpak_dir_pull_oci (FlatpakDir *self, if (latest_alt_commit != NULL && strcmp (oci_digest + strlen ("sha256:"), latest_alt_commit) == 0) return TRUE; @@ -299,7 +299,7 @@ index fe423b7..338573e 100644 return FALSE; if (repo == NULL) -@@ -6245,7 +6212,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -6057,7 +6024,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, g_info ("Pulling OCI image %s", oci_digest); @@ -308,7 +308,7 @@ index fe423b7..338573e 100644 state->remote_name, ref, flatpak_flags, oci_pull_progress_cb, progress, cancellable, error); if (checksum == NULL) -@@ -6261,6 +6228,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -6073,6 +6040,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, name = g_file_get_path (file); } @@ -318,7 +318,7 @@ index fe423b7..338573e 100644 "Pulled %s from %s", ref, flatpak_oci_registry_get_uri (registry)); diff --git a/common/flatpak-image-source-private.h b/common/flatpak-image-source-private.h new file mode 100644 -index 0000000..ebd856a +index 00000000..ebd856a4 --- /dev/null +++ b/common/flatpak-image-source-private.h @@ -0,0 +1,57 @@ @@ -381,7 +381,7 @@ index 0000000..ebd856a +#endif /* __FLATPAK_IMAGE_SOURCE_H__ */ diff --git a/common/flatpak-image-source.c b/common/flatpak-image-source.c new file mode 100644 -index 0000000..22497cc +index 00000000..22497ccf --- /dev/null +++ b/common/flatpak-image-source.c @@ -0,0 +1,227 @@ @@ -613,7 +613,7 @@ index 0000000..22497cc + return flatpak_oci_image_get_labels (self->image_config); +} diff --git a/common/flatpak-oci-registry-private.h b/common/flatpak-oci-registry-private.h -index 2c0608d..47ffc7b 100644 +index 2c0608dc..47ffc7be 100644 --- a/common/flatpak-oci-registry-private.h +++ b/common/flatpak-oci-registry-private.h @@ -183,6 +183,7 @@ GBytes *flatpak_oci_index_make_appstream (FlatpakHttpSession *http_session, @@ -650,7 +650,7 @@ index 2c0608d..47ffc7b 100644 const char *ref, const char *delta_url, diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c -index ad595e5..9e2b163 100644 +index 6d36de2a..11b5f98d 100644 --- a/common/flatpak-oci-registry.c +++ b/common/flatpak-oci-registry.c @@ -28,6 +28,7 @@ @@ -661,7 +661,7 @@ index ad595e5..9e2b163 100644 #include "flatpak-oci-registry-private.h" #include "flatpak-repo-utils-private.h" #include "flatpak-utils-base-private.h" -@@ -3422,9 +3423,7 @@ oci_layer_progress (guint64 downloaded_bytes, +@@ -3454,9 +3455,7 @@ oci_layer_progress (guint64 downloaded_bytes, gboolean flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, @@ -672,7 +672,7 @@ index ad595e5..9e2b163 100644 const char *remote, const char *ref, const char *delta_url, -@@ -3435,8 +3434,11 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, +@@ -3467,8 +3466,11 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, GError **error) { FlatpakOciPullProgressData progress_data = { progress_cb, progress_user_data }; @@ -686,7 +686,7 @@ index ad595e5..9e2b163 100644 g_autoptr(FlatpakOciDescriptor) manifest_desc = NULL; g_autoptr(FlatpakOciManifest) delta_manifest = NULL; g_autofree char *old_checksum = NULL; -@@ -3444,36 +3446,16 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, +@@ -3476,36 +3478,16 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, g_autoptr(GFile) old_root = NULL; OstreeRepoCommitState old_state = 0; g_autofree char *old_diffid = NULL; @@ -723,7 +723,7 @@ index ad595e5..9e2b163 100644 /* For deltas we ensure that the diffid and regular layers exists and match up */ n_layers = flatpak_oci_manifest_get_n_layers (manifest); if (n_layers == 0 || n_layers != flatpak_oci_image_get_n_layers (image_config)) -@@ -3557,7 +3539,8 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, +@@ -3589,7 +3571,8 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, if (index == NULL) index = flatpak_oci_index_new (); @@ -733,7 +733,7 @@ index ad595e5..9e2b163 100644 flatpak_oci_index_add_manifest (index, ref, manifest_desc); -@@ -3569,12 +3552,8 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, +@@ -3601,12 +3584,8 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, char * flatpak_pull_from_oci (OstreeRepo *repo, @@ -747,7 +747,7 @@ index ad595e5..9e2b163 100644 const char *remote, const char *ref, FlatpakPullFlags flags, -@@ -3583,6 +3562,11 @@ flatpak_pull_from_oci (OstreeRepo *repo, +@@ -3615,6 +3594,11 @@ flatpak_pull_from_oci (OstreeRepo *repo, GCancellable *cancellable, GError **error) { @@ -760,7 +760,7 @@ index ad595e5..9e2b163 100644 g_autoptr(OstreeMutableTree) archive_mtree = NULL; g_autoptr(GFile) archive_root = NULL; diff --git a/common/meson.build b/common/meson.build -index bd5dbf3..beed1f0 100644 +index bd5dbf3d..beed1f06 100644 --- a/common/meson.build +++ b/common/meson.build @@ -172,6 +172,7 @@ sources = [ @@ -772,7 +772,7 @@ index bd5dbf3..beed1f0 100644 'flatpak-installed-ref.c', 'flatpak-instance.c', diff --git a/doc/reference/meson.build b/doc/reference/meson.build -index a881b0c..92f1482 100644 +index a881b0cb..92f1482e 100644 --- a/doc/reference/meson.build +++ b/doc/reference/meson.build @@ -46,6 +46,7 @@ gnome.gtkdoc( @@ -784,7 +784,7 @@ index a881b0c..92f1482 100644 'flatpak-json-oci-private.h', 'flatpak-json-private.h', diff --git a/system-helper/flatpak-system-helper.c b/system-helper/flatpak-system-helper.c -index c39d0d7..263bf0b 100644 +index a58ab2c6..a4d9708b 100644 --- a/system-helper/flatpak-system-helper.c +++ b/system-helper/flatpak-system-helper.c @@ -39,6 +39,7 @@ @@ -795,7 +795,7 @@ index c39d0d7..263bf0b 100644 #include "flatpak-oci-registry-private.h" #include "flatpak-progress-private.h" #include "flatpak-system-helper.h" -@@ -530,15 +531,11 @@ handle_deploy (FlatpakSystemHelper *object, +@@ -528,15 +529,11 @@ handle_deploy (FlatpakSystemHelper *object, if (strlen (arg_repo_path) > 0 && is_oci) { g_autoptr(GFile) registry_file = g_file_new_for_path (arg_repo_path); @@ -813,7 +813,7 @@ index c39d0d7..263bf0b 100644 const char *verified_digest; g_autofree char *upstream_url = NULL; -@@ -554,50 +551,14 @@ handle_deploy (FlatpakSystemHelper *object, +@@ -552,50 +549,14 @@ handle_deploy (FlatpakSystemHelper *object, return G_DBUS_METHOD_INVOCATION_HANDLED; } @@ -866,7 +866,7 @@ index c39d0d7..263bf0b 100644 state = flatpak_dir_get_remote_state (system, arg_origin, FALSE, NULL, &error); if (state == NULL) { -@@ -624,15 +585,17 @@ handle_deploy (FlatpakSystemHelper *object, +@@ -622,15 +583,17 @@ handle_deploy (FlatpakSystemHelper *object, return G_DBUS_METHOD_INVOCATION_HANDLED; } @@ -890,10 +890,10 @@ index c39d0d7..263bf0b 100644 -- 2.47.1 -From d7d4f790bf7103c5ac5afff294578afea7308227 Mon Sep 17 00:00:00 2001 +From 5e0cfa2e33b9d99992047a14650784e5fd4c0c05 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Mon, 28 Oct 2024 12:35:33 -0400 -Subject: [PATCH 02/12] image-source: Replace flatpak_oci_parse_commit_labels +Subject: [PATCH 02/12]image-source: Replace flatpak_oci_parse_commit_labels with getters Instead of having one function with a pile of out arguments in @@ -909,7 +909,7 @@ arbitrary order, add getters to FlatpakImageSource. 7 files changed, 125 insertions(+), 127 deletions(-) diff --git a/app/flatpak-builtins-build-import-bundle.c b/app/flatpak-builtins-build-import-bundle.c -index f350870..d79fbbd 100644 +index f3508709..d79fbbde 100644 --- a/app/flatpak-builtins-build-import-bundle.c +++ b/app/flatpak-builtins-build-import-bundle.c @@ -59,30 +59,22 @@ import_oci (OstreeRepo *repo, GFile *file, @@ -949,10 +949,10 @@ index f350870..d79fbbd 100644 return g_strdup (commit_checksum); } diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index 338573e..d2c8b55 100644 +index b0c29a70..e1224170 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c -@@ -1101,12 +1101,7 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, +@@ -1092,12 +1092,7 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, VarRefInfoRef latest_rev_info; VarMetadataRef metadata; const char *oci_repository = NULL; @@ -966,7 +966,7 @@ index 338573e..d2c8b55 100644 g_autoptr(GVariantBuilder) metadata_builder = g_variant_builder_new (G_VARIANT_TYPE ("a{sv}")); g_autoptr(GVariant) metadata_v = NULL; -@@ -1131,30 +1126,26 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, +@@ -1122,30 +1117,26 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, if (image_source == NULL) return NULL; @@ -1005,7 +1005,7 @@ index 338573e..d2c8b55 100644 ostree_checksum_to_bytes_v ("0000000000000000000000000000000000000000000000000000000000000000"))); } diff --git a/common/flatpak-image-source-private.h b/common/flatpak-image-source-private.h -index ebd856a..fe8f02b 100644 +index ebd856a4..fe8f02ba 100644 --- a/common/flatpak-image-source-private.h +++ b/common/flatpak-image-source-private.h @@ -52,6 +52,15 @@ FlatpakOciManifest *flatpak_image_source_get_manifest (FlatpakImageSource @@ -1026,7 +1026,7 @@ index ebd856a..fe8f02b 100644 #endif /* __FLATPAK_IMAGE_SOURCE_H__ */ diff --git a/common/flatpak-image-source.c b/common/flatpak-image-source.c -index 22497cc..feb4fe2 100644 +index 22497ccf..feb4fe27 100644 --- a/common/flatpak-image-source.c +++ b/common/flatpak-image-source.c @@ -74,7 +74,6 @@ flatpak_image_source_new (FlatpakOciRegistry *registry, @@ -1146,7 +1146,7 @@ index 22497cc..feb4fe2 100644 + } } diff --git a/common/flatpak-json-oci-private.h b/common/flatpak-json-oci-private.h -index edb22ee..87573c1 100644 +index edb22eeb..87573c17 100644 --- a/common/flatpak-json-oci-private.h +++ b/common/flatpak-json-oci-private.h @@ -246,14 +246,6 @@ void flatpak_oci_add_labels_for_commit (GHashTable *labels, @@ -1165,7 +1165,7 @@ index edb22ee..87573c1 100644 #define FLATPAK_TYPE_OCI_SIGNATURE flatpak_oci_signature_get_type () G_DECLARE_FINAL_TYPE (FlatpakOciSignature, flatpak_oci_signature, FLATPAK, OCI_SIGNATURE, FlatpakJson) diff --git a/common/flatpak-json-oci.c b/common/flatpak-json-oci.c -index 42647d1..2b55b9d 100644 +index 42647d11..2b55b9de 100644 --- a/common/flatpak-json-oci.c +++ b/common/flatpak-json-oci.c @@ -927,72 +927,6 @@ flatpak_oci_add_labels_for_commit (GHashTable *labels, @@ -1242,10 +1242,10 @@ index 42647d1..2b55b9d 100644 G_DEFINE_TYPE (FlatpakOciSignature, flatpak_oci_signature, FLATPAK_TYPE_JSON); diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c -index 9e2b163..d8616f4 100644 +index 11b5f98d..ad05c9f0 100644 --- a/common/flatpak-oci-registry.c +++ b/common/flatpak-oci-registry.c -@@ -3578,28 +3578,18 @@ flatpak_pull_from_oci (OstreeRepo *repo, +@@ -3610,28 +3610,18 @@ flatpak_pull_from_oci (OstreeRepo *repo, g_autofree char *old_diffid = NULL; g_autofree char *commit_checksum = NULL; const char *parent = NULL; @@ -1276,7 +1276,7 @@ index 9e2b163..d8616f4 100644 if (manifest_ref == NULL) { -@@ -3607,12 +3597,18 @@ flatpak_pull_from_oci (OstreeRepo *repo, +@@ -3639,12 +3629,18 @@ flatpak_pull_from_oci (OstreeRepo *repo, return NULL; } @@ -1296,7 +1296,7 @@ index 9e2b163..d8616f4 100644 g_variant_builder_add (metadata_builder, "{s@v}", "xa.alt-id", g_variant_new_variant (g_variant_new_string (digest + strlen ("sha256:")))); -@@ -3786,11 +3782,11 @@ flatpak_pull_from_oci (OstreeRepo *repo, +@@ -3818,11 +3814,11 @@ flatpak_pull_from_oci (OstreeRepo *repo, metadata = g_variant_ref_sink (g_variant_builder_end (metadata_builder)); if (!ostree_repo_write_commit_with_time (repo, parent, @@ -1314,20 +1314,20 @@ index 9e2b163..d8616f4 100644 -- 2.47.1 -From f0c124f1a7c4ffba1045297a03475fed8c1fd6cc Mon Sep 17 00:00:00 2001 +From c13709a1e320b9f7e5ff31b2284e372ba6ee08f4 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 18 Dec 2024 00:32:32 +0100 -Subject: [PATCH 03/12] transaction: Typedef structs directly +Subject: [PATCH 03/12]transaction: Typedef structs directly --- common/flatpak-transaction.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c -index 9b777c3..7122a6c 100644 +index 7339acab..8a16cc1e 100644 --- a/common/flatpak-transaction.c +++ b/common/flatpak-transaction.c -@@ -139,15 +139,11 @@ struct _FlatpakTransactionOperation +@@ -138,15 +138,11 @@ struct _FlatpakTransactionOperation GPtrArray *related_to_ops; /* (element-type FlatpakTransactionOperation) (nullable) */ }; @@ -1345,7 +1345,7 @@ index 9b777c3..7122a6c 100644 typedef struct { FlatpakTransaction *transaction; -@@ -158,7 +154,7 @@ typedef struct { +@@ -157,7 +153,7 @@ typedef struct { GVariant *results; } RequestData; @@ -1354,7 +1354,7 @@ index 9b777c3..7122a6c 100644 { GObject parent; -@@ -199,7 +195,7 @@ struct _FlatpakTransactionPrivate +@@ -198,7 +194,7 @@ struct _FlatpakTransactionPrivate gboolean needs_resolve; gboolean needs_tokens; @@ -1366,10 +1366,10 @@ index 9b777c3..7122a6c 100644 -- 2.47.1 -From 5d735cc9ad088f01f677c8fcb1f113d40a68e487 Mon Sep 17 00:00:00 2001 +From 8d6959c27c5b992750cbcc2fefb016a3d58db58c Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 18 Dec 2024 00:38:15 +0100 -Subject: [PATCH 04/12] transaction: Use g_clear_pointer/object functions for +Subject: [PATCH 04/12]transaction: Use g_clear_pointer/object functions for op finalize --- @@ -1377,10 +1377,10 @@ Subject: [PATCH 04/12] transaction: Use g_clear_pointer/object functions for 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c -index 7122a6c..ac92469 100644 +index 8a16cc1e..7039d86e 100644 --- a/common/flatpak-transaction.c +++ b/common/flatpak-transaction.c -@@ -594,34 +594,25 @@ flatpak_transaction_operation_finalize (GObject *object) +@@ -593,34 +593,25 @@ flatpak_transaction_operation_finalize (GObject *object) { FlatpakTransactionOperation *self = (FlatpakTransactionOperation *) object; @@ -1436,10 +1436,10 @@ index 7122a6c..ac92469 100644 -- 2.47.1 -From 158cd4a77f9cf6903d6e7f9c33cb4d83a0f8b79e Mon Sep 17 00:00:00 2001 +From b235bb419e87d2a9c13e29a55f9cd32a3089f15a Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Wed, 18 Dec 2024 00:46:33 +0100 -Subject: [PATCH 05/12] image-source: Add flatpak_image_source_new_for_location +Subject: [PATCH 05/12]image-source: Add flatpak_image_source_new_for_location Which allows one to create an image source from a container location. @@ -1463,7 +1463,7 @@ support for installing OCI images. diff --git a/common/flatpak-docker-reference-private.h b/common/flatpak-docker-reference-private.h new file mode 100644 -index 0000000..8205064 +index 00000000..8205064c --- /dev/null +++ b/common/flatpak-docker-reference-private.h @@ -0,0 +1,20 @@ @@ -1489,7 +1489,7 @@ index 0000000..8205064 +#endif /* __FLATPAK_DOCKER_REFERENCE_H__ */ diff --git a/common/flatpak-docker-reference.c b/common/flatpak-docker-reference.c new file mode 100644 -index 0000000..6df3011 +index 00000000..6df3011f --- /dev/null +++ b/common/flatpak-docker-reference.c @@ -0,0 +1,140 @@ @@ -1634,7 +1634,7 @@ index 0000000..6df3011 + g_free (reference); +} diff --git a/common/flatpak-image-source-private.h b/common/flatpak-image-source-private.h -index fe8f02b..b1e5d2f 100644 +index fe8f02ba..b1e5d2fa 100644 --- a/common/flatpak-image-source-private.h +++ b/common/flatpak-image-source-private.h @@ -41,6 +41,9 @@ FlatpakImageSource *flatpak_image_source_new_remote (const char *uri, @@ -1648,7 +1648,7 @@ index fe8f02b..b1e5d2f 100644 void flatpak_image_source_set_token (FlatpakImageSource *self, const char *token); diff --git a/common/flatpak-image-source.c b/common/flatpak-image-source.c -index feb4fe2..0503de5 100644 +index feb4fe27..0503de5d 100644 --- a/common/flatpak-image-source.c +++ b/common/flatpak-image-source.c @@ -20,6 +20,7 @@ @@ -1788,7 +1788,7 @@ index feb4fe2..0503de5 100644 flatpak_image_source_set_token (FlatpakImageSource *self, const char *token) diff --git a/common/flatpak-json-oci-private.h b/common/flatpak-json-oci-private.h -index 87573c1..e8924ee 100644 +index 87573c17..e8924ee4 100644 --- a/common/flatpak-json-oci-private.h +++ b/common/flatpak-json-oci-private.h @@ -166,8 +166,10 @@ gboolean flatpak_oci_index_remove_manifest (FlatpakOciIndex @@ -1804,7 +1804,7 @@ index 87573c1..e8924ee 100644 FlatpakOciDescriptor *flatpak_oci_index_find_delta_for (FlatpakOciIndex *delta_index, const char *for_digest); diff --git a/common/flatpak-json-oci.c b/common/flatpak-json-oci.c -index 2b55b9d..3a339a0 100644 +index 2b55b9de..3a339a02 100644 --- a/common/flatpak-json-oci.c +++ b/common/flatpak-json-oci.c @@ -577,6 +577,27 @@ flatpak_oci_index_get_only_manifest (FlatpakOciIndex *self) @@ -1836,7 +1836,7 @@ index 2b55b9d..3a339a0 100644 flatpak_oci_index_remove_manifest (FlatpakOciIndex *self, const char *ref) diff --git a/common/meson.build b/common/meson.build -index beed1f0..c14337b 100644 +index beed1f06..c14337be 100644 --- a/common/meson.build +++ b/common/meson.build @@ -169,6 +169,7 @@ sources = [ @@ -1850,10 +1850,10 @@ index beed1f0..c14337b 100644 -- 2.47.1 -From 53ebfb48cce60b66bd47d99774739c1825f33295 Mon Sep 17 00:00:00 2001 +From c9b992fda4ac3cd53c2f315d135823ac6929ad17 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Wed, 18 Dec 2024 00:52:27 +0100 -Subject: [PATCH 06/12] common: Add OCI image installation support +Subject: [PATCH 06/12]common: Add OCI image installation support --- common/flatpak-dir-private.h | 3 + @@ -1865,10 +1865,10 @@ Subject: [PATCH 06/12] common: Add OCI image installation support 6 files changed, 252 insertions(+), 79 deletions(-) diff --git a/common/flatpak-dir-private.h b/common/flatpak-dir-private.h -index a10a202..6d25196 100644 +index 871f40b6..539476b8 100644 --- a/common/flatpak-dir-private.h +++ b/common/flatpak-dir-private.h -@@ -586,6 +586,7 @@ gboolean flatpak_dir_pull (Fla +@@ -574,6 +574,7 @@ gboolean flatpak_dir_pull (Fla const char *opt_rev, const char **subpaths, GFile *sideload_repo, @@ -1876,7 +1876,7 @@ index a10a202..6d25196 100644 GBytes *require_metadata, const char *token, OstreeRepo *repo, -@@ -708,6 +709,7 @@ gboolean flatpak_dir_install (Fla +@@ -694,6 +695,7 @@ gboolean flatpak_dir_install (Fla const char **subpaths, const char **previous_ids, GFile *sideload_repo, @@ -1884,7 +1884,7 @@ index a10a202..6d25196 100644 GBytes *require_metadata, const char *token, FlatpakProgress *progress, -@@ -754,6 +756,7 @@ gboolean flatpak_dir_update (Fla +@@ -740,6 +742,7 @@ gboolean flatpak_dir_update (Fla const char **opt_subpaths, const char **opt_previous_ids, GFile *sideload_repo, @@ -1893,10 +1893,10 @@ index a10a202..6d25196 100644 const char *token, FlatpakProgress *progress, diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index d2c8b55..e6b3364 100644 +index e1224170..e8ff645b 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c -@@ -132,7 +132,7 @@ static gboolean flatpak_dir_mirror_oci (FlatpakDir *self, +@@ -123,7 +123,7 @@ static gboolean flatpak_dir_mirror_oci (FlatpakDir *self, FlatpakRemoteState *state, const char *ref, const char *opt_rev, @@ -1905,7 +1905,7 @@ index d2c8b55..e6b3364 100644 const char *token, FlatpakProgress *progress, GCancellable *cancellable, -@@ -5495,7 +5495,7 @@ flatpak_dir_update_appstream (FlatpakDir *self, +@@ -5307,7 +5307,7 @@ flatpak_dir_update_appstream (FlatpakDir *self, if (child_repo == NULL) return FALSE; @@ -1914,7 +1914,7 @@ index d2c8b55..e6b3364 100644 child_repo, FLATPAK_PULL_FLAGS_NONE, 0, progress, cancellable, error)) { -@@ -5539,7 +5539,7 @@ flatpak_dir_update_appstream (FlatpakDir *self, +@@ -5351,7 +5351,7 @@ flatpak_dir_update_appstream (FlatpakDir *self, } @@ -1923,7 +1923,7 @@ index d2c8b55..e6b3364 100644 FLATPAK_PULL_FLAGS_NONE, OSTREE_REPO_PULL_FLAGS_NONE, progress, cancellable, error)) { -@@ -6091,7 +6091,7 @@ flatpak_dir_mirror_oci (FlatpakDir *self, +@@ -5903,7 +5903,7 @@ flatpak_dir_mirror_oci (FlatpakDir *self, FlatpakRemoteState *state, const char *ref, const char *opt_rev, @@ -1932,7 +1932,7 @@ index d2c8b55..e6b3364 100644 const char *token, FlatpakProgress *progress, GCancellable *cancellable, -@@ -6099,40 +6099,42 @@ flatpak_dir_mirror_oci (FlatpakDir *self, +@@ -5911,40 +5911,42 @@ flatpak_dir_mirror_oci (FlatpakDir *self, { g_autoptr(FlatpakImageSource) image_source = NULL; g_autofree char *oci_digest = NULL; @@ -2001,7 +2001,7 @@ index d2c8b55..e6b3364 100644 flatpak_progress_start_oci_pull (progress); -@@ -6152,6 +6154,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -5964,6 +5966,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, FlatpakRemoteState *state, const char *ref, const char *opt_rev, @@ -2009,7 +2009,7 @@ index d2c8b55..e6b3364 100644 OstreeRepo *repo, FlatpakPullFlags flatpak_flags, OstreeRepoPullFlags flags, -@@ -6162,40 +6165,49 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -5974,40 +5977,49 @@ flatpak_dir_pull_oci (FlatpakDir *self, { g_autoptr(FlatpakImageSource) image_source = NULL; FlatpakOciRegistry *registry = NULL; @@ -2078,7 +2078,7 @@ index d2c8b55..e6b3364 100644 if (repo == NULL) repo = self->repo; -@@ -6234,6 +6246,7 @@ flatpak_dir_pull (FlatpakDir *self, +@@ -6046,6 +6058,7 @@ flatpak_dir_pull (FlatpakDir *self, const char *opt_rev, const char **subpaths, GFile *sideload_repo, @@ -2086,7 +2086,7 @@ index d2c8b55..e6b3364 100644 GBytes *require_metadata, const char *token, OstreeRepo *repo, -@@ -6264,8 +6277,8 @@ flatpak_dir_pull (FlatpakDir *self, +@@ -6076,8 +6089,8 @@ flatpak_dir_pull (FlatpakDir *self, if (repo == NULL && !flatpak_dir_repo_lock (self, &lock, LOCK_SH, cancellable, error)) return FALSE; @@ -2097,7 +2097,7 @@ index d2c8b55..e6b3364 100644 flags, token, progress, cancellable, error); if (!ostree_repo_remote_get_url (self->repo, -@@ -10036,6 +10049,7 @@ flatpak_dir_install (FlatpakDir *self, +@@ -9838,6 +9851,7 @@ flatpak_dir_install (FlatpakDir *self, const char **opt_subpaths, const char **opt_previous_ids, GFile *sideload_repo, @@ -2105,7 +2105,7 @@ index d2c8b55..e6b3364 100644 GBytes *require_metadata, const char *token, FlatpakProgress *progress, -@@ -10100,7 +10114,8 @@ flatpak_dir_install (FlatpakDir *self, +@@ -9902,7 +9916,8 @@ flatpak_dir_install (FlatpakDir *self, child_repo_path = g_file_get_path (registry_file); @@ -2115,7 +2115,7 @@ index d2c8b55..e6b3364 100644 return FALSE; } else if (!gpg_verify_summary || !gpg_verify) -@@ -10194,7 +10209,7 @@ flatpak_dir_install (FlatpakDir *self, +@@ -9996,7 +10011,7 @@ flatpak_dir_install (FlatpakDir *self, flatpak_flags |= FLATPAK_PULL_FLAGS_SIDELOAD_EXTRA_DATA; @@ -2124,7 +2124,7 @@ index d2c8b55..e6b3364 100644 child_repo, flatpak_flags, 0, -@@ -10272,7 +10287,8 @@ flatpak_dir_install (FlatpakDir *self, +@@ -10071,7 +10086,8 @@ flatpak_dir_install (FlatpakDir *self, if (!no_pull) { @@ -2134,7 +2134,7 @@ index d2c8b55..e6b3364 100644 flatpak_flags, OSTREE_REPO_PULL_FLAGS_NONE, progress, cancellable, error)) return FALSE; -@@ -10720,6 +10736,7 @@ flatpak_dir_update (FlatpakDir *self, +@@ -10518,6 +10534,7 @@ flatpak_dir_update (FlatpakDir *self, const char **opt_subpaths, const char **opt_previous_ids, GFile *sideload_repo, @@ -2142,7 +2142,7 @@ index d2c8b55..e6b3364 100644 GBytes *require_metadata, const char *token, FlatpakProgress *progress, -@@ -10807,7 +10824,7 @@ flatpak_dir_update (FlatpakDir *self, +@@ -10605,7 +10622,7 @@ flatpak_dir_update (FlatpakDir *self, child_repo_path = g_file_get_path (registry_file); if (!flatpak_dir_mirror_oci (self, registry, state, flatpak_decomposed_get_ref (ref), @@ -2151,7 +2151,7 @@ index d2c8b55..e6b3364 100644 return FALSE; } else if (!gpg_verify_summary || !gpg_verify) -@@ -10887,7 +10904,7 @@ flatpak_dir_update (FlatpakDir *self, +@@ -10685,7 +10702,7 @@ flatpak_dir_update (FlatpakDir *self, flatpak_flags |= FLATPAK_PULL_FLAGS_SIDELOAD_EXTRA_DATA; if (!flatpak_dir_pull (self, state, flatpak_decomposed_get_ref (ref), @@ -2160,7 +2160,7 @@ index d2c8b55..e6b3364 100644 child_repo, flatpak_flags, 0, progress, cancellable, error)) -@@ -10953,7 +10970,7 @@ flatpak_dir_update (FlatpakDir *self, +@@ -10751,7 +10768,7 @@ flatpak_dir_update (FlatpakDir *self, if (!no_pull) { if (!flatpak_dir_pull (self, state, flatpak_decomposed_get_ref (ref), @@ -2170,13 +2170,13 @@ index d2c8b55..e6b3364 100644 progress, cancellable, error)) return FALSE; diff --git a/common/flatpak-installation.c b/common/flatpak-installation.c -index 38d4e8d..be70617 100644 +index c7d2e1dd..3a8677e8 100644 --- a/common/flatpak-installation.c +++ b/common/flatpak-installation.c @@ -1930,7 +1930,7 @@ flatpak_installation_install_full (FlatpakInstallation *self, (flags & FLATPAK_INSTALL_FLAGS_NO_DEPLOY) != 0, (flags & FLATPAK_INSTALL_FLAGS_NO_STATIC_DELTAS) != 0, - FALSE, FALSE, FALSE, FALSE, state, + FALSE, FALSE, FALSE, state, - ref, NULL, (const char **) subpaths, NULL, NULL, NULL, NULL, + ref, NULL, (const char **) subpaths, NULL, NULL, NULL, NULL, NULL, progress, cancellable, error)) @@ -2192,7 +2192,7 @@ index 38d4e8d..be70617 100644 return NULL; diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c -index ac92469..ddc0318 100644 +index 7039d86e..ffee385e 100644 --- a/common/flatpak-transaction.c +++ b/common/flatpak-transaction.c @@ -26,7 +26,9 @@ @@ -2213,7 +2213,7 @@ index ac92469..ddc0318 100644 GFile *bundle; GBytes *external_metadata; FlatpakTransactionOperationType kind; -@@ -116,6 +119,7 @@ struct _FlatpakTransactionOperation +@@ -115,6 +118,7 @@ struct _FlatpakTransactionOperation gboolean resolved; char *resolved_commit; GFile *resolved_sideload_path; @@ -2221,7 +2221,7 @@ index ac92469..ddc0318 100644 GBytes *resolved_metadata; GKeyFile *resolved_metakey; GBytes *resolved_old_metadata; -@@ -145,6 +149,11 @@ typedef struct _BundleData +@@ -144,6 +148,11 @@ typedef struct _BundleData GBytes *gpg_data; } BundleData; @@ -2233,7 +2233,7 @@ index ac92469..ddc0318 100644 typedef struct { FlatpakTransaction *transaction; const char *remote; -@@ -169,6 +178,7 @@ typedef struct _FlatpakTransactionPrivate +@@ -168,6 +177,7 @@ typedef struct _FlatpakTransactionPrivate GList *flatpakrefs; /* GKeyFiles */ GList *bundles; /* BundleData */ @@ -2241,7 +2241,7 @@ index ac92469..ddc0318 100644 guint next_request_id; guint active_request_id; -@@ -261,6 +271,23 @@ bundle_data_free (BundleData *data) +@@ -260,6 +270,23 @@ bundle_data_free (BundleData *data) g_free (data); } @@ -2265,7 +2265,7 @@ index ac92469..ddc0318 100644 static guint progress_signals[LAST_SIGNAL] = { 0 }; /** -@@ -613,6 +640,8 @@ flatpak_transaction_operation_finalize (GObject *object) +@@ -612,6 +639,8 @@ flatpak_transaction_operation_finalize (GObject *object) g_clear_pointer (&self->run_before_ops, g_list_free); g_clear_pointer (&self->related_to_ops, g_ptr_array_unref); g_clear_pointer (&self->summary_metadata, g_variant_unref); @@ -2274,7 +2274,7 @@ index ac92469..ddc0318 100644 G_OBJECT_CLASS (flatpak_transaction_operation_parent_class)->finalize (object); } -@@ -996,6 +1025,7 @@ flatpak_transaction_finalize (GObject *object) +@@ -993,6 +1022,7 @@ flatpak_transaction_finalize (GObject *object) g_free (priv->parent_window); g_list_free_full (priv->flatpakrefs, (GDestroyNotify) g_key_file_unref); g_list_free_full (priv->bundles, (GDestroyNotify) bundle_data_free); @@ -2282,17 +2282,17 @@ index ac92469..ddc0318 100644 g_free (priv->default_arch); g_hash_table_unref (priv->last_op_for_ref); g_hash_table_unref (priv->remote_states); -@@ -2608,6 +2638,7 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, +@@ -2603,6 +2633,7 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, const char *commit, FlatpakTransactionOperationType kind, GFile *bundle, + FlatpakImageSource *image_source, const char *external_metadata, gboolean pin_on_deploy, - gboolean update_preinstalled_on_deploy, -@@ -2737,6 +2768,9 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, - commit, bundle, kind, pin_on_deploy, - update_preinstalled_on_deploy); + FlatpakTransactionOperation **out_op, +@@ -2730,6 +2761,9 @@ flatpak_transaction_add_ref (FlatpakTransaction *self, + op = flatpak_transaction_add_op (self, remote, ref, subpaths, previous_ids, + commit, bundle, kind, pin_on_deploy); + if (image_source) + op->image_source = g_object_ref (image_source); @@ -2300,40 +2300,40 @@ index ac92469..ddc0318 100644 if (external_metadata) op->external_metadata = g_bytes_new (external_metadata, strlen (external_metadata)); -@@ -2790,7 +2824,7 @@ flatpak_transaction_add_install (FlatpakTransaction *self, +@@ -2783,7 +2817,7 @@ flatpak_transaction_add_install (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, decomposed, subpaths, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL, -- NULL, NULL, pin_on_deploy, FALSE, NULL, error)) -+ NULL, NULL, NULL, pin_on_deploy, FALSE, NULL, error)) +- NULL, NULL, pin_on_deploy, NULL, error)) ++ NULL, NULL, NULL, pin_on_deploy, NULL, error)) return FALSE; return TRUE; -@@ -2850,7 +2884,7 @@ flatpak_transaction_add_rebase (FlatpakTransaction *self, +@@ -2843,7 +2877,7 @@ flatpak_transaction_add_rebase (FlatpakTransaction *self, if (dir_ref_is_installed (priv->dir, decomposed, &installed_origin, NULL)) remote = installed_origin; -- return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, FALSE, FALSE, NULL, error); -+ return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, NULL, FALSE, FALSE, NULL, error); +- return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, FALSE, NULL, error); ++ return flatpak_transaction_add_ref (self, remote, decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, NULL, NULL, NULL, FALSE, NULL, error); } /** -@@ -2926,12 +2960,12 @@ flatpak_transaction_add_rebase_and_uninstall (FlatpakTransaction *self, +@@ -2919,12 +2953,12 @@ flatpak_transaction_add_rebase_and_uninstall (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, new_decomposed, subpaths, previous_ids, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, -- NULL, NULL, FALSE, FALSE, &rebase_op, error)) -+ NULL, NULL, NULL, FALSE, FALSE, &rebase_op, error)) +- NULL, NULL, FALSE, &rebase_op, error)) ++ NULL, NULL, NULL, FALSE, &rebase_op, error)) return FALSE; if (!flatpak_transaction_add_ref (self, NULL, old_decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, -- NULL, NULL, FALSE, FALSE, &uninstall_op, &local_error)) -+ NULL, NULL, NULL, FALSE, FALSE, &uninstall_op, &local_error)) +- NULL, NULL, FALSE, &uninstall_op, &local_error)) ++ NULL, NULL, NULL, FALSE, &uninstall_op, &local_error)) { /* If the user is trying to install an eol-rebased app from scratch, the * @old_ref can’t be uninstalled because it’s not installed already. -@@ -2984,6 +3018,36 @@ flatpak_transaction_add_install_bundle (FlatpakTransaction *self, +@@ -2980,6 +3014,36 @@ flatpak_transaction_add_install_bundle (FlatpakTransaction *self, return TRUE; } @@ -2370,52 +2370,34 @@ index ac92469..ddc0318 100644 /** * flatpak_transaction_add_install_flatpakref: * @self: a #FlatpakTransaction -@@ -3091,7 +3155,7 @@ flatpak_transaction_add_sync_preinstalled (FlatpakTransaction *self, - - if (!flatpak_transaction_add_ref (self, remote, decomposed, NULL, NULL, NULL, - FLATPAK_TRANSACTION_OPERATION_INSTALL, -- NULL, NULL, FALSE, TRUE, NULL, -+ NULL, NULL, NULL, FALSE, TRUE, NULL, - &local_error)) - g_info ("Failed to add preinstall ref %s: %s", flatpak_decomposed_get_ref (decomposed), - local_error->message); -@@ -3116,7 +3180,7 @@ flatpak_transaction_add_sync_preinstalled (FlatpakTransaction *self, - - g_info ("Preinstalled ref %s is no longer listed as wanted in preinstall.d config; uninstalling", flatpak_decomposed_get_ref (decomposed)); - -- if (!flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, FALSE, TRUE, NULL, &local_error)) -+ if (!flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, NULL, FALSE, TRUE, NULL, &local_error)) - { - if (!g_error_matches (local_error, FLATPAK_ERROR, FLATPAK_ERROR_NOT_INSTALLED)) - { -@@ -3166,7 +3230,7 @@ flatpak_transaction_add_update (FlatpakTransaction *self, +@@ -3046,7 +3110,7 @@ flatpak_transaction_add_update (FlatpakTransaction *self, return FALSE; /* Note: we implement the merge when subpaths == NULL in flatpak_transaction_add_ref() */ -- return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, FALSE, FALSE, NULL, error); -+ return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, NULL, FALSE, FALSE, NULL, error); +- return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, FALSE, NULL, error); ++ return flatpak_transaction_add_ref (self, NULL, decomposed, subpaths, NULL, commit, FLATPAK_TRANSACTION_OPERATION_UPDATE, NULL, NULL, NULL, FALSE, NULL, error); } /** -@@ -3193,7 +3257,7 @@ flatpak_transaction_add_uninstall (FlatpakTransaction *self, +@@ -3073,7 +3137,7 @@ flatpak_transaction_add_uninstall (FlatpakTransaction *self, if (decomposed == NULL) return FALSE; -- return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, FALSE, FALSE, NULL, error); -+ return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, NULL, FALSE, FALSE, NULL, error); +- return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, FALSE, NULL, error); ++ return flatpak_transaction_add_ref (self, NULL, decomposed, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_UNINSTALL, NULL, NULL, NULL, FALSE, NULL, error); } static gboolean -@@ -3305,7 +3369,7 @@ flatpak_transaction_add_auto_install (FlatpakTransaction *self, +@@ -3185,7 +3249,7 @@ flatpak_transaction_add_auto_install (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, auto_install_ref, NULL, NULL, NULL, FLATPAK_TRANSACTION_OPERATION_INSTALL_OR_UPDATE, -- NULL, NULL, FALSE, FALSE, NULL, -+ NULL, NULL, NULL, FALSE, FALSE, NULL, +- NULL, NULL, FALSE, NULL, ++ NULL, NULL, NULL, FALSE, NULL, &local_error)) g_info ("Failed to add auto-install ref %s: %s", flatpak_decomposed_get_ref (auto_install_ref), local_error->message); -@@ -3403,6 +3467,7 @@ static gboolean +@@ -3283,6 +3347,7 @@ static gboolean mark_op_resolved (FlatpakTransactionOperation *op, const char *commit, GFile *sideload_path, @@ -2423,7 +2405,7 @@ index ac92469..ddc0318 100644 GBytes *metadata, GBytes *old_metadata, GError **error) -@@ -3411,7 +3476,7 @@ mark_op_resolved (FlatpakTransactionOperation *op, +@@ -3291,7 +3356,7 @@ mark_op_resolved (FlatpakTransactionOperation *op, g_assert (op != NULL); @@ -2432,7 +2414,7 @@ index ac92469..ddc0318 100644 op->resolved = TRUE; -@@ -3424,6 +3489,9 @@ mark_op_resolved (FlatpakTransactionOperation *op, +@@ -3304,6 +3369,9 @@ mark_op_resolved (FlatpakTransactionOperation *op, if (sideload_path) op->resolved_sideload_path = g_object_ref (sideload_path); @@ -2442,7 +2424,7 @@ index ac92469..ddc0318 100644 if (metadata) { g_autoptr(GKeyFile) metakey = g_key_file_new (); -@@ -3457,13 +3525,14 @@ resolve_op_end (FlatpakTransaction *self, +@@ -3337,13 +3405,14 @@ resolve_op_end (FlatpakTransaction *self, FlatpakTransactionOperation *op, const char *checksum, GFile *sideload_path, @@ -2458,7 +2440,7 @@ index ac92469..ddc0318 100644 return FALSE; emit_eol_and_maybe_skip (self, op); return TRUE; -@@ -3514,7 +3583,7 @@ resolve_op_from_commit (FlatpakTransaction *self, +@@ -3394,7 +3463,7 @@ resolve_op_from_commit (FlatpakTransaction *self, flatpak_decomposed_get_ref (eolr_decomposed)); } @@ -2467,7 +2449,7 @@ index ac92469..ddc0318 100644 } /* NOTE: In case of non-available summary this returns FALSE with a -@@ -3579,7 +3648,7 @@ try_resolve_op_from_metadata (FlatpakTransaction *self, +@@ -3459,7 +3528,7 @@ try_resolve_op_from_metadata (FlatpakTransaction *self, } } @@ -2476,7 +2458,7 @@ index ac92469..ddc0318 100644 } static gboolean -@@ -3622,7 +3691,7 @@ resolve_ops (FlatpakTransaction *self, +@@ -3502,7 +3571,7 @@ resolve_ops (FlatpakTransaction *self, * checksum we got was the version already installed. */ g_assert (op->resolved_commit != NULL); @@ -2485,7 +2467,7 @@ index ac92469..ddc0318 100644 return FALSE; continue; } -@@ -3637,7 +3706,7 @@ resolve_ops (FlatpakTransaction *self, +@@ -3517,7 +3586,7 @@ resolve_ops (FlatpakTransaction *self, op->skip = TRUE; continue; } @@ -2494,7 +2476,7 @@ index ac92469..ddc0318 100644 return FALSE; continue; } -@@ -3645,7 +3714,7 @@ resolve_ops (FlatpakTransaction *self, +@@ -3525,7 +3594,7 @@ resolve_ops (FlatpakTransaction *self, if (op->kind == FLATPAK_TRANSACTION_OPERATION_INSTALL_BUNDLE) { g_assert (op->commit != NULL); @@ -2503,7 +2485,7 @@ index ac92469..ddc0318 100644 return FALSE; continue; } -@@ -3669,8 +3738,13 @@ resolve_ops (FlatpakTransaction *self, +@@ -3549,8 +3618,13 @@ resolve_ops (FlatpakTransaction *self, if (state == NULL) return FALSE; @@ -2518,12 +2500,12 @@ index ac92469..ddc0318 100644 { g_autoptr(GVariant) commit_data = flatpak_dir_read_latest_commit (priv->dir, op->remote, op->ref, &checksum, NULL, error); -@@ -4808,7 +4882,74 @@ flatpak_transaction_resolve_bundles (FlatpakTransaction *self, +@@ -4688,7 +4762,74 @@ flatpak_transaction_resolve_bundles (FlatpakTransaction *self, if (!flatpak_transaction_add_ref (self, remote, ref, NULL, NULL, commit, FLATPAK_TRANSACTION_OPERATION_INSTALL_BUNDLE, -- data->file, metadata, FALSE, FALSE, NULL, error)) -+ data->file, NULL, metadata, FALSE, FALSE, NULL, error)) +- data->file, metadata, FALSE, NULL, error)) ++ data->file, NULL, metadata, FALSE, NULL, error)) + return FALSE; + } + @@ -2590,11 +2572,11 @@ index ac92469..ddc0318 100644 + + if (!flatpak_transaction_add_ref (self, remote, ref, NULL, NULL, NULL, + FLATPAK_TRANSACTION_OPERATION_INSTALL, -+ NULL, image_source, metadata_label, FALSE, FALSE, &op, error)) ++ NULL, image_source, metadata_label, FALSE, &op, error)) return FALSE; } -@@ -4867,7 +5008,7 @@ _run_op_kind (FlatpakTransaction *self, +@@ -4747,7 +4888,7 @@ _run_op_kind (FlatpakTransaction *self, emit_new_op (self, op, progress); @@ -2603,7 +2585,7 @@ index ac92469..ddc0318 100644 if (op->resolved_metakey && !flatpak_check_required_version (flatpak_decomposed_get_ref (op->ref), op->resolved_metakey, &local_error)) -@@ -4886,6 +5027,7 @@ _run_op_kind (FlatpakTransaction *self, +@@ -4765,6 +4906,7 @@ _run_op_kind (FlatpakTransaction *self, (const char **) op->subpaths, (const char **) op->previous_ids, op->resolved_sideload_path, @@ -2611,7 +2593,7 @@ index ac92469..ddc0318 100644 op->resolved_metadata, op->resolved_token, progress->progress_obj, -@@ -4959,6 +5101,7 @@ _run_op_kind (FlatpakTransaction *self, +@@ -4838,6 +4980,7 @@ _run_op_kind (FlatpakTransaction *self, (const char **) op->subpaths, (const char **) op->previous_ids, op->resolved_sideload_path, @@ -2619,7 +2601,7 @@ index ac92469..ddc0318 100644 op->resolved_metadata, op->resolved_token, progress->progress_obj, -@@ -5273,6 +5416,12 @@ flatpak_transaction_real_run (FlatpakTransaction *self, +@@ -5149,6 +5292,12 @@ flatpak_transaction_real_run (FlatpakTransaction *self, return FALSE; } @@ -2633,7 +2615,7 @@ index ac92469..ddc0318 100644 if (!resolve_all_ops (self, cancellable, error)) { diff --git a/common/flatpak-transaction.h b/common/flatpak-transaction.h -index 6e67a7b..71f7e19 100644 +index 0b8f2de8..3d3f4ce8 100644 --- a/common/flatpak-transaction.h +++ b/common/flatpak-transaction.h @@ -326,6 +326,10 @@ gboolean flatpak_transaction_add_install_bundle (FlatpakTransaction * @@ -2648,10 +2630,10 @@ index 6e67a7b..71f7e19 100644 GBytes *flatpakref_data, GError **error); diff --git a/system-helper/flatpak-system-helper.c b/system-helper/flatpak-system-helper.c -index 263bf0b..6c117de 100644 +index a4d9708b..2740b299 100644 --- a/system-helper/flatpak-system-helper.c +++ b/system-helper/flatpak-system-helper.c -@@ -642,7 +642,7 @@ handle_deploy (FlatpakSystemHelper *object, +@@ -640,7 +640,7 @@ handle_deploy (FlatpakSystemHelper *object, return G_DBUS_METHOD_INVOCATION_HANDLED; } @@ -2660,7 +2642,7 @@ index 263bf0b..6c117de 100644 FLATPAK_PULL_FLAGS_NONE, OSTREE_REPO_PULL_FLAGS_UNTRUSTED, NULL, NULL, &error)) { -@@ -877,11 +877,11 @@ handle_deploy_appstream (FlatpakSystemHelper *object, +@@ -874,11 +874,11 @@ handle_deploy_appstream (FlatpakSystemHelper *object, return G_DBUS_METHOD_INVOCATION_HANDLED; } @@ -2677,10 +2659,10 @@ index 263bf0b..6c117de 100644 -- 2.47.1 -From 3b5959db9b22fc77c988db78e82df3a56afa43fb Mon Sep 17 00:00:00 2001 +From 7ef02411fc7209bd1072c13d0e08b95a9c579b0f Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Wed, 18 Dec 2024 00:40:45 +0100 -Subject: [PATCH 07/12] builtins/install: Create install transaction in common +Subject: [PATCH 07/12]builtins/install: Create install transaction in common function --- @@ -2688,7 +2670,7 @@ Subject: [PATCH 07/12] builtins/install: Create install transaction in common 1 file changed, 33 insertions(+), 52 deletions(-) diff --git a/app/flatpak-builtins-install.c b/app/flatpak-builtins-install.c -index d4d9ae3..c5132da 100644 +index d4d9ae30..c5132da6 100644 --- a/app/flatpak-builtins-install.c +++ b/app/flatpak-builtins-install.c @@ -129,6 +129,36 @@ read_gpg_data (GCancellable *cancellable, @@ -2816,10 +2798,10 @@ index d4d9ae3..c5132da 100644 -- 2.47.1 -From 575943dad6c67eb2fb9e2503bedfa6ec86f4e819 Mon Sep 17 00:00:00 2001 +From 920b48c7a53b9bff543827309c974a9c7824068f Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Wed, 18 Dec 2024 00:53:59 +0100 -Subject: [PATCH 08/12] builtins/install: Allow direct installation from OCI +Subject: [PATCH 08/12]builtins/install: Allow direct installation from OCI images Similar to bundle installs, add: @@ -2838,7 +2820,7 @@ Flatpaks on disconnected systems. 5 files changed, 129 insertions(+), 12 deletions(-) diff --git a/app/flatpak-builtins-install.c b/app/flatpak-builtins-install.c -index c5132da..70474bb 100644 +index c5132da6..70474bbe 100644 --- a/app/flatpak-builtins-install.c +++ b/app/flatpak-builtins-install.c @@ -56,6 +56,7 @@ static gboolean opt_include_sdk; @@ -2939,7 +2921,7 @@ index c5132da..70474bb 100644 return usage_error (context, _("At least one REF must be specified"), error); diff --git a/app/flatpak-cli-transaction.c b/app/flatpak-cli-transaction.c -index e7c8c90..8c02c55 100644 +index e7c8c90f..8c02c552 100644 --- a/app/flatpak-cli-transaction.c +++ b/app/flatpak-cli-transaction.c @@ -1350,7 +1350,7 @@ transaction_ready_pre_auth (FlatpakTransaction *transaction) @@ -2952,7 +2934,7 @@ index e7c8c90..8c02c55 100644 /* These caches may no longer be valid once the transaction runs */ g_clear_pointer (&self->runtime_app_map, g_hash_table_unref); diff --git a/doc/flatpak-install.xml b/doc/flatpak-install.xml -index ab4bb1f..f75deda 100644 +index ab4bb1fb..f75dedae 100644 --- a/doc/flatpak-install.xml +++ b/doc/flatpak-install.xml @@ -38,7 +38,7 @@ @@ -3001,7 +2983,7 @@ index ab4bb1f..f75deda 100644 diff --git a/tests/test-oci-registry.sh b/tests/test-oci-registry.sh -index da234de..9503656 100755 +index da234ded..9503656b 100755 --- a/tests/test-oci-registry.sh +++ b/tests/test-oci-registry.sh @@ -23,7 +23,7 @@ set -euo pipefail @@ -3049,7 +3031,7 @@ index da234de..9503656 100755 + ok "install image from registry # skip Not supported" +fi diff --git a/tests/test-oci.sh b/tests/test-oci.sh -index a7baf88..431fa6d 100755 +index a7baf887..431fa6d6 100755 --- a/tests/test-oci.sh +++ b/tests/test-oci.sh @@ -23,7 +23,7 @@ set -euo pipefail @@ -3088,10 +3070,10 @@ index a7baf88..431fa6d 100755 -- 2.47.1 -From 13b4a9690fd1c914e3d27d404bfad9467f1b8703 Mon Sep 17 00:00:00 2001 +From 3996759b7553c41bea63fb282cbf3fa0f9a78e4e Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Fri, 20 Dec 2024 00:25:55 +0100 -Subject: [PATCH 09/12] oci-registry: Remove a bunch of double newlines +Subject: [PATCH 09/12]oci-registry: Remove a bunch of double newlines --- common/flatpak-oci-registry-private.h | 1 - @@ -3099,7 +3081,7 @@ Subject: [PATCH 09/12] oci-registry: Remove a bunch of double newlines 2 files changed, 7 deletions(-) diff --git a/common/flatpak-oci-registry-private.h b/common/flatpak-oci-registry-private.h -index 47ffc7b..a051b0a 100644 +index 47ffc7be..a051b0a6 100644 --- a/common/flatpak-oci-registry-private.h +++ b/common/flatpak-oci-registry-private.h @@ -183,7 +183,6 @@ GBytes *flatpak_oci_index_make_appstream (FlatpakHttpSession *http_session, @@ -3111,7 +3093,7 @@ index 47ffc7b..a051b0a 100644 guint64 pulled_size, guint32 n_layers, diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c -index ad05c9f..e104ab4 100644 +index ad05c9f0..e104ab40 100644 --- a/common/flatpak-oci-registry.c +++ b/common/flatpak-oci-registry.c @@ -255,7 +255,6 @@ flatpak_oci_registry_set_token (FlatpakOciRegistry *self, @@ -3165,17 +3147,17 @@ index ad05c9f..e104ab4 100644 -- 2.47.1 -From f0b4b4f1a522cfbad5565a248eef671729f86857 Mon Sep 17 00:00:00 2001 +From fcad7d86d287d164421d62589a70bb9699a66f08 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Fri, 20 Dec 2024 00:27:29 +0100 -Subject: [PATCH 10/12] oci-registry: Allow passing a NULL URI +Subject: [PATCH 10/12]oci-registry: Allow passing a NULL URI --- common/flatpak-oci-registry.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c -index e104ab4..a4b914a 100644 +index e104ab40..a4b914a0 100644 --- a/common/flatpak-oci-registry.c +++ b/common/flatpak-oci-registry.c @@ -142,10 +142,13 @@ flatpak_oci_registry_set_property (GObject *object, @@ -3199,10 +3181,10 @@ index e104ab4..a4b914a 100644 -- 2.47.1 -From 36b43b17ffa210b0bc4a8a7d246e6ba84010527f Mon Sep 17 00:00:00 2001 +From 96b50f2f632b57c9f6608a7820d282225afef46b Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Wed, 18 Dec 2024 00:53:59 +0100 -Subject: [PATCH 11/12] image-source: Support `oci-archive:` image sources +Subject: [PATCH 11/12]image-source: Support `oci-archive:` image sources Add support for `oci-archive:` image sources by temporarily unpacking the archive using libarchive. @@ -3219,7 +3201,7 @@ Co-authored-by: Sebastian Wick 7 files changed, 297 insertions(+), 45 deletions(-) diff --git a/app/flatpak-builtins-install.c b/app/flatpak-builtins-install.c -index 70474bb..e1f7f31 100644 +index 70474bbe..e1f7f312 100644 --- a/app/flatpak-builtins-install.c +++ b/app/flatpak-builtins-install.c @@ -352,6 +352,7 @@ flatpak_builtin_install (int argc, char **argv, GCancellable *cancellable, GErro @@ -3231,7 +3213,7 @@ index 70474bb..e1f7f31 100644 opt_image = TRUE; else if (flatpak_file_arg_has_suffix (argv[1], ".flatpakref")) diff --git a/common/flatpak-image-source.c b/common/flatpak-image-source.c -index 0503de5..20c94b6 100644 +index 0503de5d..20c94b63 100644 --- a/common/flatpak-image-source.c +++ b/common/flatpak-image-source.c @@ -116,24 +116,15 @@ flatpak_image_source_new (FlatpakOciRegistry *registry, @@ -3310,7 +3292,7 @@ index 0503de5..20c94b6 100644 { g_autoptr(FlatpakOciRegistry) registry = NULL; diff --git a/common/flatpak-oci-registry-private.h b/common/flatpak-oci-registry-private.h -index a051b0a..d48c8ed 100644 +index a051b0a6..d48c8ed4 100644 --- a/common/flatpak-oci-registry-private.h +++ b/common/flatpak-oci-registry-private.h @@ -50,11 +50,15 @@ typedef struct FlatpakOciLayerWriter FlatpakOciLayerWriter; @@ -3335,7 +3317,7 @@ index a051b0a..d48c8ed 100644 const char *token); gboolean flatpak_oci_registry_is_local (FlatpakOciRegistry *self); diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c -index a4b914a..ebf000f 100644 +index a4b914a0..ebf000f8 100644 --- a/common/flatpak-oci-registry.c +++ b/common/flatpak-oci-registry.c @@ -27,6 +27,7 @@ @@ -3702,10 +3684,10 @@ index a4b914a..ebf000f 100644 flatpak_oci_layer_writer_reset (FlatpakOciLayerWriter *self) { diff --git a/common/flatpak-transaction.c b/common/flatpak-transaction.c -index baf9075..b72a9bd 100644 +index ffee385e..1aba1daa 100644 --- a/common/flatpak-transaction.c +++ b/common/flatpak-transaction.c -@@ -3035,7 +3035,7 @@ flatpak_transaction_add_install_bundle (FlatpakTransaction *self, +@@ -3028,7 +3028,7 @@ flatpak_transaction_add_install_bundle (FlatpakTransaction *self, * reference. * * @image_location is specified in containers-transports(5) form. Only a subset @@ -3715,7 +3697,7 @@ index baf9075..b72a9bd 100644 * Returns: %TRUE on success; %FALSE with @error set on failure. */ diff --git a/doc/flatpak-install.xml b/doc/flatpak-install.xml -index f75deda..99aa546 100644 +index f75dedae..99aa5469 100644 --- a/doc/flatpak-install.xml +++ b/doc/flatpak-install.xml @@ -145,8 +145,8 @@ @@ -3730,7 +3712,7 @@ index f75deda..99aa546 100644 diff --git a/tests/test-oci.sh b/tests/test-oci.sh -index 431fa6d..861310a 100755 +index 431fa6d6..861310a5 100755 --- a/tests/test-oci.sh +++ b/tests/test-oci.sh @@ -23,7 +23,7 @@ set -euo pipefail @@ -3772,10 +3754,10 @@ index 431fa6d..861310a 100755 -- 2.47.1 -From ac197c01494df5af00a480ca4162fd1aa6d1b6cc Mon Sep 17 00:00:00 2001 +From a2fbcf5d1db3ef69b04e7f0e4bc64c0e51dd7ffb Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 29 Oct 2024 16:59:40 -0400 -Subject: [PATCH 12/12] common: Move delta_url into the FlatpakImageSource +Subject: [PATCH 12/12]common: Move delta_url into the FlatpakImageSource Instead of passing the delta URL along with the image source, when we create an image source for a remote registry, if we find a delta @@ -3794,7 +3776,7 @@ repository based on a summary lookup into one place. 7 files changed, 89 insertions(+), 97 deletions(-) diff --git a/app/flatpak-builtins-build-import-bundle.c b/app/flatpak-builtins-build-import-bundle.c -index d79fbbd..d623386 100644 +index d79fbbde..d623386f 100644 --- a/app/flatpak-builtins-build-import-bundle.c +++ b/app/flatpak-builtins-build-import-bundle.c @@ -69,7 +69,7 @@ import_oci (OstreeRepo *repo, GFile *file, @@ -3807,10 +3789,10 @@ index d79fbbd..d623386 100644 if (commit_checksum == NULL) return NULL; diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index 88c0106..5a879a2 100644 +index e8ff645b..9f398252 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c -@@ -1086,14 +1086,14 @@ flatpak_remote_state_new_image_source (FlatpakRemoteState *self, +@@ -1077,14 +1077,14 @@ flatpak_remote_state_new_image_source (FlatpakRemoteState *self, return g_steal_pointer (&image_source); } @@ -3833,7 +3815,7 @@ index 88c0106..5a879a2 100644 { g_autoptr(FlatpakImageSource) image_source = NULL; g_autofree char *oci_digest = NULL; -@@ -1101,9 +1101,7 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, +@@ -1092,9 +1092,7 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, VarRefInfoRef latest_rev_info; VarMetadataRef metadata; const char *oci_repository = NULL; @@ -3844,7 +3826,7 @@ index 88c0106..5a879a2 100644 /* We extract the rev info from the latest, even if we don't use the latest digest, assuming refs don't move */ if (!flatpak_remote_state_lookup_ref (self, ref, &latest_rev, NULL, &latest_rev_info, NULL, error)) -@@ -1119,8 +1117,9 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, +@@ -1110,8 +1108,9 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, metadata = var_ref_info_get_metadata (latest_rev_info); oci_repository = var_metadata_lookup_string (metadata, "xa.oci-repository", NULL); @@ -3855,7 +3837,7 @@ index 88c0106..5a879a2 100644 image_source = flatpak_remote_state_new_image_source (self, oci_repository, oci_digest, token, cancellable, error); if (image_source == NULL) -@@ -1132,22 +1131,28 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, +@@ -1123,22 +1122,28 @@ flatpak_remote_state_fetch_commit_object_oci (FlatpakRemoteState *self, return NULL; } @@ -3898,7 +3880,7 @@ index 88c0106..5a879a2 100644 } static GVariant * -@@ -6095,49 +6100,18 @@ flatpak_dir_mirror_oci (FlatpakDir *self, +@@ -5910,49 +5915,18 @@ flatpak_dir_mirror_oci (FlatpakDir *self, GError **error) { g_autoptr(FlatpakImageSource) image_source = NULL; @@ -3952,7 +3934,7 @@ index 88c0106..5a879a2 100644 progress, cancellable, error); if (!res) -@@ -6162,8 +6136,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -5977,8 +5951,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, { g_autoptr(FlatpakImageSource) image_source = NULL; FlatpakOciRegistry *registry = NULL; @@ -3962,7 +3944,7 @@ index 88c0106..5a879a2 100644 g_autofree char *checksum = NULL; g_autofree char *latest_alt_commit = NULL; G_GNUC_UNUSED g_autofree char *latest_commit = -@@ -6171,35 +6144,11 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -5986,35 +5959,11 @@ flatpak_dir_pull_oci (FlatpakDir *self, g_autofree char *name = NULL; if (opt_image_source) @@ -4001,7 +3983,7 @@ index 88c0106..5a879a2 100644 /* Short circuit if we've already got this commit */ if (latest_alt_commit != NULL && strcmp (oci_digest + strlen ("sha256:"), latest_alt_commit) == 0) -@@ -6212,7 +6161,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, +@@ -6027,7 +5976,7 @@ flatpak_dir_pull_oci (FlatpakDir *self, g_info ("Pulling OCI image %s", oci_digest); @@ -4011,7 +3993,7 @@ index 88c0106..5a879a2 100644 if (checksum == NULL) diff --git a/common/flatpak-image-source-private.h b/common/flatpak-image-source-private.h -index b1e5d2f..94e4cc1 100644 +index b1e5d2fa..94e4cc1a 100644 --- a/common/flatpak-image-source-private.h +++ b/common/flatpak-image-source-private.h @@ -47,10 +47,13 @@ FlatpakImageSource *flatpak_image_source_new_for_location (const char *locatio @@ -4035,7 +4017,7 @@ index b1e5d2f..94e4cc1 100644 +GVariant *flatpak_image_source_make_fake_commit (FlatpakImageSource *image_source); #endif /* __FLATPAK_IMAGE_SOURCE_H__ */ diff --git a/common/flatpak-image-source.c b/common/flatpak-image-source.c -index 20c94b6..9d13cf0 100644 +index 20c94b63..9d13cf0d 100644 --- a/common/flatpak-image-source.c +++ b/common/flatpak-image-source.c @@ -31,6 +31,7 @@ struct _FlatpakImageSource @@ -4105,7 +4087,7 @@ index 20c94b6..9d13cf0 100644 + ostree_checksum_to_bytes_v ("0000000000000000000000000000000000000000000000000000000000000000"))); +} diff --git a/common/flatpak-oci-registry-private.h b/common/flatpak-oci-registry-private.h -index d48c8ed..7867c76 100644 +index d48c8ed4..7867c761 100644 --- a/common/flatpak-oci-registry-private.h +++ b/common/flatpak-oci-registry-private.h @@ -195,7 +195,6 @@ typedef void (*FlatpakOciPullProgress) (guint64 total_size, @@ -4125,7 +4107,7 @@ index d48c8ed..7867c76 100644 FlatpakOciPullProgress progress_cb, gpointer progress_data, diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c -index ebf000f..c3dff5d 100644 +index ebf000f8..c3dff5d6 100644 --- a/common/flatpak-oci-registry.c +++ b/common/flatpak-oci-registry.c @@ -3658,7 +3658,6 @@ flatpak_mirror_image_from_oci (FlatpakOciRegistry *dst_registry, @@ -4161,10 +4143,10 @@ index ebf000f..c3dff5d 100644 gboolean force_disable_deltas = (flags & FLATPAK_PULL_FLAGS_NO_STATIC_DELTAS) != 0; g_autoptr(OstreeMutableTree) archive_mtree = NULL; diff --git a/system-helper/flatpak-system-helper.c b/system-helper/flatpak-system-helper.c -index 6c117de..623c2fa 100644 +index 2740b299..1f950b20 100644 --- a/system-helper/flatpak-system-helper.c +++ b/system-helper/flatpak-system-helper.c -@@ -595,7 +595,7 @@ handle_deploy (FlatpakSystemHelper *object, +@@ -593,7 +593,7 @@ handle_deploy (FlatpakSystemHelper *object, return G_DBUS_METHOD_INVOCATION_HANDLED; } diff --git a/flatpak-implement-etc-containers-certs-for-oci-registries.patch b/flatpak-implement-etc-containers-certs-for-oci-registries.patch index 37e1853..361ecb7 100644 --- a/flatpak-implement-etc-containers-certs-for-oci-registries.patch +++ b/flatpak-implement-etc-containers-certs-for-oci-registries.patch @@ -1,14 +1,15 @@ From cec97aac1c9fad9b5bc18d1166b63edb13ca2bcc Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 17 Dec 2024 15:35:21 +0100 -Subject: [PATCH 1/9] tests/oci-registry-client.py: Drop python2 compatibility +Subject: [PATCH 01/09] tests/oci-registry-client.py: Drop python2 + compatibility --- tests/oci-registry-client.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/tests/oci-registry-client.py b/tests/oci-registry-client.py -index 7f1eeb5453..b9ca63d70d 100644 +index 7f1eeb54..b9ca63d7 100644 --- a/tests/oci-registry-client.py +++ b/tests/oci-registry-client.py @@ -2,12 +2,9 @@ @@ -27,7 +28,7 @@ index 7f1eeb5453..b9ca63d70d 100644 if sys.argv[2] == 'add': detach_icons = '--detach-icons' in sys.argv -@@ -16,8 +13,8 @@ +@@ -16,8 +13,8 @@ if sys.argv[2] == 'add': params = {'d': sys.argv[5]} if detach_icons: params['detach-icons'] = 1 @@ -38,7 +39,7 @@ index 7f1eeb5453..b9ca63d70d 100644 path = "/testing/{repo}/{tag}?{query}".format(repo=sys.argv[3], tag=sys.argv[4], query=query) -@@ -28,7 +25,7 @@ +@@ -28,7 +25,7 @@ if sys.argv[2] == 'add': print("Failed: status={}".format(response.status), file=sys.stderr) sys.exit(1) elif sys.argv[2] == 'delete': @@ -47,11 +48,13 @@ index 7f1eeb5453..b9ca63d70d 100644 path = "/testing/{repo}/{ref}".format(repo=sys.argv[3], ref=sys.argv[4]) conn.request("DELETE", path) +-- +2.47.1 From d8ce35c9d1c0b1c83127b07abe9b3479170cc8f6 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 17 Dec 2024 15:41:53 +0100 -Subject: [PATCH 2/9] tests/oci-registry-client.py: Parse URL parameter +Subject: [PATCH 02/09] tests/oci-registry-client.py: Parse URL parameter --- tests/oci-registry-client.py | 9 +++++++-- @@ -59,10 +62,10 @@ Subject: [PATCH 2/9] tests/oci-registry-client.py: Parse URL parameter 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/tests/oci-registry-client.py b/tests/oci-registry-client.py -index b9ca63d70d..cd835609ad 100644 +index b9ca63d7..cd835609 100644 --- a/tests/oci-registry-client.py +++ b/tests/oci-registry-client.py -@@ -6,6 +6,11 @@ +@@ -6,6 +6,11 @@ import http.client import urllib.parse @@ -74,7 +77,7 @@ index b9ca63d70d..cd835609ad 100644 if sys.argv[2] == 'add': detach_icons = '--detach-icons' in sys.argv if detach_icons: -@@ -14,7 +19,7 @@ +@@ -14,7 +19,7 @@ if sys.argv[2] == 'add': if detach_icons: params['detach-icons'] = 1 query = urllib.parse.urlencode(params) @@ -83,7 +86,7 @@ index b9ca63d70d..cd835609ad 100644 path = "/testing/{repo}/{tag}?{query}".format(repo=sys.argv[3], tag=sys.argv[4], query=query) -@@ -25,7 +30,7 @@ +@@ -25,7 +30,7 @@ if sys.argv[2] == 'add': print("Failed: status={}".format(response.status), file=sys.stderr) sys.exit(1) elif sys.argv[2] == 'delete': @@ -93,7 +96,7 @@ index b9ca63d70d..cd835609ad 100644 ref=sys.argv[4]) conn.request("DELETE", path) diff --git a/tests/test-oci-registry.sh b/tests/test-oci-registry.sh -index 8eb154f5ea..51a6142fe8 100755 +index 8eb154f5..51a6142f 100755 --- a/tests/test-oci-registry.sh +++ b/tests/test-oci-registry.sh @@ -29,7 +29,7 @@ echo "1..14" @@ -105,11 +108,13 @@ index 8eb154f5ea..51a6142fe8 100755 setup_repo_no_add oci +-- +2.47.1 From 0757171aa07f3b8d390881e0765de09ed77d4825 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 17 Dec 2024 15:47:07 +0100 -Subject: [PATCH 3/9] tests/oci-registry-client.py: Convert to argparse +Subject: [PATCH 03/09] tests/oci-registry-client.py: Convert to argparse --- tests/oci-registry-client.py | 57 +++++++++++++++++++++++------------- @@ -120,7 +125,7 @@ Subject: [PATCH 3/9] tests/oci-registry-client.py: Convert to argparse diff --git a/tests/oci-registry-client.py b/tests/oci-registry-client.py old mode 100644 new mode 100755 -index cd835609ad..5654062bec +index cd835609..5654062b --- a/tests/oci-registry-client.py +++ b/tests/oci-registry-client.py @@ -1,45 +1,62 @@ @@ -207,7 +212,7 @@ index cd835609ad..5654062bec +args = parser.parse_args() +args.func(args) diff --git a/tests/test-oci-registry.sh b/tests/test-oci-registry.sh -index 51a6142fe8..bc2f138b96 100755 +index 51a6142f..bc2f138b 100755 --- a/tests/test-oci-registry.sh +++ b/tests/test-oci-registry.sh @@ -29,7 +29,7 @@ echo "1..14" @@ -219,11 +224,13 @@ index 51a6142fe8..bc2f138b96 100755 setup_repo_no_add oci +-- +2.47.1 From f38197c03dc77b9192c6dbc59e175b3cb640614a Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Thu, 22 Aug 2024 02:43:13 -0400 -Subject: [PATCH 4/9] tests/oci-registry-server.py: Clean up Python style +Subject: [PATCH 04/09] tests/oci-registry-server.py: Clean up Python style --- .flake8 | 2 + @@ -233,17 +240,17 @@ Subject: [PATCH 4/9] tests/oci-registry-server.py: Clean up Python style diff --git a/.flake8 b/.flake8 new file mode 100644 -index 0000000000..7da1f9608e +index 00000000..7da1f960 --- /dev/null +++ b/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 100 diff --git a/tests/oci-registry-server.py b/tests/oci-registry-server.py -index 33c3b646b0..3050a88358 100755 +index 33c3b646..3050a883 100755 --- a/tests/oci-registry-server.py +++ b/tests/oci-registry-server.py -@@ -13,65 +13,61 @@ +@@ -13,65 +13,61 @@ import http.server as http_server repositories = {} icons = {} @@ -331,7 +338,7 @@ index 33c3b646b0..3050a88358 100755 matches[route_path[i][1:]] = path[i] elif route_path[i] != path[i]: return False -@@ -92,24 +88,25 @@ def do_GET(self): +@@ -92,24 +88,25 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): add_headers = {} @@ -370,7 +377,7 @@ index 33c3b646b0..3050a88358 100755 else: response = 404 -@@ -121,86 +118,89 @@ def do_GET(self): +@@ -121,86 +118,89 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): self.send_header("Content-Type", response_content_type) if response == 200 or response == 304: @@ -490,7 +497,7 @@ index 33c3b646b0..3050a88358 100755 images.append(image) -@@ -214,26 +214,26 @@ def do_POST(self): +@@ -214,26 +214,26 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): return def do_DELETE(self): @@ -526,7 +533,7 @@ index 33c3b646b0..3050a88358 100755 del manifests[t] modified() -@@ -245,22 +245,24 @@ def do_DELETE(self): +@@ -245,22 +245,24 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): self.end_headers() return @@ -557,11 +564,13 @@ index 33c3b646b0..3050a88358 100755 dir = None if len(sys.argv) >= 2 and len(sys.argv[1]) > 0: dir = sys.argv[1] +-- +2.47.1 From 47ff75860097afe0b07758b2457a52f0e6b94bd7 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Thu, 22 Aug 2024 02:47:19 -0400 -Subject: [PATCH 5/9] tests/oci-registry-server.py: Convert to argparse +Subject: [PATCH 05/09] tests/oci-registry-server.py: Convert to argparse --- tests/oci-registry-server.py | 15 ++++++++------- @@ -569,7 +578,7 @@ Subject: [PATCH 5/9] tests/oci-registry-server.py: Convert to argparse 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/oci-registry-server.py b/tests/oci-registry-server.py -index 3050a88358..65421f34c9 100755 +index 3050a883..65421f34 100755 --- a/tests/oci-registry-server.py +++ b/tests/oci-registry-server.py @@ -1,5 +1,6 @@ @@ -579,7 +588,7 @@ index 3050a88358..65421f34c9 100755 import base64 import hashlib import json -@@ -246,7 +247,7 @@ def do_DELETE(self): +@@ -246,7 +247,7 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): return @@ -610,7 +619,7 @@ index 3050a88358..65421f34c9 100755 - run(dir) + run(args) diff --git a/tests/test-oci-registry.sh b/tests/test-oci-registry.sh -index bc2f138b96..12036358fa 100755 +index bc2f138b..12036358 100755 --- a/tests/test-oci-registry.sh +++ b/tests/test-oci-registry.sh @@ -27,7 +27,7 @@ echo "1..14" @@ -622,11 +631,13 @@ index bc2f138b96..12036358fa 100755 port=$(cat httpd-port) client="python3 $test_srcdir/oci-registry-client.py --url=http://127.0.0.1:$port" +-- +2.47.1 From c2c2f3679608a32339dadb233dc11633f22b0793 Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Tue, 17 Dec 2024 16:39:16 +0100 -Subject: [PATCH 6/9] tests/oci-registry-server.py: Always get bytes for the +Subject: [PATCH 06/09] tests/oci-registry-server.py: Always get bytes for the response And sent the Content-Length header. @@ -635,10 +646,10 @@ And sent the Content-Length header. 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/tests/oci-registry-server.py b/tests/oci-registry-server.py -index 65421f34c9..13bf50b367 100755 +index 65421f34..13bf50b3 100755 --- a/tests/oci-registry-server.py +++ b/tests/oci-registry-server.py -@@ -5,7 +5,6 @@ +@@ -5,7 +5,6 @@ import base64 import hashlib import json import os @@ -655,7 +666,7 @@ index 65421f34c9..13bf50b367 100755 def cache_icon(data_uri): -@@ -62,7 +61,6 @@ def check_route(self, route): +@@ -62,7 +61,6 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): path = parts[0].split("/") route_path = route.split("/") @@ -663,7 +674,7 @@ index 65421f34c9..13bf50b367 100755 if len(route_path) != len(path): return False -@@ -82,34 +80,47 @@ def check_route(self, route): +@@ -82,34 +80,47 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): return True def do_GET(self): @@ -720,7 +731,7 @@ index 65421f34c9..13bf50b367 100755 self.send_response(response) for k, v in list(add_headers.items()): -@@ -123,16 +134,7 @@ def do_GET(self): +@@ -123,16 +134,7 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): self.end_headers() @@ -738,11 +749,13 @@ index 65421f34c9..13bf50b367 100755 def do_HEAD(self): return self.do_GET() +-- +2.47.1 From 85379a0fe6b79d216a29497980ce2c8e0ab46997 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 17 Dec 2024 16:41:38 +0100 -Subject: [PATCH 7/9] tests/oci-registry: Add support for SSL to client and +Subject: [PATCH 07/09] tests/oci-registry: Add support for SSL to client and server --- @@ -751,7 +764,7 @@ Subject: [PATCH 7/9] tests/oci-registry: Add support for SSL to client and 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/tests/oci-registry-client.py b/tests/oci-registry-client.py -index 5654062bec..c4707c07ec 100755 +index 5654062b..c4707c07 100755 --- a/tests/oci-registry-client.py +++ b/tests/oci-registry-client.py @@ -1,6 +1,7 @@ @@ -762,7 +775,7 @@ index 5654062bec..c4707c07ec 100755 import sys import http.client -@@ -9,7 +10,20 @@ +@@ -9,7 +10,20 @@ import urllib.parse def get_conn(args): parsed = urllib.parse.urlparse(args.url) @@ -795,10 +808,10 @@ index 5654062bec..c4707c07ec 100755 subparsers = parser.add_subparsers() subparsers.required = True diff --git a/tests/oci-registry-server.py b/tests/oci-registry-server.py -index 13bf50b367..2bbe8c6e8a 100755 +index 13bf50b3..2bbe8c6e 100755 --- a/tests/oci-registry-server.py +++ b/tests/oci-registry-server.py -@@ -5,6 +5,7 @@ +@@ -5,6 +5,7 @@ import base64 import hashlib import json import os @@ -806,7 +819,7 @@ index 13bf50b367..2bbe8c6e8a 100755 import time from urllib.parse import parse_qs -@@ -252,6 +253,19 @@ def do_DELETE(self): +@@ -252,6 +253,19 @@ class RequestHandler(http_server.BaseHTTPRequestHandler): def run(args): RequestHandler.protocol_version = "HTTP/1.0" httpd = http_server.HTTPServer(("127.0.0.1", 0), RequestHandler) @@ -848,11 +861,13 @@ index 13bf50b367..2bbe8c6e8a 100755 args = parser.parse_args() run(args) +-- +2.47.1 From 68b3fdcc0b00ee1080a1a3cd15dff33f1de6c0bf Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Fri, 23 Aug 2024 09:48:26 -0400 -Subject: [PATCH 8/9] common: Implement /etc/containers/certs.d for OCI +Subject: [PATCH 08/09] common: Implement /etc/containers/certs.d for OCI registries Docker and podman can be configured to use mutual TLS authentication @@ -882,7 +897,7 @@ Co-authored-by: Sebastian Wick 6 files changed, 440 insertions(+), 36 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml -index dbf44c1d4f..6cce2a6f57 100644 +index dbf44c1d..6cce2a6f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -52,7 +52,7 @@ jobs: @@ -895,7 +910,7 @@ index dbf44c1d4f..6cce2a6f57 100644 sudo mkdir /tmp/flatpak-com.example.App-OwnedByRoot - name: Check out flatpak diff --git a/common/flatpak-oci-registry.c b/common/flatpak-oci-registry.c -index ad595e53f9..6d36de2a16 100644 +index ad595e53..6d36de2a 100644 --- a/common/flatpak-oci-registry.c +++ b/common/flatpak-oci-registry.c @@ -76,7 +76,8 @@ struct FlatpakOciRegistry @@ -1137,7 +1152,7 @@ index ad595e53f9..6d36de2a16 100644 r, image, cancellable); diff --git a/common/flatpak-utils-http-private.h b/common/flatpak-utils-http-private.h -index 2c89ba4032..a930ee793b 100644 +index 2c89ba40..a930ee79 100644 --- a/common/flatpak-utils-http-private.h +++ b/common/flatpak-utils-http-private.h @@ -39,6 +39,15 @@ void flatpak_http_session_free (FlatpakHttpSession* http_session); @@ -1181,7 +1196,7 @@ index 2c89ba4032..a930ee793b 100644 int dest_dfd, const char *dest_subpath, diff --git a/common/flatpak-utils-http.c b/common/flatpak-utils-http.c -index 27de9c7a87..e8d5d724bd 100644 +index 27de9c7a..e8d5d724 100644 --- a/common/flatpak-utils-http.c +++ b/common/flatpak-utils-http.c @@ -73,6 +73,17 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (SoupURI, soup_uri_free) @@ -1680,7 +1695,7 @@ index 27de9c7a87..e8d5d724bd 100644 data.cache_data = cache_data; diff --git a/doc/flatpak-remote.xml b/doc/flatpak-remote.xml -index 798f5c392c..47a5a42ac4 100644 +index 798f5c39..47a5a42a 100644 --- a/doc/flatpak-remote.xml +++ b/doc/flatpak-remote.xml @@ -80,6 +80,12 @@ @@ -1697,7 +1712,7 @@ index 798f5c392c..47a5a42ac4 100644 diff --git a/tests/httpcache.c b/tests/httpcache.c -index a4550fb038..f6f9de6461 100644 +index a4550fb0..f6f9de64 100644 --- a/tests/httpcache.c +++ b/tests/httpcache.c @@ -32,7 +32,7 @@ main (int argc, char *argv[]) @@ -1709,11 +1724,13 @@ index a4550fb038..f6f9de6461 100644 flags, AT_FDCWD, dest, NULL, NULL, NULL, &error)) +-- +2.47.1 From cf555f02fcc1cf410fdad7607ff83a6764864a14 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 17 Dec 2024 17:47:35 +0100 -Subject: [PATCH 9/9] tests: Add tests for https OCI remotes +Subject: [PATCH 09/09] tests: Add tests for https OCI remotes --- tests/libtest.sh | 17 +++++-- @@ -1724,7 +1741,7 @@ Subject: [PATCH 9/9] tests: Add tests for https OCI remotes 5 files changed, 101 insertions(+), 20 deletions(-) diff --git a/tests/libtest.sh b/tests/libtest.sh -index d63810e1b7..7dad594fd2 100644 +index d63810e1..7dad594f 100644 --- a/tests/libtest.sh +++ b/tests/libtest.sh @@ -332,12 +332,16 @@ make_runtime () { @@ -1765,7 +1782,7 @@ index d63810e1b7..7dad594fd2 100644 if ! /bin/kill -0 "$DBUS_SESSION_BUS_PID"; then diff --git a/tests/test-matrix/meson.build b/tests/test-matrix/meson.build -index 151760484d..fd0b50345c 100644 +index 15176048..fd0b5034 100644 --- a/tests/test-matrix/meson.build +++ b/tests/test-matrix/meson.build @@ -17,8 +17,10 @@ wrapped_tests += {'name' : 'test-sideload@system.wrap', 'script' : 'test-sideloa @@ -1782,7 +1799,7 @@ index 151760484d..fd0b50345c 100644 wrapped_tests += {'name' : 'test-update-remote-configuration@oldsummary.wrap', 'script' : 'test-update-remote-configuration.sh'} wrapped_tests += {'name' : 'test-update-portal@user.wrap', 'script' : 'test-update-portal.sh'} diff --git a/tests/test-oci-registry.sh b/tests/test-oci-registry.sh -index 12036358fa..da234ded59 100755 +index 12036358..da234ded 100755 --- a/tests/test-oci-registry.sh +++ b/tests/test-oci-registry.sh @@ -27,9 +27,73 @@ echo "1..14" @@ -1952,7 +1969,7 @@ index 12036358fa..da234ded59 100755 assert_not_has_file $base/oci/hello-origin.index.gz diff --git a/tests/test-wrapper.sh b/tests/test-wrapper.sh -index be6242562b..2dacc1bc0a 100755 +index be624256..2dacc1bc 100755 --- a/tests/test-wrapper.sh +++ b/tests/test-wrapper.sh @@ -30,6 +30,12 @@ for feature in $(echo $1 | sed "s/^.*@\(.*\).wrap/\1/" | tr "," "\n"); do @@ -1969,7 +1986,7 @@ index be6242562b..2dacc1bc0a 100755 echo unsupported test feature $feature exit 1 diff --git a/tests/update-test-matrix b/tests/update-test-matrix -index 2aff6f0029..3a51d0ba6b 100755 +index 2aff6f00..3a51d0ba 100755 --- a/tests/update-test-matrix +++ b/tests/update-test-matrix @@ -23,7 +23,7 @@ TEST_MATRIX_SOURCE=( @@ -1981,3 +1998,6 @@ index 2aff6f0029..3a51d0ba6b 100755 'tests/test-update-remote-configuration.sh{newsummary+oldsummary}' \ 'tests/test-override.sh' \ 'tests/test-update-portal.sh{user+system}' \ +-- +2.47.1 + diff --git a/flatpak-support-sideload-repositories-for-oci-remotes.patch b/flatpak-support-sideload-repositories-for-oci-remotes.patch index c46f3cc..114007f 100644 --- a/flatpak-support-sideload-repositories-for-oci-remotes.patch +++ b/flatpak-support-sideload-repositories-for-oci-remotes.patch @@ -1,7 +1,7 @@ -From 7a2f04dcefd069f4f2086bbd00fc3a1fb98aa921 Mon Sep 17 00:00:00 2001 +From 74c8d6ee0bf170fbd4accda2d422afde14712408 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 29 Oct 2024 17:16:08 -0400 -Subject: [PATCH 1/2] Don't return a VarRefInfoRef from +Subject: [PATCH 01/02] Don't return a VarRefInfoRef from flatpak_remote_state_lookup_ref() The memory management of returning a VarRefInfoRef is tricky - it @@ -9,10 +9,10 @@ points to data owned by the summary or the sideload repo. External consumers were always retrieving a copy of the summary metadata, so make the public function do that. --- - common/flatpak-dir-private.h | 14 ++++---- - common/flatpak-dir.c | 63 ++++++++++++++++++++++++++++-------- - common/flatpak-transaction.c | 14 +++----- - 3 files changed, 62 insertions(+), 29 deletions(-) + common/flatpak-dir-private.h | 14 ++++----- + common/flatpak-dir.c | 61 +++++++++++++++++++++++++++++------- + common/flatpak-transaction.c | 14 +++------ + 3 files changed, 61 insertions(+), 28 deletions(-) diff --git a/common/flatpak-dir-private.h b/common/flatpak-dir-private.h index 539476b8..3456660b 100644 @@ -40,7 +40,7 @@ index 539476b8..3456660b 100644 FlatpakDecomposed *ref); GFile *flatpak_remote_state_lookup_sideload_checksum (FlatpakRemoteState *self, diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index 9f398252..583aaccb 100644 +index 9f398252..99889aa5 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c @@ -755,14 +755,14 @@ get_summary_for_ref (FlatpakRemoteState *self, @@ -66,12 +66,7 @@ index 9f398252..583aaccb 100644 { if (!flatpak_remote_state_allow_ref (self, ref)) { -@@ -818,16 +818,54 @@ flatpak_remote_state_lookup_ref (FlatpakRemoteState *self, - { - FlatpakSideloadState *ss = NULL; - -- if (!flatpak_remote_state_resolve_sideloaded_ref (self, ref, out_checksum, out_timestamp, out_info, &ss, error)) -+ if (!flatpak_remote_state_resolve_sideloaded_ref (self, ref, out_checksum, out_timestamp, out_info, &ss, out_image_source, error)) +@@ -822,12 +822,50 @@ flatpak_remote_state_lookup_ref (FlatpakRemoteState *self, return FALSE; if (out_sideload_path) @@ -193,10 +188,10 @@ index 1aba1daa..2dd35f53 100644 -- 2.47.1 -From 126a8b7587f9adb55243620fa652489d49ee9e1b Mon Sep 17 00:00:00 2001 +From 751944405e027daf968741a3fbeec188ccf07ab1 Mon Sep 17 00:00:00 2001 From: "Owen W. Taylor" Date: Tue, 29 Oct 2024 17:19:38 -0400 -Subject: [PATCH 2/2] Support sideload repositories for OCI remotes +Subject: [PATCH 02/02] Support sideload repositories for OCI remotes For OCI remotes, the existing sideload repository system doesn't work: identity for OCI remotes is done by manifest digest (disguised @@ -229,7 +224,7 @@ FlatpakImageSource loaded from the image sideload repository. app/flatpak-builtins-utils.h | 6 + common/flatpak-common-types-private.h | 13 +- common/flatpak-dir-private.h | 12 +- - common/flatpak-dir.c | 360 +++++++++++++++++----- + common/flatpak-dir.c | 362 +++++++++++++++++----- common/flatpak-image-collection-private.h | 50 +++ common/flatpak-image-collection.c | 154 +++++++++ common/flatpak-image-source-private.h | 7 + @@ -240,7 +235,7 @@ FlatpakImageSource loaded from the image sideload repository. doc/flatpak-install.xml | 9 + doc/flatpak-update.xml | 9 + doc/reference/meson.build | 1 + - 18 files changed, 666 insertions(+), 116 deletions(-) + 18 files changed, 667 insertions(+), 117 deletions(-) create mode 100644 common/flatpak-image-collection-private.h create mode 100644 common/flatpak-image-collection.c @@ -476,7 +471,7 @@ index 3456660b..ffcff5ff 100644 GError **error); FlatpakDecomposed * flatpak_dir_get_remote_auto_install_authenticator_ref (FlatpakDir *self, diff --git a/common/flatpak-dir.c b/common/flatpak-dir.c -index 583aaccb..1c304525 100644 +index 99889aa5..1c304525 100644 --- a/common/flatpak-dir.c +++ b/common/flatpak-dir.c @@ -52,6 +52,7 @@ @@ -716,6 +711,15 @@ index 583aaccb..1c304525 100644 if (out_info) *out_info = info; +@@ -818,7 +908,7 @@ flatpak_remote_state_lookup_ref_internal (FlatpakRemoteState *self, + { + FlatpakSideloadState *ss = NULL; + +- if (!flatpak_remote_state_resolve_sideloaded_ref (self, ref, out_checksum, out_timestamp, out_info, &ss, error)) ++ if (!flatpak_remote_state_resolve_sideloaded_ref (self, ref, out_checksum, out_timestamp, out_info, &ss, out_image_source, error)) + return FALSE; + + if (out_sideload_path) @@ -843,17 +933,26 @@ flatpak_remote_state_lookup_ref (FlatpakRemoteState *self, guint64 *out_timestamp, GVariant **out_summary_metadata, diff --git a/flatpak.spec b/flatpak.spec index 2da3631..ead7354 100644 --- a/flatpak.spec +++ b/flatpak.spec @@ -12,7 +12,7 @@ Name: flatpak Version: 1.16.0 -Release: 1%{?dist} +Release: 2%{?dist} Summary: Application deployment framework for desktop apps License: LGPL-2.1-or-later @@ -28,18 +28,18 @@ Source1: flatpak-add-fedora-repos.service # with the config from upstream sources. Source2: flatpak.sysusers.conf -# Add support for preinstalling flatpaks -# https://github.com/flatpak/flatpak/pull/5832 -Patch0: flatpak-add-support-for-preinstalling-flatpaks.patch # Implement /etc/containers/certs.d for OCI registries # https://github.com/flatpak/flatpak/pull/5916 -Patch1: flatpak-implement-etc-containers-certs-for-oci-registries.patch +Patch0: flatpak-implement-etc-containers-certs-for-oci-registries.patch # Allow direct installation from OCI images # https://github.com/flatpak/flatpak/pull/5972 -Patch2: flatpak-allow-direct-installation-from-oci-images.patch +Patch1: flatpak-allow-direct-installation-from-oci-images.patch # Support sideload repositories for OCI remotes # https://github.com/owtaylor/flatpak/commits/oci-sideload -Patch3: flatpak-support-sideload-repositories-for-oci-remotes.patch +Patch2: flatpak-support-sideload-repositories-for-oci-remotes.patch +# Add support for preinstalling flatpaks +# https://github.com/flatpak/flatpak/pull/5832 +Patch3: flatpak-add-support-for-preinstalling-flatpaks.patch # ostree not on i686 for RHEL 10 # https://github.com/containers/composefs/pull/229#issuecomment-1838735764 @@ -309,6 +309,10 @@ fi %changelog +* Fri Jan 17 2025 Jan Grulich - 1.16.0-2 +- Rebase backported upstream patches to updated versions + Resolves: RHEL-26066 + * Mon Jan 13 2025 Jan Grulich - 1.16.0-1 - Update to 1.16.0 Resolves: RHEL-72779