From: Elijah Newren <newren@gmail.com>
To: Jeff King <peff@peff.net>
Cc: Junio C Hamano <gitster@pobox.com>,
Mathew George <mathewegeorge@gmail.com>,
git@vger.kernel.org
Subject: Re: [PATCH 07/11] remote: allow resetting url list
Date: Tue, 25 Jun 2024 10:35:37 -0700 [thread overview]
Message-ID: <CABPp-BHDVarb8V+zMmWYdMVgypvmbPLCecPRQ3y9DGKngZzyGQ@mail.gmail.com> (raw)
In-Reply-To: <20240614103122.GG222445@coredump.intra.peff.net>
On Fri, Jun 14, 2024 at 3:32 AM Jeff King <peff@peff.net> wrote:
>
> 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>
> ---
> By the way, I think the nearby remote.*.fetch and remote.*.push could
> learn the same trick. I left that out of this series, mostly because it
> was getting long. But also because I had trouble imagining how a one-off
> refspec change would be useful. We can revisit it on top if we want.
Yeah, deferring makes sense to me.
> Documentation/config/remote.txt | 5 ++++-
> remote.c | 10 +++++++--
> t/t5505-remote.sh | 36 +++++++++++++++++++++++++++++++++
> 3 files changed, 48 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/config/remote.txt b/Documentation/config/remote.txt
> index eef0bf4f62..8efc53e836 100644
> --- a/Documentation/config/remote.txt
> +++ b/Documentation/config/remote.txt
> @@ -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
Thanks for documenting this too.
> diff --git a/remote.c b/remote.c
> index 9417d83e51..b7262964fb 100644
> --- a/remote.c
> +++ b/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)
> {
> - 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);
> }
Nice that after the preparation patches the fix is nice and simple.
> static void add_pushurl_alias(struct remote_state *remote_state,
> diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
> index 7789ff12c4..08424e878e 100755
> --- a/t/t5505-remote.sh
> +++ b/t/t5505-remote.sh
> @@ -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
> --
> 2.45.2.937.g0bcb3c087a
Make sense.
next prev parent reply other threads:[~2024-06-25 17:35 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-09 6:51 Cannot override `remote.origin.url` with `-c` option Mathew George
2024-06-11 7:51 ` Jeff King
2024-06-11 15:28 ` Junio C Hamano
2024-06-13 10:24 ` Jeff King
2024-06-14 10:24 ` [PATCH 0/11] allow overriding remote.*.url Jeff King
2024-06-14 10:25 ` [PATCH 01/11] archive: fix check for missing url Jeff King
2024-06-14 10:26 ` [PATCH 02/11] remote: refactor alias_url() memory ownership Jeff King
2024-06-14 17:05 ` Junio C Hamano
2024-06-14 10:27 ` [PATCH 03/11] remote: transfer ownership of memory in add_url(), etc Jeff King
2024-06-14 17:04 ` Junio C Hamano
2024-06-16 4:59 ` Jeff King
2024-06-17 17:42 ` Junio C Hamano
2024-06-25 17:30 ` Elijah Newren
2024-06-14 10:28 ` [PATCH 04/11] remote: use strvecs to store remote url/pushurl Jeff King
2024-06-25 17:32 ` Elijah Newren
2024-06-14 10:29 ` [PATCH 05/11] remote: simplify url/pushurl selection Jeff King
2024-06-25 17:33 ` Elijah Newren
2024-06-14 10:30 ` [PATCH 06/11] config: document remote.*.url/pushurl interaction Jeff King
2024-06-25 17:34 ` Elijah Newren
2024-06-14 10:31 ` [PATCH 07/11] remote: allow resetting url list Jeff King
2024-06-25 17:35 ` Elijah Newren [this message]
2024-06-14 10:31 ` [PATCH 08/11] t5801: make remote-testgit GIT_DIR setup more robust Jeff King
2024-06-25 17:36 ` Elijah Newren
2024-06-14 10:34 ` [PATCH 09/11] t5801: test remote.*.vcs config Jeff King
2024-06-14 10:37 ` [PATCH 10/11] remote: always require at least one url in a remote Jeff King
2024-06-14 10:42 ` [PATCH 11/11] remote: drop checks for zero-url case Jeff King
2024-06-25 17:37 ` Elijah Newren
2024-06-25 17:44 ` [PATCH 0/11] allow overriding remote.*.url Elijah Newren
2024-06-26 20:40 ` Jeff King
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CABPp-BHDVarb8V+zMmWYdMVgypvmbPLCecPRQ3y9DGKngZzyGQ@mail.gmail.com \
--to=newren@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mathewegeorge@gmail.com \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).