repo: Add OstreeRepoRemoteChange replace operation
Add the OSTREE_REPO_REMOTE_CHANGE_REPLACE operation to the OstreeRepoRemoteChange enum. This operation will add a remote or replace an existing one. It respects the location of the remote configuration file when replacing and the remotes config dir settings when adding a new remote. Closes: #1166 Approved by: cgwalters
This commit is contained in:
1 parent
6e935ee26f
commit
15ba2007a1
3 files changed
+141
-4
No files matched your search
@@ -1735,6 +1735,88 @@ ostree_repo_remote_delete (OstreeRepo *self,
|
||||
return impl_repo_remote_delete (self, NULL, FALSE, name, cancellable, error);
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
impl_repo_remote_replace (OstreeRepo *self,
|
||||
GFile *sysroot,
|
||||
const char *name,
|
||||
const char *url,
|
||||
GVariant *options,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (name != NULL, FALSE);
|
||||
g_return_val_if_fail (url != NULL, FALSE);
|
||||
g_return_val_if_fail (options == NULL || g_variant_is_of_type (options, G_VARIANT_TYPE ("a{sv}")), FALSE);
|
||||
|
||||
if (!ostree_validate_remote_name (name, error))
|
||||
return FALSE;
|
||||
|
||||
g_autoptr(GError) local_error = NULL;
|
||||
g_autoptr(OstreeRemote) remote = _ostree_repo_get_remote (self, name, &local_error);
|
||||
if (remote == NULL)
|
||||
{
|
||||
if (!g_error_matches (local_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
||||
{
|
||||
g_propagate_error (error, g_steal_pointer (&local_error));
|
||||
return FALSE;
|
||||
}
|
||||
g_clear_error (&local_error);
|
||||
if (!impl_repo_remote_add (self, sysroot, FALSE, name, url, options,
|
||||
cancellable, error))
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Replace the entire option group */
|
||||
if (!g_key_file_remove_group (remote->options, remote->group, error))
|
||||
return FALSE;
|
||||
|
||||
if (g_str_has_prefix (url, "metalink="))
|
||||
g_key_file_set_string (remote->options, remote->group, "metalink",
|
||||
url + strlen ("metalink="));
|
||||
else
|
||||
g_key_file_set_string (remote->options, remote->group, "url", url);
|
||||
|
||||
if (options != NULL)
|
||||
keyfile_set_from_vardict (remote->options, remote->group, options);
|
||||
|
||||
/* Write out updated settings */
|
||||
if (remote->file != NULL)
|
||||
{
|
||||
gsize length;
|
||||
g_autofree char *data = g_key_file_to_data (remote->options, &length,
|
||||
NULL);
|
||||
|
||||
if (!g_file_replace_contents (remote->file, data, length,
|
||||
NULL, FALSE, 0, NULL,
|
||||
cancellable, error))
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_autoptr(GKeyFile) config = ostree_repo_copy_config (self);
|
||||
|
||||
/* Remove the existing group if it exists */
|
||||
if (!g_key_file_remove_group (config, remote->group, &local_error))
|
||||
{
|
||||
if (!g_error_matches (local_error, G_KEY_FILE_ERROR,
|
||||
G_KEY_FILE_ERROR_GROUP_NOT_FOUND))
|
||||
{
|
||||
g_propagate_error (error, g_steal_pointer (&local_error));
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
ot_keyfile_copy_group (remote->options, config, remote->group);
|
||||
if (!ostree_repo_write_config (self, config, error))
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* ostree_repo_remote_change:
|
||||
* @self: Repo
|
||||
@@ -1776,6 +1858,9 @@ ostree_repo_remote_change (OstreeRepo *self,
|
||||
case OSTREE_REPO_REMOTE_CHANGE_DELETE_IF_EXISTS:
|
||||
return impl_repo_remote_delete (self, sysroot, TRUE, name,
|
||||
cancellable, error);
|
||||
case OSTREE_REPO_REMOTE_CHANGE_REPLACE:
|
||||
return impl_repo_remote_replace (self, sysroot, name, url, options,
|
||||
cancellable, error);
|
||||
}
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
@@ -166,12 +166,14 @@ gboolean ostree_repo_remote_delete (OstreeRepo *self,
|
||||
* @OSTREE_REPO_REMOTE_CHANGE_ADD_IF_NOT_EXISTS: Like above, but do nothing if the remote exists
|
||||
* @OSTREE_REPO_REMOTE_CHANGE_DELETE: Delete a remote
|
||||
* @OSTREE_REPO_REMOTE_CHANGE_DELETE_IF_EXISTS: Delete a remote, do nothing if the remote does not exist
|
||||
* @OSTREE_REPO_REMOTE_CHANGE_REPLACE: Add or replace a remote (Since: 2019.1)
|
||||
*/
|
||||
typedef enum {
|
||||
OSTREE_REPO_REMOTE_CHANGE_ADD,
|
||||
OSTREE_REPO_REMOTE_CHANGE_ADD_IF_NOT_EXISTS,
|
||||
OSTREE_REPO_REMOTE_CHANGE_DELETE,
|
||||
OSTREE_REPO_REMOTE_CHANGE_DELETE_IF_EXISTS
|
||||
OSTREE_REPO_REMOTE_CHANGE_DELETE_IF_EXISTS,
|
||||
OSTREE_REPO_REMOTE_CHANGE_REPLACE,
|
||||
} OstreeRepoRemoteChange;
|
||||
|
||||
_OSTREE_PUBLIC
|
||||
|
||||
Reference in new issue
Block a user