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"