diff --git a/src/libostree/ostree-repo-pull.c b/src/libostree/ostree-repo-pull.c index cd5fe520..4e6031d6 100644 --- a/src/libostree/ostree-repo-pull.c +++ b/src/libostree/ostree-repo-pull.c @@ -834,24 +834,55 @@ fetch_ref_contents (OtPullData *pull_data, GCancellable *cancellable, GError **error) { - g_autofree char *filename = NULL; - - if (ref->collection_id == NULL || g_strcmp0 (ref->collection_id, main_collection_id) == 0) - filename = g_build_filename ("refs", "heads", ref->ref_name, NULL); - else - filename = g_build_filename ("refs", "mirrors", ref->collection_id, ref->ref_name, NULL); - g_autofree char *ret_contents = NULL; - if (!fetch_mirrored_uri_contents_utf8_sync (pull_data->fetcher, - pull_data->meta_mirrorlist, - filename, &ret_contents, - cancellable, error)) - return FALSE; + if (pull_data->remote_repo_local != NULL && ref->collection_id != NULL) + { +#ifdef OSTREE_ENABLE_EXPERIMENTAL_API + g_autoptr(GHashTable) refs = NULL; /* (element-type OstreeCollectionRef utf8) */ + if (!ostree_repo_list_collection_refs (pull_data->remote_repo_local, + ref->collection_id, &refs, + OSTREE_REPO_LIST_REFS_EXT_NONE, + cancellable, error)) + return FALSE; + + ret_contents = g_strdup (g_hash_table_lookup (refs, ref)); +#else /* if !OSTREE_ENABLE_EXPERIMENTAL_API */ + g_assert_not_reached (); +#endif /* !OSTREE_ENABLE_EXPERIMENTAL_API */ + } + else if (pull_data->remote_repo_local != NULL) + { + g_autoptr(GHashTable) refs = NULL; /* (element-type utf8 utf8) */ + if (!ostree_repo_list_refs (pull_data->remote_repo_local, NULL, + &refs, cancellable, error)) + return FALSE; + + ret_contents = g_strdup (g_hash_table_lookup (refs, ref->ref_name)); + } + else + { + g_autofree char *filename = NULL; + + if (ref->collection_id == NULL || g_strcmp0 (ref->collection_id, main_collection_id) == 0) + filename = g_build_filename ("refs", "heads", ref->ref_name, NULL); + else + filename = g_build_filename ("refs", "mirrors", ref->collection_id, ref->ref_name, NULL); + + if (!fetch_mirrored_uri_contents_utf8_sync (pull_data->fetcher, + pull_data->meta_mirrorlist, + filename, &ret_contents, + cancellable, error)) + return FALSE; + } + + /* Validate and return. */ g_strchomp (ret_contents); if (!ostree_validate_checksum_string (ret_contents, error)) - return glnx_prefix_error (error, "Fetching %s", filename); + return glnx_prefix_error (error, "Fetching checksum for ref (%s, %s)", + ref->collection_id ? ref->collection_id : "(empty)", + ref->ref_name); ot_transfer_out_value (out_contents, &ret_contents); return TRUE; diff --git a/tests/pull-test.sh b/tests/pull-test.sh index 573f8360..49209839 100644 --- a/tests/pull-test.sh +++ b/tests/pull-test.sh @@ -508,5 +508,5 @@ rm ostree-srv/gnomerepo/summary if ${CMD_PREFIX} ostree --repo=repo pull origin main 2>err.txt; then fatal "pull of invalid ref succeeded" fi -assert_file_has_content_literal err.txt 'error: Fetching refs/heads/main: Invalid rev lots of html here lots of html here lots of html here lots of' +assert_file_has_content_literal err.txt 'error: Fetching checksum for ref ((empty), main): Invalid rev lots of html here lots of html here lots of html here lots of' echo "ok pull got HTML for a ref"