[PATCH v2 4/4] remote: use remote_is_configured() for add and rename
- From
Thomas Gummerer <t.gummerer@gmail.com>
- Date
- Feb 15, 2016, 22:39 UTC
- Message-ID
- <1455575984-24348-5-git-send-email-t.gummerer@gmail.com>
- In-Reply-To
- <1455575984-24348-1-git-send-email-t.gummerer@gmail.com>
Both remote add and remote rename use a slightly different hand-rolled check if the remote exits. The hand-rolled check may have some subtle cases in which it might fail to detect when a remote already exists. One such case was fixed in fb86e32 ("git remote: allow adding remotes agreeing with url.<...>.insteadOf"). Another case is when a remote is configured as follows:
[remote "foo"]
vcs = barIf we try to run `git remote add foo bar` with the above remote configuration, git segfaults. This change fixes it.
In addition, git remote rename $existing foo with the configuration for foo as above silently succeeds, even though foo already exists, modifying its configuration. With this patch it fails with "remote foo already exists".
Signed-off-by: Thomas Gummerer <t.gummerer@gmail.com> --- builtin/remote.c | 7 ++----- t/t5505-remote.sh | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/builtin/remote.c b/builtin/remote.c index 981c487..bd57f1b 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -186,10 +186,7 @@ static int add(int argc, const char **argv) url = argv[1]; remote = remote_get(name); - if (remote && (remote->url_nr > 1 || - (strcmp(name, remote->url[0]) && - strcmp(url, remote->url[0])) || - remote->fetch_refspec_nr)) + if (remote_is_configured(remote)) die(_("remote %s already exists."), name); strbuf_addf(&buf2, "refs/heads/test:refs/remotes/%s/test", name); @@ -641,7 +638,7 @@ static int mv(int argc, const char **argv) return migrate_file(oldremote); newremote = remote_get(rename.new); - if (newremote && (newremote->url_nr > 1 || newremote->fetch_refspec_nr)) + if (remote_is_configured(newremote)) die(_("remote %s already exists."), rename.new); strbuf_addf(&buf, "refs/heads/test:refs/remotes/%s/test", rename.new); diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh index f1d073f..142ae62 100755 --- a/t/t5505-remote.sh +++ b/t/t5505-remote.sh @@ -157,6 +157,24 @@ test_expect_success 'rename errors out early when deleting non-existent branch' ) ' +test_expect_success 'add existing foreign_vcs remote' ' + git config --add remote.foo.vcs "bar" && + test_when_finished git remote rm foo && + echo "fatal: remote foo already exists." >expect && + test_must_fail git remote add foo bar 2>actual && + test_i18ncmp expect actual +' + +test_expect_success 'add existing foreign_vcs remote' ' + git config --add remote.foo.vcs "bar" && + git config --add remote.bar.vcs "bar" && + test_when_finished git remote rm foo && + test_when_finished git remote rm bar && + echo "fatal: remote bar already exists." >expect && + test_must_fail git remote rename foo bar 2>actual && + test_i18ncmp expect actual +' + cat >test/expect <<EOF * remote origin Fetch URL: $(pwd)/one
-- 2.7.1.410.g6faf27b