From 56f0ae6a4af0eeb164334897ccad7960ff6b42b2 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Thu, 23 Jul 2015 13:34:58 +0200 Subject: [PATCH] repo: new function _ostree_preload_metadata_file Signed-off-by: Giuseppe Scrivano --- src/libostree/ostree-repo.c | 118 ++++++++++++++++++++++-------------- 1 file changed, 73 insertions(+), 45 deletions(-) diff --git a/src/libostree/ostree-repo.c b/src/libostree/ostree-repo.c index c83d880e..31c3b68c 100644 --- a/src/libostree/ostree-repo.c +++ b/src/libostree/ostree-repo.c @@ -1670,6 +1670,69 @@ out: return ret; } +static gboolean +_ostree_preload_metadata_file (OstreeRepo *self, + OstreeFetcher *fetcher, + SoupURI *base_uri, + const char *filename, + gboolean is_metalink, + GMainLoop *main_loop, + GBytes **out_bytes, + GCancellable *cancellable, + GError **error) +{ + gboolean ret = FALSE; + if (is_metalink) + { + glnx_unref_object OstreeMetalink *metalink = NULL; + GError *local_error = NULL; + + metalink = _ostree_metalink_new (fetcher, filename, + OSTREE_MAX_METADATA_SIZE, + base_uri); + + _ostree_metalink_request_sync (metalink, main_loop, + NULL, out_bytes, NULL, + cancellable, &local_error); + + if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) + { + g_clear_error (&local_error); + *out_bytes = NULL; + } + else if (local_error != NULL) + { + g_propagate_error (error, local_error); + goto out; + } + } + else + { + SoupURI *uri; + const char *base_path; + g_autofree char *path = NULL; + + base_path = soup_uri_get_path (base_uri); + path = g_build_filename (base_path, filename, NULL); + uri = soup_uri_new_with_base (base_uri, path); + + ret = _ostree_fetcher_request_uri_to_membuf (fetcher, uri, + FALSE, TRUE, + out_bytes, + main_loop, + OSTREE_MAX_METADATA_SIZE, + cancellable, error); + soup_uri_free (uri); + + if (!ret) + goto out; + } + + ret = TRUE; +out: + return ret; +} + static gboolean repo_remote_fetch_summary (OstreeRepo *self, const char *name, @@ -1717,51 +1780,16 @@ repo_remote_fetch_summary (OstreeRepo *self, for (i = 0; i < G_N_ELEMENTS (filenames); i++) { - if (metalink_url_string) - { - glnx_unref_object OstreeMetalink *metalink = NULL; - GError *local_error = NULL; - - metalink = _ostree_metalink_new (fetcher, filenames[i], - OSTREE_MAX_METADATA_SIZE, - base_uri); - - _ostree_metalink_request_sync (metalink, main_loop, - NULL, outputs[i], NULL, - cancellable, &local_error); - - if (g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND)) - { - g_clear_error (&local_error); - *outputs[i] = NULL; - } - else if (local_error != NULL) - { - g_propagate_error (error, local_error); - goto out; - } - } - else - { - SoupURI *uri; - const char *base_path; - g_autofree char *path = NULL; - - base_path = soup_uri_get_path (base_uri); - path = g_build_filename (base_path, filenames[i], NULL); - uri = soup_uri_new_with_base (base_uri, path); - - ret = _ostree_fetcher_request_uri_to_membuf (fetcher, uri, - FALSE, TRUE, - outputs[i], - main_loop, - OSTREE_MAX_METADATA_SIZE, - cancellable, error); - soup_uri_free (uri); - - if (!ret) - goto out; - } + if (!_ostree_preload_metadata_file (self, + fetcher, + base_uri, + filenames[i], + metalink_url_string ? TRUE : FALSE, + main_loop, + outputs[i], + cancellable, + error)) + goto out; } ret = TRUE;