remote: allow resetting url list
Because remote.*.url is treated as a multi-valued key, there is no way to override previous config. So for example if you have remote.origin.url set to some wrong value, doing: git -c remote.origin.url=right fetch would not work. It would append "right" to the list, which means we'd still fetch from "wrong" (since subsequent values are used only as push urls). Let's provide a mechanism to reset the list, like we do for other multi-valued keys (e.g., credential.helper, http.extraheaders, and merge.suppressDest all use this "empty string means reset" pattern). Reported-by: Mathew George <mathewegeorge@gmail.com> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
bd1b88dc7a
commit
9badf97c42
|
@ -8,13 +8,16 @@ remote.<name>.url::
|
|||
linkgit:git-push[1]. A configured remote can have multiple URLs;
|
||||
in this case the first is used for fetching, and all are used
|
||||
for pushing (assuming no `remote.<name>.pushurl` is defined).
|
||||
Setting this key to the empty string clears the list of urls,
|
||||
allowing you to override earlier config.
|
||||
|
||||
remote.<name>.pushurl::
|
||||
The push URL of a remote repository. See linkgit:git-push[1].
|
||||
If a `pushurl` option is present in a configured remote, it
|
||||
is used for pushing instead of `remote.<name>.url`. A configured
|
||||
remote can have multiple push URLs; in this case a push goes to
|
||||
all of them.
|
||||
all of them. Setting this key to the empty string clears the
|
||||
list of urls, allowing you to override earlier config.
|
||||
|
||||
remote.<name>.proxy::
|
||||
For remotes that require curl (http, https and ftp), the URL to
|
||||
|
|
6
remote.c
6
remote.c
|
@ -63,12 +63,18 @@ static char *alias_url(const char *url, struct rewrites *r)
|
|||
|
||||
static void add_url(struct remote *remote, const char *url)
|
||||
{
|
||||
if (*url)
|
||||
strvec_push(&remote->url, url);
|
||||
else
|
||||
strvec_clear(&remote->url);
|
||||
}
|
||||
|
||||
static void add_pushurl(struct remote *remote, const char *pushurl)
|
||||
{
|
||||
if (*pushurl)
|
||||
strvec_push(&remote->pushurl, pushurl);
|
||||
else
|
||||
strvec_clear(&remote->pushurl);
|
||||
}
|
||||
|
||||
static void add_pushurl_alias(struct remote_state *remote_state,
|
||||
|
|
|
@ -1492,4 +1492,40 @@ test_expect_success 'refs/remotes/* <src> refspec and unqualified <dst> DWIM and
|
|||
)
|
||||
'
|
||||
|
||||
test_expect_success 'empty config clears remote.*.url list' '
|
||||
test_when_finished "git config --remove-section remote.multi" &&
|
||||
git config --add remote.multi.url wrong-one &&
|
||||
git config --add remote.multi.url wrong-two &&
|
||||
git -c remote.multi.url= \
|
||||
-c remote.multi.url=right-one \
|
||||
-c remote.multi.url=right-two \
|
||||
remote show -n multi >actual.raw &&
|
||||
grep URL actual.raw >actual &&
|
||||
cat >expect <<-\EOF &&
|
||||
Fetch URL: right-one
|
||||
Push URL: right-one
|
||||
Push URL: right-two
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'empty config clears remote.*.pushurl list' '
|
||||
test_when_finished "git config --remove-section remote.multi" &&
|
||||
git config --add remote.multi.url right &&
|
||||
git config --add remote.multi.url will-be-ignored &&
|
||||
git config --add remote.multi.pushurl wrong-push-one &&
|
||||
git config --add remote.multi.pushurl wrong-push-two &&
|
||||
git -c remote.multi.pushurl= \
|
||||
-c remote.multi.pushurl=right-push-one \
|
||||
-c remote.multi.pushurl=right-push-two \
|
||||
remote show -n multi >actual.raw &&
|
||||
grep URL actual.raw >actual &&
|
||||
cat >expect <<-\EOF &&
|
||||
Fetch URL: right
|
||||
Push URL: right-push-one
|
||||
Push URL: right-push-two
|
||||
EOF
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
Loading…
Reference in New Issue