mirror of
https://github.com/ostreedev/ostree.git
synced 2025-01-09 01:18:35 +03:00
src/pull: Support local pulls for collection–refs
Previously, collection–refs could only be pulled from a repository if it had a summary file (which listed them). There was no way to pull from a local repository which doesn’t have a summary file, and where the refs were stored as refs/remotes/$remote/$ref, with a config section linking that $remote to the queried collection ID. Fix that by explicitly supporting pull_data->remote_repo_local in fetch_ref_contents(). Signed-off-by: Philip Withnall <withnall@endlessm.com> Closes: #1182 Approved by: cgwalters
This commit is contained in:
parent
5963d5a2a9
commit
f923c2e1ea
@ -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;
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user