Allow compiling with experimental API but without curl/soup
This commit rearranges a few things in ostree-repo-pull.c so that OSTree will successfully compile with experimental API enabled and without libsoup, libcurl, or avahi: ./autogen.sh --enable-experimental-api --without-soup --without-curl --without-avahi This is accomplished with two sets of changes: 1. Move ostree_repo_resolve_keyring_for_collection() so it can be used even without libsoup or libcurl. 2. Add stub functions for ostree_repo_find_remotes_async() and ostree_repo_pull_from_remotes_async(), and their _finish() counterparts, so they return an error when libsoup or libcurl isn't available. Closes: #1605 Approved by: cgwalters
This commit is contained in:
parent
4f8944b719
commit
2b32de38cf
|
|
@ -30,11 +30,11 @@
|
||||||
#include "ostree.h"
|
#include "ostree.h"
|
||||||
#include "otutil.h"
|
#include "otutil.h"
|
||||||
#include "ostree-repo-pull-private.h"
|
#include "ostree-repo-pull-private.h"
|
||||||
|
#include "ostree-repo-private.h"
|
||||||
|
|
||||||
#ifdef HAVE_LIBCURL_OR_LIBSOUP
|
#ifdef HAVE_LIBCURL_OR_LIBSOUP
|
||||||
|
|
||||||
#include "ostree-core-private.h"
|
#include "ostree-core-private.h"
|
||||||
#include "ostree-repo-private.h"
|
|
||||||
#include "ostree-repo-static-delta-private.h"
|
#include "ostree-repo-static-delta-private.h"
|
||||||
#include "ostree-metalink.h"
|
#include "ostree-metalink.h"
|
||||||
#include "ostree-fetcher-util.h"
|
#include "ostree-fetcher-util.h"
|
||||||
|
|
@ -1435,51 +1435,6 @@ commitstate_is_partial (OtPullData *pull_data,
|
||||||
|| (commitstate & OSTREE_REPO_COMMIT_STATE_PARTIAL) > 0;
|
|| (commitstate & OSTREE_REPO_COMMIT_STATE_PARTIAL) > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
|
||||||
/* Reads the collection-id of a given remote from the repo
|
|
||||||
* configuration.
|
|
||||||
*/
|
|
||||||
static char *
|
|
||||||
get_real_remote_repo_collection_id (OstreeRepo *repo,
|
|
||||||
const gchar *remote_name)
|
|
||||||
{
|
|
||||||
/* remote_name == NULL can happen for pull-local */
|
|
||||||
if (!remote_name)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
g_autofree gchar *remote_collection_id = NULL;
|
|
||||||
if (!ostree_repo_get_remote_option (repo, remote_name, "collection-id", NULL,
|
|
||||||
&remote_collection_id, NULL) ||
|
|
||||||
(remote_collection_id == NULL) ||
|
|
||||||
(remote_collection_id[0] == '\0'))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return g_steal_pointer (&remote_collection_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Reads the collection-id of the remote repo. Where it will be read
|
|
||||||
* from depends on whether we pull from the "local" remote repo (the
|
|
||||||
* "file://" URL) or "remote" remote repo (likely the "http(s)://"
|
|
||||||
* URL).
|
|
||||||
*/
|
|
||||||
static char *
|
|
||||||
get_remote_repo_collection_id (OtPullData *pull_data)
|
|
||||||
{
|
|
||||||
if (pull_data->remote_repo_local != NULL)
|
|
||||||
{
|
|
||||||
const char *remote_collection_id =
|
|
||||||
ostree_repo_get_collection_id (pull_data->remote_repo_local);
|
|
||||||
if ((remote_collection_id == NULL) ||
|
|
||||||
(remote_collection_id[0] == '\0'))
|
|
||||||
return NULL;
|
|
||||||
return g_strdup (remote_collection_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
return get_real_remote_repo_collection_id (pull_data->repo,
|
|
||||||
pull_data->remote_name);
|
|
||||||
}
|
|
||||||
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
|
||||||
|
|
||||||
#endif /* HAVE_LIBCURL_OR_LIBSOUP */
|
#endif /* HAVE_LIBCURL_OR_LIBSOUP */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -1587,6 +1542,164 @@ _ostree_repo_verify_bindings (const char *collection_id,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
||||||
|
|
||||||
|
/* Reads the collection-id of a given remote from the repo
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
get_real_remote_repo_collection_id (OstreeRepo *repo,
|
||||||
|
const gchar *remote_name)
|
||||||
|
{
|
||||||
|
/* remote_name == NULL can happen for pull-local */
|
||||||
|
if (!remote_name)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
g_autofree gchar *remote_collection_id = NULL;
|
||||||
|
if (!ostree_repo_get_remote_option (repo, remote_name, "collection-id", NULL,
|
||||||
|
&remote_collection_id, NULL) ||
|
||||||
|
(remote_collection_id == NULL) ||
|
||||||
|
(remote_collection_id[0] == '\0'))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
return g_steal_pointer (&remote_collection_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_LIBCURL_OR_LIBSOUP
|
||||||
|
|
||||||
|
/* Reads the collection-id of the remote repo. Where it will be read
|
||||||
|
* from depends on whether we pull from the "local" remote repo (the
|
||||||
|
* "file://" URL) or "remote" remote repo (likely the "http(s)://"
|
||||||
|
* URL).
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
get_remote_repo_collection_id (OtPullData *pull_data)
|
||||||
|
{
|
||||||
|
if (pull_data->remote_repo_local != NULL)
|
||||||
|
{
|
||||||
|
const char *remote_collection_id =
|
||||||
|
ostree_repo_get_collection_id (pull_data->remote_repo_local);
|
||||||
|
if ((remote_collection_id == NULL) ||
|
||||||
|
(remote_collection_id[0] == '\0'))
|
||||||
|
return NULL;
|
||||||
|
return g_strdup (remote_collection_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return get_real_remote_repo_collection_id (pull_data->repo,
|
||||||
|
pull_data->remote_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* HAVE_LIBCURL_OR_LIBSOUP */
|
||||||
|
|
||||||
|
/* Check whether the given remote exists, has a `collection-id` key set, and it
|
||||||
|
* equals @collection_id. If so, return %TRUE. Otherwise, %FALSE. */
|
||||||
|
static gboolean
|
||||||
|
check_remote_matches_collection_id (OstreeRepo *repo,
|
||||||
|
const gchar *remote_name,
|
||||||
|
const gchar *collection_id)
|
||||||
|
{
|
||||||
|
g_autofree gchar *remote_collection_id = NULL;
|
||||||
|
|
||||||
|
remote_collection_id = get_real_remote_repo_collection_id (repo, remote_name);
|
||||||
|
if (remote_collection_id == NULL)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
return g_str_equal (remote_collection_id, collection_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ostree_repo_resolve_keyring_for_collection:
|
||||||
|
* @self: an #OstreeRepo
|
||||||
|
* @collection_id: the collection ID to look up a keyring for
|
||||||
|
* @cancellable: (nullable): a #GCancellable, or %NULL
|
||||||
|
* @error: return location for a #GError, or %NULL
|
||||||
|
*
|
||||||
|
* Find the GPG keyring for the given @collection_id, using the local
|
||||||
|
* configuration from the given #OstreeRepo. This will search the configured
|
||||||
|
* remotes for ones whose `collection-id` key matches @collection_id, and will
|
||||||
|
* return the first matching remote.
|
||||||
|
*
|
||||||
|
* If multiple remotes match and have different keyrings, a debug message will
|
||||||
|
* be emitted, and the first result will be returned. It is expected that the
|
||||||
|
* keyrings should match.
|
||||||
|
*
|
||||||
|
* If no match can be found, a %G_IO_ERROR_NOT_FOUND error will be returned.
|
||||||
|
*
|
||||||
|
* Returns: (transfer full): #OstreeRemote containing the GPG keyring for
|
||||||
|
* @collection_id
|
||||||
|
* Since: 2017.8
|
||||||
|
*/
|
||||||
|
OstreeRemote *
|
||||||
|
ostree_repo_resolve_keyring_for_collection (OstreeRepo *self,
|
||||||
|
const gchar *collection_id,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
gsize i;
|
||||||
|
g_auto(GStrv) remotes = NULL;
|
||||||
|
g_autoptr(OstreeRemote) keyring_remote = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail (OSTREE_IS_REPO (self), NULL);
|
||||||
|
g_return_val_if_fail (ostree_validate_collection_id (collection_id, NULL), NULL);
|
||||||
|
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
|
/* Look through all the currently configured remotes for the given collection. */
|
||||||
|
remotes = ostree_repo_remote_list (self, NULL);
|
||||||
|
|
||||||
|
for (i = 0; remotes != NULL && remotes[i] != NULL; i++)
|
||||||
|
{
|
||||||
|
g_autoptr(GError) local_error = NULL;
|
||||||
|
|
||||||
|
if (!check_remote_matches_collection_id (self, remotes[i], collection_id))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (keyring_remote == NULL)
|
||||||
|
{
|
||||||
|
g_debug ("%s: Found match for collection ‘%s’ in remote ‘%s’.",
|
||||||
|
G_STRFUNC, collection_id, remotes[i]);
|
||||||
|
keyring_remote = _ostree_repo_get_remote_inherited (self, remotes[i], &local_error);
|
||||||
|
|
||||||
|
if (keyring_remote == NULL)
|
||||||
|
{
|
||||||
|
g_debug ("%s: Error loading remote ‘%s’: %s",
|
||||||
|
G_STRFUNC, remotes[i], local_error->message);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_strcmp0 (keyring_remote->keyring, "") == 0 ||
|
||||||
|
g_strcmp0 (keyring_remote->keyring, "/dev/null") == 0)
|
||||||
|
{
|
||||||
|
g_debug ("%s: Ignoring remote ‘%s’ as it has no keyring configured.",
|
||||||
|
G_STRFUNC, remotes[i]);
|
||||||
|
g_clear_object (&keyring_remote);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* continue so we can catch duplicates */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_debug ("%s: Duplicate keyring for collection ‘%s’ in remote ‘%s’."
|
||||||
|
"Keyring will be loaded from remote ‘%s’.",
|
||||||
|
G_STRFUNC, collection_id, remotes[i],
|
||||||
|
keyring_remote->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (keyring_remote != NULL)
|
||||||
|
return g_steal_pointer (&keyring_remote);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
|
||||||
|
"No keyring found configured locally for collection ‘%s’",
|
||||||
|
collection_id);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
||||||
|
|
||||||
#ifdef HAVE_LIBCURL_OR_LIBSOUP
|
#ifdef HAVE_LIBCURL_OR_LIBSOUP
|
||||||
|
|
||||||
/* Look at a commit object, and determine whether there are
|
/* Look at a commit object, and determine whether there are
|
||||||
|
|
@ -5694,113 +5807,6 @@ ostree_repo_pull_from_remotes_finish (OstreeRepo *self,
|
||||||
return g_task_propagate_boolean (G_TASK (result), error);
|
return g_task_propagate_boolean (G_TASK (result), error);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check whether the given remote exists, has a `collection-id` key set, and it
|
|
||||||
* equals @collection_id. If so, return %TRUE. Otherwise, %FALSE. */
|
|
||||||
static gboolean
|
|
||||||
check_remote_matches_collection_id (OstreeRepo *repo,
|
|
||||||
const gchar *remote_name,
|
|
||||||
const gchar *collection_id)
|
|
||||||
{
|
|
||||||
g_autofree gchar *remote_collection_id = NULL;
|
|
||||||
|
|
||||||
remote_collection_id = get_real_remote_repo_collection_id (repo, remote_name);
|
|
||||||
if (remote_collection_id == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return g_str_equal (remote_collection_id, collection_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ostree_repo_resolve_keyring_for_collection:
|
|
||||||
* @self: an #OstreeRepo
|
|
||||||
* @collection_id: the collection ID to look up a keyring for
|
|
||||||
* @cancellable: (nullable): a #GCancellable, or %NULL
|
|
||||||
* @error: return location for a #GError, or %NULL
|
|
||||||
*
|
|
||||||
* Find the GPG keyring for the given @collection_id, using the local
|
|
||||||
* configuration from the given #OstreeRepo. This will search the configured
|
|
||||||
* remotes for ones whose `collection-id` key matches @collection_id, and will
|
|
||||||
* return the first matching remote.
|
|
||||||
*
|
|
||||||
* If multiple remotes match and have different keyrings, a debug message will
|
|
||||||
* be emitted, and the first result will be returned. It is expected that the
|
|
||||||
* keyrings should match.
|
|
||||||
*
|
|
||||||
* If no match can be found, a %G_IO_ERROR_NOT_FOUND error will be returned.
|
|
||||||
*
|
|
||||||
* Returns: (transfer full): #OstreeRemote containing the GPG keyring for
|
|
||||||
* @collection_id
|
|
||||||
* Since: 2017.8
|
|
||||||
*/
|
|
||||||
OstreeRemote *
|
|
||||||
ostree_repo_resolve_keyring_for_collection (OstreeRepo *self,
|
|
||||||
const gchar *collection_id,
|
|
||||||
GCancellable *cancellable,
|
|
||||||
GError **error)
|
|
||||||
{
|
|
||||||
gsize i;
|
|
||||||
g_auto(GStrv) remotes = NULL;
|
|
||||||
g_autoptr(OstreeRemote) keyring_remote = NULL;
|
|
||||||
|
|
||||||
g_return_val_if_fail (OSTREE_IS_REPO (self), NULL);
|
|
||||||
g_return_val_if_fail (ostree_validate_collection_id (collection_id, NULL), NULL);
|
|
||||||
g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
|
|
||||||
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
|
||||||
|
|
||||||
/* Look through all the currently configured remotes for the given collection. */
|
|
||||||
remotes = ostree_repo_remote_list (self, NULL);
|
|
||||||
|
|
||||||
for (i = 0; remotes != NULL && remotes[i] != NULL; i++)
|
|
||||||
{
|
|
||||||
g_autoptr(GError) local_error = NULL;
|
|
||||||
|
|
||||||
if (!check_remote_matches_collection_id (self, remotes[i], collection_id))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (keyring_remote == NULL)
|
|
||||||
{
|
|
||||||
g_debug ("%s: Found match for collection ‘%s’ in remote ‘%s’.",
|
|
||||||
G_STRFUNC, collection_id, remotes[i]);
|
|
||||||
keyring_remote = _ostree_repo_get_remote_inherited (self, remotes[i], &local_error);
|
|
||||||
|
|
||||||
if (keyring_remote == NULL)
|
|
||||||
{
|
|
||||||
g_debug ("%s: Error loading remote ‘%s’: %s",
|
|
||||||
G_STRFUNC, remotes[i], local_error->message);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_strcmp0 (keyring_remote->keyring, "") == 0 ||
|
|
||||||
g_strcmp0 (keyring_remote->keyring, "/dev/null") == 0)
|
|
||||||
{
|
|
||||||
g_debug ("%s: Ignoring remote ‘%s’ as it has no keyring configured.",
|
|
||||||
G_STRFUNC, remotes[i]);
|
|
||||||
g_clear_object (&keyring_remote);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* continue so we can catch duplicates */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_debug ("%s: Duplicate keyring for collection ‘%s’ in remote ‘%s’."
|
|
||||||
"Keyring will be loaded from remote ‘%s’.",
|
|
||||||
G_STRFUNC, collection_id, remotes[i],
|
|
||||||
keyring_remote->name);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (keyring_remote != NULL)
|
|
||||||
return g_steal_pointer (&keyring_remote);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
|
|
||||||
"No keyring found configured locally for collection ‘%s’",
|
|
||||||
collection_id);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -5952,4 +5958,75 @@ ostree_repo_remote_fetch_summary_with_options (OstreeRepo *self,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef OSTREE_ENABLE_EXPERIMENTAL_API
|
||||||
|
|
||||||
|
void
|
||||||
|
ostree_repo_find_remotes_async (OstreeRepo *self,
|
||||||
|
const OstreeCollectionRef * const *refs,
|
||||||
|
GVariant *options,
|
||||||
|
OstreeRepoFinder **finders,
|
||||||
|
OstreeAsyncProgress *progress,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GAsyncReadyCallback callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
g_return_if_fail (OSTREE_IS_REPO (self));
|
||||||
|
|
||||||
|
g_task_report_new_error (self, callback, user_data, ostree_repo_find_remotes_async,
|
||||||
|
G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||||
|
"This version of ostree was built without libsoup or libcurl, and cannot fetch over HTTP");
|
||||||
|
}
|
||||||
|
|
||||||
|
OstreeRepoFinderResult **
|
||||||
|
ostree_repo_find_remotes_finish (OstreeRepo *self,
|
||||||
|
GAsyncResult *result,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
g_autoptr(GPtrArray) results = NULL;
|
||||||
|
|
||||||
|
g_return_val_if_fail (OSTREE_IS_REPO (self), NULL);
|
||||||
|
g_return_val_if_fail (g_task_is_valid (result, self), NULL);
|
||||||
|
g_return_val_if_fail (g_async_result_is_tagged (result, ostree_repo_find_remotes_async), NULL);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
|
||||||
|
|
||||||
|
results = g_task_propagate_pointer (G_TASK (result), error);
|
||||||
|
g_assert (results == NULL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ostree_repo_pull_from_remotes_async (OstreeRepo *self,
|
||||||
|
const OstreeRepoFinderResult * const *results,
|
||||||
|
GVariant *options,
|
||||||
|
OstreeAsyncProgress *progress,
|
||||||
|
GCancellable *cancellable,
|
||||||
|
GAsyncReadyCallback callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
g_return_if_fail (OSTREE_IS_REPO (self));
|
||||||
|
|
||||||
|
g_task_report_new_error (self, callback, user_data, ostree_repo_find_remotes_async,
|
||||||
|
G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||||
|
"This version of ostree was built without libsoup or libcurl, and cannot fetch over HTTP");
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
ostree_repo_pull_from_remotes_finish (OstreeRepo *self,
|
||||||
|
GAsyncResult *result,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
gboolean success;
|
||||||
|
|
||||||
|
g_return_val_if_fail (OSTREE_IS_REPO (self), FALSE);
|
||||||
|
g_return_val_if_fail (g_task_is_valid (result, self), FALSE);
|
||||||
|
g_return_val_if_fail (g_async_result_is_tagged (result, ostree_repo_pull_from_remotes_async), FALSE);
|
||||||
|
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
|
||||||
|
|
||||||
|
success = g_task_propagate_boolean (G_TASK (result), error);
|
||||||
|
g_assert (!success);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* OSTREE_ENABLE_EXPERIMENTAL_API */
|
||||||
|
|
||||||
#endif /* HAVE_LIBCURL_OR_LIBSOUP */
|
#endif /* HAVE_LIBCURL_OR_LIBSOUP */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue