lib/remote: Store name of remote providing keyring for dynamic remotes
When pulling from a dynamic (peer to peer) remote, the remote’s name is set to a unique, generated string which doesn’t exist in repo/config. If doing a non-mirror pull, however, we don’t want to use this name in the refspecs for newly created or updated refs — we want to use the name of the remote which provided the keyring for the pull (this will be a remote from repo/config whose collection ID matches that being used for the peer to peer pull). Store both names in OstreeRemote. The name to use for refspecs is stored as refspec_name, and is typically NULL unless it differs from name. Signed-off-by: Philip Withnall <withnall@endlessm.com> Closes: #1202 Approved by: cgwalters
This commit is contained in:
parent
22c1fdfbd3
commit
69e332a0c0
|
|
@ -35,17 +35,24 @@
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
/* @refspec_name is set if this is a dynamic remote. It’s the name of the static
|
||||||
|
* remote which this one inherits from, and is what should be used in refspecs
|
||||||
|
* for pulls from this remote. If it’s %NULL, @name should be used instead. */
|
||||||
struct OstreeRemote {
|
struct OstreeRemote {
|
||||||
volatile int ref_count;
|
volatile int ref_count;
|
||||||
char *name; /* (not nullable) */
|
char *name; /* (not nullable) */
|
||||||
|
char *refspec_name; /* (nullable) */
|
||||||
char *group; /* group name in options (not nullable) */
|
char *group; /* group name in options (not nullable) */
|
||||||
char *keyring; /* keyring name (NAME.trustedkeys.gpg) (not nullable) */
|
char *keyring; /* keyring name ($refspec_name.trustedkeys.gpg) (not nullable) */
|
||||||
GFile *file; /* NULL if remote defined in repo/config */
|
GFile *file; /* NULL if remote defined in repo/config */
|
||||||
GKeyFile *options;
|
GKeyFile *options;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_GNUC_INTERNAL
|
G_GNUC_INTERNAL
|
||||||
OstreeRemote *ostree_remote_new (const gchar *name);
|
OstreeRemote *ostree_remote_new (const gchar *name);
|
||||||
|
G_GNUC_INTERNAL
|
||||||
|
OstreeRemote *ostree_remote_new_dynamic (const gchar *name,
|
||||||
|
const gchar *refspec_name);
|
||||||
|
|
||||||
G_GNUC_INTERNAL
|
G_GNUC_INTERNAL
|
||||||
OstreeRemote *ostree_remote_new_from_keyfile (GKeyFile *keyfile,
|
OstreeRemote *ostree_remote_new_from_keyfile (GKeyFile *keyfile,
|
||||||
|
|
|
||||||
|
|
@ -53,16 +53,25 @@
|
||||||
|
|
||||||
OstreeRemote *
|
OstreeRemote *
|
||||||
ostree_remote_new (const gchar *name)
|
ostree_remote_new (const gchar *name)
|
||||||
|
{
|
||||||
|
return ostree_remote_new_dynamic (name, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
OstreeRemote *
|
||||||
|
ostree_remote_new_dynamic (const gchar *name,
|
||||||
|
const gchar *refspec_name)
|
||||||
{
|
{
|
||||||
OstreeRemote *remote;
|
OstreeRemote *remote;
|
||||||
|
|
||||||
g_return_val_if_fail (name != NULL && *name != '\0', NULL);
|
g_return_val_if_fail (name != NULL && *name != '\0', NULL);
|
||||||
|
g_return_val_if_fail (refspec_name == NULL || *refspec_name != '\0', NULL);
|
||||||
|
|
||||||
remote = g_slice_new0 (OstreeRemote);
|
remote = g_slice_new0 (OstreeRemote);
|
||||||
remote->ref_count = 1;
|
remote->ref_count = 1;
|
||||||
remote->name = g_strdup (name);
|
remote->name = g_strdup (name);
|
||||||
remote->group = g_strdup_printf ("remote \"%s\"", name);
|
remote->refspec_name = g_strdup (refspec_name);
|
||||||
remote->keyring = g_strdup_printf ("%s.trustedkeys.gpg", name);
|
remote->group = g_strdup_printf ("remote \"%s\"", (refspec_name != NULL) ? refspec_name : name);
|
||||||
|
remote->keyring = g_strdup_printf ("%s.trustedkeys.gpg", (refspec_name != NULL) ? refspec_name : name);
|
||||||
remote->options = g_key_file_new ();
|
remote->options = g_key_file_new ();
|
||||||
|
|
||||||
return remote;
|
return remote;
|
||||||
|
|
|
||||||
|
|
@ -821,7 +821,7 @@ ostree_avahi_service_build_repo_finder_result (OstreeAvahiService
|
||||||
/* Build an #OstreeRemote. Use the escaped URI, since remote->name
|
/* Build an #OstreeRemote. Use the escaped URI, since remote->name
|
||||||
* is used in file paths, so needs to not contain special characters. */
|
* is used in file paths, so needs to not contain special characters. */
|
||||||
g_autofree gchar *name = uri_and_keyring_to_name (repo);
|
g_autofree gchar *name = uri_and_keyring_to_name (repo);
|
||||||
remote = ostree_remote_new (name);
|
remote = ostree_remote_new_dynamic (name, repo->keyring_remote->name);
|
||||||
|
|
||||||
g_clear_pointer (&remote->keyring, g_free);
|
g_clear_pointer (&remote->keyring, g_free);
|
||||||
remote->keyring = g_strdup (repo->keyring_remote->keyring);
|
remote->keyring = g_strdup (repo->keyring_remote->keyring);
|
||||||
|
|
|
||||||
|
|
@ -513,7 +513,7 @@ ostree_repo_finder_mount_resolve_async (OstreeRepoFinder *finde
|
||||||
/* Build an #OstreeRemote. Use the escaped URI, since remote->name
|
/* Build an #OstreeRemote. Use the escaped URI, since remote->name
|
||||||
* is used in file paths, so needs to not contain special characters. */
|
* is used in file paths, so needs to not contain special characters. */
|
||||||
g_autofree gchar *name = uri_and_keyring_to_name (repo);
|
g_autofree gchar *name = uri_and_keyring_to_name (repo);
|
||||||
remote = ostree_remote_new (name);
|
remote = ostree_remote_new_dynamic (name, repo->keyring_remote->name);
|
||||||
|
|
||||||
g_clear_pointer (&remote->keyring, g_free);
|
g_clear_pointer (&remote->keyring, g_free);
|
||||||
remote->keyring = g_strdup (repo->keyring_remote->keyring);
|
remote->keyring = g_strdup (repo->keyring_remote->keyring);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue