diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index 516d3e0f..2d8e70d9 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -935,13 +935,13 @@ ostree_repo_store_packfile (OstreeRepo *self, const char *expected_checksum, const char *path, OstreeObjectType objtype, + gboolean *did_exist, GError **error) { OstreeRepoPrivate *priv = GET_PRIVATE (self); gboolean ret = FALSE; GString *tempfile_path = NULL; GChecksum *checksum = NULL; - gboolean did_exist; tempfile_path = g_string_new (priv->path); g_string_append_printf (tempfile_path, "/tmp-unpack-%s", expected_checksum); @@ -960,7 +960,7 @@ ostree_repo_store_packfile (OstreeRepo *self, if (!ostree_repo_store_object_trusted (self, tempfile_path ? tempfile_path->str : path, expected_checksum, objtype, - TRUE, FALSE, &did_exist, error)) + TRUE, FALSE, did_exist, error)) goto out; ret = TRUE; diff --git a/src/libostree/ostree-repo.h b/src/libostree/ostree-repo.h index 22bb0e62..b8400454 100644 --- a/src/libostree/ostree-repo.h +++ b/src/libostree/ostree-repo.h @@ -73,6 +73,7 @@ gboolean ostree_repo_store_packfile (OstreeRepo *self, const char *expected_checksum, const char *path, OstreeObjectType objtype, + gboolean *did_exist, GError **error); gboolean ostree_repo_store_object_trusted (OstreeRepo *self, diff --git a/src/ostree/ot-builtin-pull.c b/src/ostree/ot-builtin-pull.c index a064abd1..bcf387b8 100644 --- a/src/ostree/ot-builtin-pull.c +++ b/src/ostree/ot-builtin-pull.c @@ -29,10 +29,33 @@ #include +gboolean verbose; + static GOptionEntry options[] = { - { NULL } + { "verbose", 'v', 0, G_OPTION_ARG_NONE, &verbose, "Show more information", NULL }, }; +static void +log_verbose (const char *fmt, + ...) G_GNUC_PRINTF (1, 2); + +static void +log_verbose (const char *fmt, + ...) +{ + va_list args; + char *msg; + + if (!verbose) + return; + + va_start (args, fmt); + + msg = g_strdup_vprintf (fmt, args); + g_print ("%s\n", msg); + g_free (msg); +} + static gboolean fetch_uri (OstreeRepo *repo, SoupSession *soup, @@ -47,17 +70,18 @@ fetch_uri (OstreeRepo *repo, int fd; SoupBuffer *buf = NULL; GFile *tempf = NULL; + char *uri_string = NULL; + uri_string = soup_uri_to_string (uri, FALSE); + log_verbose ("Fetching %s", uri_string); msg = soup_message_new_from_uri (SOUP_METHOD_GET, uri); response = soup_session_send_message (soup, msg); if (response != 200) { - char *uri_string = soup_uri_to_string (uri, FALSE); g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Failed to retrieve '%s': %d %s", uri_string, response, msg->reason_phrase); - g_free (uri_string); goto out; } @@ -82,6 +106,7 @@ fetch_uri (OstreeRepo *repo, ret = TRUE; out: + g_free (uri_string); g_free (template); g_clear_object (&msg); g_clear_object (&tempf); @@ -111,7 +136,7 @@ store_object (OstreeRepo *repo, if (!fetch_uri (repo, soup, obj_uri, &filename, error)) goto out; - if (!ostree_repo_store_packfile (repo, object, filename, objtype, error)) + if (!ostree_repo_store_packfile (repo, object, filename, objtype, did_exist, error)) goto out; ret = TRUE; @@ -144,7 +169,9 @@ store_tree_recurse (OstreeRepo *repo, if (!store_object (repo, soup, base_uri, rev, OSTREE_OBJECT_TYPE_META, &did_exist, error)) goto out; - if (!did_exist) + if (did_exist) + log_verbose ("Already have tree %s", rev); + else { if (!ostree_repo_load_variant (repo, rev, &metatype, &tree, error)) goto out; @@ -158,8 +185,8 @@ store_tree_recurse (OstreeRepo *repo, } /* PARSE OSTREE_SERIALIZED_TREE_VARIANT */ - g_variant_get_child (tree, 2, "@a(ss)", &files_variant); - g_variant_get_child (tree, 3, "@a(sss)", &dirs_variant); + files_variant = g_variant_get_child_value (tree, 2); + dirs_variant = g_variant_get_child_value (tree, 3); n = g_variant_n_children (files_variant); for (i = 0; i < n; i++) @@ -167,7 +194,7 @@ store_tree_recurse (OstreeRepo *repo, const char *filename; const char *checksum; - g_variant_get_child (files_variant, i, "(ss)", &filename, &checksum); + g_variant_get_child (files_variant, i, "(&s&s)", &filename, &checksum); if (!store_object (repo, soup, base_uri, checksum, OSTREE_OBJECT_TYPE_FILE, &did_exist, error)) goto out; @@ -180,13 +207,13 @@ store_tree_recurse (OstreeRepo *repo, const char *tree_checksum; const char *meta_checksum; - g_variant_get_child (dirs_variant, i, "(sss)", + g_variant_get_child (dirs_variant, i, "(&s&s&s)", &dirname, &tree_checksum, &meta_checksum); - if (!store_tree_recurse (repo, soup, base_uri, tree_checksum, error)) + if (!store_object (repo, soup, base_uri, meta_checksum, OSTREE_OBJECT_TYPE_META, &did_exist, error)) goto out; - if (!store_object (repo, soup, base_uri, meta_checksum, OSTREE_OBJECT_TYPE_META, &did_exist, error)) + if (!store_tree_recurse (repo, soup, base_uri, tree_checksum, error)) goto out; } } @@ -219,7 +246,9 @@ store_commit_recurse (OstreeRepo *repo, if (!store_object (repo, soup, base_uri, rev, OSTREE_OBJECT_TYPE_META, &did_exist, error)) goto out; - if (!did_exist) + if (did_exist) + log_verbose ("Already have commit %s", rev); + else { if (!ostree_repo_load_variant (repo, rev, &metatype, &commit, error)) goto out; diff --git a/tests/t0010-pull.sh b/tests/t0010-pull.sh index e05dfa64..6bc7ff69 100755 --- a/tests/t0010-pull.sh +++ b/tests/t0010-pull.sh @@ -21,7 +21,7 @@ set -e . libtest.sh -echo '1..1' +echo '1..2' setup_fake_remote_repo1 cd ${test_tmpdir} @@ -30,3 +30,10 @@ $OSTREE init $OSTREE remote add origin $(cat httpd-address)/ostree/gnomerepo $OSTREE pull origin main echo "ok pull" + +cd ${test_tmpdir} +$OSTREE checkout origin/main checkout-origin-main +cd checkout-origin-main +assert_file_has_content firstfile '^first$' +assert_file_has_content baz/cow '^moo$' +echo "ok pull contents"