From b33a4e9b1e5df8c4126dedb9f24f66ee0b1d7ad5 Mon Sep 17 00:00:00 2001 From: Dan Nicholson Date: Tue, 12 Sep 2017 17:05:08 -0500 Subject: [PATCH] remote-add: Add --force option to add or replace remote This uses the OSTREE_REPO_REMOTE_CHANGE_REPLACE operation to add a remote or replace an existing one. This is roughly the opposite of --if-not-exists and will raise an error if both options are passed. Closes: #1166 Approved by: cgwalters --- bash/ostree | 1 + man/ostree-remote.xml | 8 ++++++++ src/ostree/ot-remote-builtin-add.c | 21 ++++++++++++++++++--- tests/test-remote-add.sh | 14 +++++++++++++- 4 files changed, 40 insertions(+), 4 deletions(-) diff --git a/bash/ostree b/bash/ostree index 52b111ec..5ba3d475 100644 --- a/bash/ostree +++ b/bash/ostree @@ -985,6 +985,7 @@ _ostree_remote_add() { local boolean_options=" $main_boolean_options --if-not-exists + --force --no-gpg-verify " diff --git a/man/ostree-remote.xml b/man/ostree-remote.xml index 5e218058..407f7e3d 100644 --- a/man/ostree-remote.xml +++ b/man/ostree-remote.xml @@ -136,6 +136,14 @@ Boston, MA 02111-1307, USA. + + + + + Replace the provided remote if it exists. + + + diff --git a/src/ostree/ot-remote-builtin-add.c b/src/ostree/ot-remote-builtin-add.c index 8b339dbd..f81f7580 100644 --- a/src/ostree/ot-remote-builtin-add.c +++ b/src/ostree/ot-remote-builtin-add.c @@ -30,6 +30,7 @@ static char **opt_set; static gboolean opt_no_gpg_verify; static gboolean opt_if_not_exists; +static gboolean opt_force; static char *opt_gpg_import; static char *opt_contenturl; static char *opt_collection_id; @@ -45,6 +46,7 @@ static GOptionEntry option_entries[] = { { "set", 0, 0, G_OPTION_ARG_STRING_ARRAY, &opt_set, "Set config option KEY=VALUE for remote", "KEY=VALUE" }, { "no-gpg-verify", 0, 0, G_OPTION_ARG_NONE, &opt_no_gpg_verify, "Disable GPG verification", NULL }, { "if-not-exists", 0, 0, G_OPTION_ARG_NONE, &opt_if_not_exists, "Do nothing if the provided remote exists", NULL }, + { "force", 0, 0, G_OPTION_ARG_NONE, &opt_force, "Replace the provided remote if it exists", NULL }, { "gpg-import", 0, 0, G_OPTION_ARG_FILENAME, &opt_gpg_import, "Import GPG key from FILE", "FILE" }, { "contenturl", 0, 0, G_OPTION_ARG_STRING, &opt_contenturl, "Use URL when fetching content", "URL" }, { "collection-id", 0, 0, G_OPTION_ARG_STRING, &opt_collection_id, @@ -84,6 +86,14 @@ ot_remote_builtin_add (int argc, char **argv, OstreeCommandInvocation *invocatio goto out; } + if (opt_if_not_exists && opt_force) + { + ot_util_usage_error (context, + "Can only specify one of --if-not-exists and --force", + error); + goto out; + } + remote_name = argv[1]; remote_url = argv[2]; @@ -135,9 +145,14 @@ ot_remote_builtin_add (int argc, char **argv, OstreeCommandInvocation *invocatio options = g_variant_ref_sink (g_variant_builder_end (optbuilder)); - if (!ostree_repo_remote_change (repo, NULL, - opt_if_not_exists ? OSTREE_REPO_REMOTE_CHANGE_ADD_IF_NOT_EXISTS : - OSTREE_REPO_REMOTE_CHANGE_ADD, + OstreeRepoRemoteChange changeop; + if (opt_if_not_exists) + changeop = OSTREE_REPO_REMOTE_CHANGE_ADD_IF_NOT_EXISTS; + else if (opt_force) + changeop = OSTREE_REPO_REMOTE_CHANGE_REPLACE; + else + changeop = OSTREE_REPO_REMOTE_CHANGE_ADD; + if (!ostree_repo_remote_change (repo, NULL, changeop, remote_name, remote_url, options, cancellable, error)) diff --git a/tests/test-remote-add.sh b/tests/test-remote-add.sh index 9aa5c6a2..57fe7eec 100755 --- a/tests/test-remote-add.sh +++ b/tests/test-remote-add.sh @@ -23,7 +23,7 @@ set -euo pipefail . $(dirname $0)/libtest.sh -echo '1..14' +echo '1..16' setup_test_repository "bare" $OSTREE remote add origin http://example.com/ostree/gnome @@ -106,3 +106,15 @@ assert_not_file_has_content list.txt "origin" # Can't grep for 'another' because of 'another-noexist' assert_file_has_content list.txt "another-noexist" echo "ok remote list remaining" + +# Both --if-not-exists and --force cannot be used +if $OSTREE remote add --if-not-exists --force yetanother http://yetanother.com/repo 2>/dev/null; then + assert_not_reached "Adding remote with --if-not-exists and --force unexpectedly succeeded" +fi +echo "ok remote add fail --if-not-exists and --force" + +# Overwrite with --force +$OSTREE remote add --force another http://another.example.com/anotherrepo +$OSTREE remote list --show-urls > list.txt +assert_file_has_content list.txt "^another \+http://another.example.com/anotherrepo$" +echo "ok remote add --force"