remote: use remote_is_configured() for add and rename
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>
This commit is contained in:
parent
cc8e538d45
commit
a31eeae27f
@ -186,10 +186,7 @@ static int add(int argc, const char **argv)
|
|||||||
url = argv[1];
|
url = argv[1];
|
||||||
|
|
||||||
remote = remote_get(name);
|
remote = remote_get(name);
|
||||||
if (remote && (remote->url_nr > 1 ||
|
if (remote_is_configured(remote))
|
||||||
(strcmp(name, remote->url[0]) &&
|
|
||||||
strcmp(url, remote->url[0])) ||
|
|
||||||
remote->fetch_refspec_nr))
|
|
||||||
die(_("remote %s already exists."), name);
|
die(_("remote %s already exists."), name);
|
||||||
|
|
||||||
strbuf_addf(&buf2, "refs/heads/test:refs/remotes/%s/test", 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);
|
return migrate_file(oldremote);
|
||||||
|
|
||||||
newremote = remote_get(rename.new);
|
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);
|
die(_("remote %s already exists."), rename.new);
|
||||||
|
|
||||||
strbuf_addf(&buf, "refs/heads/test:refs/remotes/%s/test", rename.new);
|
strbuf_addf(&buf, "refs/heads/test:refs/remotes/%s/test", rename.new);
|
||||||
|
@ -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
|
cat >test/expect <<EOF
|
||||||
* remote origin
|
* remote origin
|
||||||
Fetch URL: $(pwd)/one
|
Fetch URL: $(pwd)/one
|
||||||
|
Loading…
x
Reference in New Issue
Block a user