Skip to content

Commit

Permalink
remote: use remote_is_configured() for add and rename
Browse files Browse the repository at this point in the history
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 = bar

If 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>
Reviewed-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Thomas Gummerer authored and Junio C Hamano committed Feb 16, 2016
1 parent cc8e538 commit a31eeae
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
7 changes: 2 additions & 5 deletions builtin/remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
15 changes: 15 additions & 0 deletions t/t5505-remote.sh
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,21 @@ test_expect_success 'rename errors out early when deleting non-existent branch'
)
'

test_expect_success 'add existing foreign_vcs remote' '
test_config remote.foo.vcs bar &&
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' '
test_config remote.foo.vcs bar &&
test_config remote.bar.vcs 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
Expand Down

0 comments on commit a31eeae

Please sign in to comment.