Skip to content

Commit

Permalink
remote: allow resetting url list
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Jeff King <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
peff authored and gitster committed Jun 14, 2024
1 parent bd1b88d commit 9badf97
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 3 deletions.
5 changes: 4 additions & 1 deletion Documentation/config/remote.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 8 additions & 2 deletions remote.c
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,18 @@ static char *alias_url(const char *url, struct rewrites *r)

static void add_url(struct remote *remote, const char *url)
{
strvec_push(&remote->url, url);
if (*url)
strvec_push(&remote->url, url);
else
strvec_clear(&remote->url);
}

static void add_pushurl(struct remote *remote, const char *pushurl)
{
strvec_push(&remote->pushurl, pushurl);
if (*pushurl)
strvec_push(&remote->pushurl, pushurl);
else
strvec_clear(&remote->pushurl);
}

static void add_pushurl_alias(struct remote_state *remote_state,
Expand Down
36 changes: 36 additions & 0 deletions t/t5505-remote.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 9badf97

Please sign in to comment.