diff options
author | Alexander Larsson <alexl@redhat.com> | 2020-10-14 10:26:50 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2020-10-26 13:50:15 +0100 |
commit | 3f5a079a81e37adbeac49e29961326f2b228d263 (patch) | |
tree | fcd1dc9f145dfc94541bd8103c3c5854cb4fa9a7 | |
parent | ebf379225d2f8ca5108c34f4ed998ff8f07be866 (diff) | |
download | flatpak-3f5a079a81e37adbeac49e29961326f2b228d263.tar.gz |
summary: Extract the summary generation code to helper
-rw-r--r-- | common/flatpak-utils.c | 119 |
1 files changed, 69 insertions, 50 deletions
diff --git a/common/flatpak-utils.c b/common/flatpak-utils.c index 927c6d91..f3128d09 100644 --- a/common/flatpak-utils.c +++ b/common/flatpak-utils.c @@ -3778,25 +3778,15 @@ flatpak_get_arch_for_ref (const char *ref) return NULL; } -/* Update the metadata in the summary file for @repo, and then re-sign the file. - * If the repo has a collection ID set, additionally store the metadata on a - * contentless commit in a well-known branch, which is the preferred way of - * broadcasting per-repo metadata (putting it in the summary file is deprecated, - * but kept for backwards compatibility). - * - * Note that there are two keys for the collection ID: collection-id, and - * ostree.deploy-collection-id. If a client does not currently have a - * collection ID configured for this remote, it will *only* update its - * configuration from ostree.deploy-collection-id. This allows phased - * deployment of collection-based repositories. Clients will only update their - * configuration from an unset to a set collection ID once (otherwise the - * security properties of collection IDs are broken). */ -gboolean -flatpak_repo_update (OstreeRepo *repo, - const char **gpg_key_ids, - const char *gpg_homedir, - GCancellable *cancellable, - GError **error) +static GVariant * +generate_summary (OstreeRepo *repo, + GHashTable *refs, + GHashTable *commit_data_cache, + GPtrArray *delta_names, + const char **gpg_key_ids, + const char *gpg_homedir, + GCancellable *cancellable, + GError **error) { g_autoptr(GVariantBuilder) metadata_builder = g_variant_builder_new (G_VARIANT_TYPE_VARDICT); g_autoptr(GVariantBuilder) ref_data_builder = g_variant_builder_new (G_VARIANT_TYPE ("a{s(tts)}")); @@ -3818,18 +3808,13 @@ flatpak_repo_update (OstreeRepo *repo, g_auto(GStrv) summary_arches = NULL; g_autoptr(GHashTable) summary_arches_ht = NULL; int authenticator_install = -1; - g_autoptr(GVariant) old_summary = NULL; - g_autoptr(GVariant) new_summary = NULL; - g_autoptr(GHashTable) refs = NULL; g_autoptr(GHashTable) commits = NULL; g_autoptr(GList) ordered_keys = NULL; GList *l = NULL; - g_autoptr(GHashTable) commit_data_cache = NULL; const char *collection_id; gboolean deploy_collection_id = FALSE; gboolean deploy_sideload_collection_id = FALSE; gboolean tombstone_commits = FALSE; - int repo_dfd; config = ostree_repo_get_config (repo); @@ -3951,21 +3936,6 @@ flatpak_repo_update (OstreeRepo *repo, TRUE, (GDestroyNotify) g_free, decoded)); } - commit_data_cache = g_hash_table_new_full (g_str_hash, g_str_equal, - g_free, commit_data_free); - - old_summary = flatpak_repo_load_summary (repo, NULL); - if (old_summary != NULL) - { - g_autoptr(GVariant) extensions = g_variant_get_child_value (old_summary, 1); - populate_commit_data_cache (extensions, old_summary, commit_data_cache); - } - - if (!ostree_repo_list_refs_ext (repo, NULL, &refs, - OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES | OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_MIRRORS, - cancellable, error)) - return FALSE; - ordered_keys = g_hash_table_get_keys (refs); ordered_keys = g_list_sort (ordered_keys, (GCompareFunc) strcmp); @@ -4013,7 +3983,7 @@ flatpak_repo_update (OstreeRepo *repo, continue; /* Filter out commit (by arch) */ if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT, rev, &commit_obj, error)) - return FALSE; + return NULL; g_variant_dict_init (&commit_metadata_builder, NULL); g_variant_builder_add_value (refs_builder, @@ -4025,15 +3995,15 @@ flatpak_repo_update (OstreeRepo *repo, /* Only add CommitData for flatpak refs */ if (is_flatpak_ref (ref)) { - g_autoptr(CommitData) free_rev_data = NULL; const CommitData *rev_data = g_hash_table_lookup (commit_data_cache, rev); if (rev_data == NULL) { - free_rev_data = read_commit_data (repo, ref, rev, cancellable, error); - if (free_rev_data == NULL) - return FALSE; - rev_data = free_rev_data; + rev_data = read_commit_data (repo, ref, rev, cancellable, error); + if (rev_data == NULL) + return NULL; + + g_hash_table_insert (commit_data_cache, g_strdup (rev), (CommitData *)rev_data); } g_variant_builder_add (ref_data_builder, "{s(tts)}", @@ -4048,12 +4018,8 @@ flatpak_repo_update (OstreeRepo *repo, } { - g_autoptr(GPtrArray) delta_names = NULL; g_auto(GVariantDict) deltas_builder = FLATPAK_VARIANT_BUILDER_INITIALIZER; - if (!ostree_repo_list_static_delta_names (repo, &delta_names, cancellable, error)) - return FALSE; - g_variant_dict_init (&deltas_builder, NULL); for (guint i = 0; i < delta_names->len; i++) { @@ -4096,7 +4062,60 @@ flatpak_repo_update (OstreeRepo *repo, g_variant_builder_add_value (summary_builder, g_variant_builder_end (refs_builder)); g_variant_builder_add_value (summary_builder, g_variant_builder_end (metadata_builder)); - new_summary = g_variant_ref_sink (g_variant_builder_end (summary_builder)); + + return g_variant_ref_sink (g_variant_builder_end (summary_builder)); +} + + +/* Update the metadata in the summary file for @repo, and then re-sign the file. + * If the repo has a collection ID set, additionally store the metadata on a + * contentless commit in a well-known branch, which is the preferred way of + * broadcasting per-repo metadata (putting it in the summary file is deprecated, + * but kept for backwards compatibility). + * + * Note that there are two keys for the collection ID: collection-id, and + * ostree.deploy-collection-id. If a client does not currently have a + * collection ID configured for this remote, it will *only* update its + * configuration from ostree.deploy-collection-id. This allows phased + * deployment of collection-based repositories. Clients will only update their + * configuration from an unset to a set collection ID once (otherwise the + * security properties of collection IDs are broken). */ +gboolean +flatpak_repo_update (OstreeRepo *repo, + const char **gpg_key_ids, + const char *gpg_homedir, + GCancellable *cancellable, + GError **error) +{ + g_autoptr(GHashTable) commit_data_cache = NULL; + g_autoptr(GVariant) old_summary = NULL; + g_autoptr(GVariant) new_summary = NULL; + g_autoptr(GPtrArray) delta_names = NULL; + g_autoptr(GHashTable) refs = NULL; + int repo_dfd; + + if (!ostree_repo_list_refs_ext (repo, NULL, &refs, + OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_REMOTES | OSTREE_REPO_LIST_REFS_EXT_EXCLUDE_MIRRORS, + cancellable, error)) + return FALSE; + + commit_data_cache = g_hash_table_new_full (g_str_hash, g_str_equal, + g_free, commit_data_free); + + old_summary = flatpak_repo_load_summary (repo, NULL); + if (old_summary != NULL) + { + g_autoptr(GVariant) extensions = g_variant_get_child_value (old_summary, 1); + populate_commit_data_cache (extensions, old_summary, commit_data_cache); + } + + if (!ostree_repo_list_static_delta_names (repo, &delta_names, cancellable, error)) + return FALSE; + + new_summary = generate_summary (repo, refs, commit_data_cache, delta_names, + gpg_key_ids, gpg_homedir, cancellable, error); + if (new_summary == NULL) + return FALSE; if (!ostree_repo_static_delta_reindex (repo, 0, NULL, cancellable, error)) return FALSE; |