Currently the API that allows P2P operations (e.g. pulling an ostree ref from a LAN or USB source) is hidden behind the configure flag --enable-experimental-api. This commit makes the API public and makes that flag essentially a no-op (leaving it in place in case we want to use it again in the future). The P2P API has been tested over the last several months and proven to work. This means that since we're no longer using the "experimental" feature flag, P2P builds of Flatpak will fail when using versions of OSTree from this commit onwards, until Flatpak is patched in the near future. If you want to build Flatpak < 0.11.8 with P2P enabled and link against OSTree 2018.6, you'll have to patch Flatpak. However, since Flatpak won't yet have a hard dependency on OSTree 2018.6, it needs a new way to determine if the P2P API in OSTree is available, so this commit adds a "p2p" feature flag. This way the feature set is more semantically correct than if we had continued to use the "experimental" feature flag. In addition to making the P2P API public, this commit makes the P2P unit tests run by default, removes the f27-experimental CI instance that's no longer needed, changes a few man pages to reflect the changes, and updates the bash completion script to accept the new commands and options. Closes: #1596 Approved by: cgwalters
187 lines
8.3 KiB
C
187 lines
8.3 KiB
C
/*
|
||
* Copyright © 2017 Endless Mobile, Inc.
|
||
*
|
||
* SPDX-License-Identifier: LGPL-2.0+
|
||
*
|
||
* This library is free software; you can redistribute it and/or
|
||
* modify it under the terms of the GNU Lesser General Public
|
||
* License as published by the Free Software Foundation; either
|
||
* version 2 of the License, or (at your option) any later version.
|
||
*
|
||
* This library is distributed in the hope that it will be useful,
|
||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
* Lesser General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU Lesser General Public
|
||
* License along with this library; if not, write to the
|
||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||
* Boston, MA 02111-1307, USA.
|
||
*
|
||
* Authors:
|
||
* - Philip Withnall <withnall@endlessm.com>
|
||
*/
|
||
|
||
#pragma once
|
||
|
||
#include <gio/gio.h>
|
||
#include <glib.h>
|
||
#include <glib-object.h>
|
||
|
||
#include "ostree-ref.h"
|
||
#include "ostree-remote.h"
|
||
#include "ostree-types.h"
|
||
|
||
G_BEGIN_DECLS
|
||
|
||
#define OSTREE_TYPE_REPO_FINDER (ostree_repo_finder_get_type ())
|
||
|
||
/* Manually expanded version of the following, omitting autoptr support (for GLib < 2.44):
|
||
_OSTREE_PUBLIC
|
||
G_DECLARE_INTERFACE (OstreeRepoFinder, ostree_repo_finder, OSTREE, REPO_FINDER, GObject) */
|
||
|
||
_OSTREE_PUBLIC
|
||
GType ostree_repo_finder_get_type (void);
|
||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
|
||
typedef struct _OstreeRepoFinder OstreeRepoFinder;
|
||
typedef struct _OstreeRepoFinderInterface OstreeRepoFinderInterface;
|
||
|
||
static inline OstreeRepoFinder *OSTREE_REPO_FINDER (gpointer ptr) { return G_TYPE_CHECK_INSTANCE_CAST (ptr, ostree_repo_finder_get_type (), OstreeRepoFinder); }
|
||
static inline gboolean OSTREE_IS_REPO_FINDER (gpointer ptr) { return G_TYPE_CHECK_INSTANCE_TYPE (ptr, ostree_repo_finder_get_type ()); }
|
||
static inline OstreeRepoFinderInterface *OSTREE_REPO_FINDER_GET_IFACE (gpointer ptr) { return G_TYPE_INSTANCE_GET_INTERFACE (ptr, ostree_repo_finder_get_type (), OstreeRepoFinderInterface); }
|
||
G_GNUC_END_IGNORE_DEPRECATIONS
|
||
|
||
struct _OstreeRepoFinderInterface
|
||
{
|
||
GTypeInterface g_iface;
|
||
|
||
void (*resolve_async) (OstreeRepoFinder *self,
|
||
const OstreeCollectionRef * const *refs,
|
||
OstreeRepo *parent_repo,
|
||
GCancellable *cancellable,
|
||
GAsyncReadyCallback callback,
|
||
gpointer user_data);
|
||
GPtrArray *(*resolve_finish) (OstreeRepoFinder *self,
|
||
GAsyncResult *result,
|
||
GError **error);
|
||
};
|
||
|
||
_OSTREE_PUBLIC
|
||
void ostree_repo_finder_resolve_async (OstreeRepoFinder *self,
|
||
const OstreeCollectionRef * const *refs,
|
||
OstreeRepo *parent_repo,
|
||
GCancellable *cancellable,
|
||
GAsyncReadyCallback callback,
|
||
gpointer user_data);
|
||
_OSTREE_PUBLIC
|
||
GPtrArray *ostree_repo_finder_resolve_finish (OstreeRepoFinder *self,
|
||
GAsyncResult *result,
|
||
GError **error);
|
||
|
||
_OSTREE_PUBLIC
|
||
void ostree_repo_finder_resolve_all_async (OstreeRepoFinder * const *finders,
|
||
const OstreeCollectionRef * const *refs,
|
||
OstreeRepo *parent_repo,
|
||
GCancellable *cancellable,
|
||
GAsyncReadyCallback callback,
|
||
gpointer user_data);
|
||
_OSTREE_PUBLIC
|
||
GPtrArray *ostree_repo_finder_resolve_all_finish (GAsyncResult *result,
|
||
GError **error);
|
||
|
||
/**
|
||
* OstreeRepoFinderResult:
|
||
* @remote: #OstreeRemote which contains the transport details for the result,
|
||
* such as its URI and GPG key
|
||
* @finder: the #OstreeRepoFinder instance which produced this result
|
||
* @priority: static priority of the result, where higher numbers indicate lower
|
||
* priority
|
||
* @ref_to_checksum: (element-type OstreeCollectionRef utf8): map of collection–ref
|
||
* pairs to checksums provided by this remote; values may be %NULL to
|
||
* indicate this remote doesn’t provide that ref
|
||
* @ref_to_timestamp: (element-type OstreeCollectionRef guint64) (nullable): map of
|
||
* collection–ref pairs to timestamps; values may be 0 for various reasons
|
||
* @summary_last_modified: Unix timestamp (seconds since the epoch, UTC) when
|
||
* the summary file on the remote was last modified, or `0` if unknown
|
||
*
|
||
* #OstreeRepoFinderResult gives a single result from an
|
||
* ostree_repo_finder_resolve_async() or ostree_repo_finder_resolve_all_async()
|
||
* operation. This represents a single remote which provides none, some or all
|
||
* of the refs being resolved. The structure includes various bits of metadata
|
||
* which allow ostree_repo_pull_from_remotes_async() (for example) to prioritise
|
||
* how to pull the refs.
|
||
*
|
||
* The @priority is used as one input of many to ordering functions like
|
||
* ostree_repo_finder_result_compare().
|
||
*
|
||
* @ref_to_checksum indicates which refs (out of the ones queried for as inputs
|
||
* to ostree_repo_finder_resolve_async()) are provided by this remote. The refs
|
||
* are present as keys (of type #OstreeCollectionRef), and the corresponding values
|
||
* are the checksums of the commits the remote currently has for those refs. (These
|
||
* might not be the latest commits available out of all results.) A
|
||
* checksum may be %NULL if the remote does not advertise the corresponding ref.
|
||
* After ostree_repo_finder_resolve_async() has been called, the commit metadata
|
||
* should be available locally, so the details for each checksum can be looked
|
||
* up using ostree_repo_load_commit().
|
||
*
|
||
* @ref_to_timestamp provides timestamps for the set of refs in
|
||
* @ref_to_checksum. The refs are keys (of type #OstreeCollectionRef) and the
|
||
* values are guint64 pointers with the timestamp associated with the checksum
|
||
* provided in @ref_to_checksum. @ref_to_timestamp can be %NULL, and when it's
|
||
* not, the timestamps are zero when any of the following conditions are met:
|
||
* (1) the override-commit-ids option was used on
|
||
* ostree_repo_find_remotes_async (2) there was an error in trying to get the
|
||
* commit metadata (3) the checksum for this ref is %NULL in @ref_to_checksum.
|
||
*
|
||
* Since: 2018.6
|
||
*/
|
||
typedef struct
|
||
{
|
||
OstreeRemote *remote;
|
||
OstreeRepoFinder *finder;
|
||
gint priority;
|
||
GHashTable *ref_to_checksum;
|
||
guint64 summary_last_modified;
|
||
GHashTable *ref_to_timestamp;
|
||
|
||
/*< private >*/
|
||
gpointer padding[3];
|
||
} OstreeRepoFinderResult;
|
||
|
||
_OSTREE_PUBLIC
|
||
GType ostree_repo_finder_result_get_type (void);
|
||
|
||
_OSTREE_PUBLIC
|
||
OstreeRepoFinderResult *ostree_repo_finder_result_new (OstreeRemote *remote,
|
||
OstreeRepoFinder *finder,
|
||
gint priority,
|
||
GHashTable *ref_to_checksum,
|
||
GHashTable *ref_to_timestamp,
|
||
guint64 summary_last_modified);
|
||
_OSTREE_PUBLIC
|
||
OstreeRepoFinderResult *ostree_repo_finder_result_dup (OstreeRepoFinderResult *result);
|
||
_OSTREE_PUBLIC
|
||
gint ostree_repo_finder_result_compare (const OstreeRepoFinderResult *a,
|
||
const OstreeRepoFinderResult *b);
|
||
_OSTREE_PUBLIC
|
||
void ostree_repo_finder_result_free (OstreeRepoFinderResult *result);
|
||
|
||
/**
|
||
* OstreeRepoFinderResultv:
|
||
*
|
||
* A %NULL-terminated array of #OstreeRepoFinderResult instances, designed to
|
||
* be used with g_auto():
|
||
*
|
||
* |[<!-- language="C" -->
|
||
* g_auto(OstreeRepoFinderResultv) results = NULL;
|
||
* ]|
|
||
*
|
||
* Since: 2018.6
|
||
*/
|
||
typedef OstreeRepoFinderResult** OstreeRepoFinderResultv;
|
||
|
||
_OSTREE_PUBLIC
|
||
void ostree_repo_finder_result_freev (OstreeRepoFinderResult **results);
|
||
|
||
G_END_DECLS
|