From cd37293b5ad46b6158f46537b1535ae373e10cbe Mon Sep 17 00:00:00 2001 From: Matthew Leeds Date: Wed, 13 Nov 2019 18:29:45 -0800 Subject: [PATCH 1/2] find-remotes: Add a --mirror option This will be useful in the unit test added by the next commit. It just passes OSTREE_REPO_PULL_FLAGS_MIRROR to the call to ostree_repo_pull_from_remotes_async(). --- man/ostree-find-remotes.xml | 10 ++++++++++ src/ostree/ot-builtin-find-remotes.c | 22 +++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/man/ostree-find-remotes.xml b/man/ostree-find-remotes.xml index b3796c31..89e278d7 100644 --- a/man/ostree-find-remotes.xml +++ b/man/ostree-find-remotes.xml @@ -116,6 +116,16 @@ Boston, MA 02111-1307, USA. + + + + + Do a mirror pull (see the documentation for + ostree pull --mirror). This option can + only be used in combination with . + + + diff --git a/src/ostree/ot-builtin-find-remotes.c b/src/ostree/ot-builtin-find-remotes.c index f255501a..944533ca 100644 --- a/src/ostree/ot-builtin-find-remotes.c +++ b/src/ostree/ot-builtin-find-remotes.c @@ -35,6 +35,7 @@ static gchar *opt_cache_dir = NULL; static gchar *opt_finders = NULL; static gboolean opt_disable_fsync = FALSE; static gboolean opt_pull = FALSE; +static gboolean opt_mirror = FALSE; static GOptionEntry options[] = { @@ -42,6 +43,7 @@ static GOptionEntry options[] = { "disable-fsync", 0, 0, G_OPTION_ARG_NONE, &opt_disable_fsync, "Do not invoke fsync()", NULL }, { "finders", 0, 0, G_OPTION_ARG_STRING, &opt_finders, "Use the specified comma separated list of finders (e.g. config,lan,mount)", "FINDERS" }, { "pull", 0, 0, G_OPTION_ARG_NONE, &opt_pull, "Pull the updates after finding them", NULL }, + { "mirror", 0, 0, G_OPTION_ARG_NONE, &opt_mirror, "Do a mirror pull (see ostree pull --mirror)", NULL}, { NULL } }; @@ -188,6 +190,7 @@ ostree_builtin_find_remotes (int argc, g_auto(OstreeRepoFinderResultv) results = NULL; g_auto(GLnxConsoleRef) console = { 0, }; g_autoptr(GHashTable) refs_found = NULL; /* set (element-type OstreeCollectionRef) */ + g_autoptr(GVariant) pull_options = NULL; context = g_option_context_new ("COLLECTION-ID REF [COLLECTION-ID REF...]"); @@ -210,6 +213,12 @@ ostree_builtin_find_remotes (int argc, return FALSE; } + if (opt_mirror && !opt_pull) + { + ot_util_usage_error (context, "When --mirror is specified, --pull must also be", error); + return FALSE; + } + if (opt_disable_fsync) ostree_repo_set_disable_fsync (repo, TRUE); @@ -359,13 +368,24 @@ ostree_builtin_find_remotes (int argc, if (!opt_pull) return TRUE; + { + GVariantBuilder builder; + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + + if (opt_mirror) + g_variant_builder_add (&builder, "{s@v}", "flags", + g_variant_new_variant (g_variant_new_int32 (OSTREE_REPO_PULL_FLAGS_MIRROR))); + + pull_options = g_variant_ref_sink (g_variant_builder_end (&builder)); + } + /* Run the pull operation. */ if (console.is_tty) progress = ostree_async_progress_new_and_connect (ostree_repo_pull_default_console_progress_changed, &console); ostree_repo_pull_from_remotes_async (repo, (const OstreeRepoFinderResult * const *) results, - NULL, /* no options */ + pull_options, progress, cancellable, get_result_cb, &pull_result); From 164b2aa35bc2e39615f461decc90381d9bedd132 Mon Sep 17 00:00:00 2001 From: Matthew Leeds Date: Wed, 13 Nov 2019 18:30:58 -0800 Subject: [PATCH 2/2] Don't copy summary for collection-ref mirror subset pulls When we're only pulling a subset of the refs available in the remote, it doesn't make sense to copy the remote's summary (which may not be valid for the local repo). This makes the check here match the one done several lines above when we decide whether to error out if there's no remote summary available. This extends the fix in https://github.com/ostreedev/ostree/pull/935 for the case of collection-refs. Also, add a unit test for this issue, based on the existing one in pull-test.sh. --- src/libostree/ostree-repo-pull.c | 3 ++- tests/test-pull-collections.sh | 14 +++++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index 381cce47..a0f6db02 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -4567,7 +4567,8 @@ ostree_repo_pull_with_options (OstreeRepo *self, } } - if (pull_data->is_mirror && pull_data->summary_data && !refs_to_fetch && !configured_branches) + if (pull_data->is_mirror && pull_data->summary_data && + !refs_to_fetch && !opt_collection_refs_set && !configured_branches) { GLnxFileReplaceFlags replaceflag = pull_data->repo->disable_fsync ? GLNX_FILE_REPLACE_NODATASYNC : 0; diff --git a/tests/test-pull-collections.sh b/tests/test-pull-collections.sh index d1de5f88..cd60ab21 100755 --- a/tests/test-pull-collections.sh +++ b/tests/test-pull-collections.sh @@ -23,7 +23,7 @@ set -euo pipefail . $(dirname $0)/libtest.sh -echo '1..6' +echo '1..7' cd ${test_tmpdir} @@ -258,3 +258,15 @@ then fi echo "ok 6 pull refs from local repos" + +ostree_repo_init local-mirror +do_remote_add local-mirror collection-repo --collection-id org.example.CollectionRepo +# Generate a summary in the local mirror; don't use do_summary to avoid gpg +${CMD_PREFIX} ostree --repo=local-mirror summary --update +summarysig=$(sha256sum < local-mirror/summary | cut -f 1 -d ' ') +# Mirror subset of refs: A collection-ref version of https://github.com/ostreedev/ostree/issues/846 +${CMD_PREFIX} ostree --repo=local-mirror find-remotes --pull --mirror --finders=config org.example.CollectionRepo goodcref1 +newsummarysig=$(sha256sum < local-mirror/summary | cut -f 1 -d ' ') +assert_streq ${summarysig} ${newsummarysig} + +echo "ok 7 mirror pull subset of collection-refs with summary"