git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Junio C Hamano <gitster@pobox.com>
To: Denton Liu <liu.denton@gmail.com>
Cc: git@vger.kernel.org, anmolmago@gmail.com, briankyho@gmail.com,
	david.lu97@outlook.com, shirui.wang@hotmail.com
Subject: Re: [PATCH v3] remote: add --save-to-push option to git remote set-url
Date: Tue, 13 Nov 2018 18:46:40 +0900	[thread overview]
Message-ID: <xmqqy39xux6n.fsf@gitster-ct.c.googlers.com> (raw)
In-Reply-To: <8fded8b84b593497177de740f80b3499c4269758.1541740174.git.liu.denton@gmail.com> (Denton Liu's message of "Fri, 9 Nov 2018 00:20:02 -0500")

Denton Liu <liu.denton@gmail.com> writes:

> This adds the --save-to-push option to `git remote set-url` such that
> when executed, we move the remote.*.url to remote.*.pushurl and set
> remote.*.url to the given url argument.
>
> For example, if we have the following config:
>
> 	[remote "origin"]
> 		url = git@github.com:git/git.git
>
> `git remote set-url --save-to-push origin https://github.com/git/git.git`
> would change the config to the following:
>
> 	[remote "origin"]
> 		url = https://github.com/git/git.git
> 		pushurl = git@github.com:git/git.git
>
> Signed-off-by: Denton Liu <liu.denton@gmail.com>
> ---
> On Fri, Nov 09, 2018 at 12:15:22PM +0900, Junio C Hamano wrote:
>> This sounds more like "saving to push" (i.e. what you are saving is
>> the existing "url" and the "push" is a shorthand for "pushURL",
>> which is the location the old value of "url" is aved to), not "save
>> (the) push(URL)".  So if adding this option makes sense, I would say
>> "--save-to-push" (or even "--save-to-pushURL") may be a more
>> appropriate name for it.
>> 
>
> My original intention was for it to mean "save push behavior" but I
> agree with you that it's unclear so I'm changing it to --save-to-push.
>
>> Ambigous in what way?  You asked the current URL to be saved as a
>> pushURL, so existing pushURL destinations should not come into play,
>> I would think.  If there are more than one URL (not pushURL), on the
>> other hand, I think you have a bigger problem (where would "git fetch"
>> fetch from, and how would these multiple URLs are prevented from
>> trashing refs/remotes/$remote/* with each other's refs?), so
>> stopping the operation before "set-url" makes the problem worse is
>> probably a good idea, but I think that is true with or without this
>> new option.
>> 
>
>> I _think_ in the future (if this option turns out to be widely used)
>> people may ask for this condition to be loosened somewhat, but it is
>> relatively easy to start restrictive and then to loosen later, so I
>> think this is OK for now.
>> 
>
> I agree, there's no reason why we shouldn't allow appending to the push
> URLs if one already exists so I removed that removed that restriction.
> ---
>  Documentation/git-remote.txt |  5 +++++
>  builtin/remote.c             | 26 +++++++++++++++++++++-----
>  t/t5505-remote.sh            | 11 +++++++++++
>  3 files changed, 37 insertions(+), 5 deletions(-)
>
> diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt
> index 0cad37fb81..8f9d700252 100644
> --- a/Documentation/git-remote.txt
> +++ b/Documentation/git-remote.txt
> @@ -19,6 +19,7 @@ SYNOPSIS
>  'git remote set-url' [--push] <name> <newurl> [<oldurl>]
>  'git remote set-url --add' [--push] <name> <newurl>
>  'git remote set-url --delete' [--push] <name> <url>
> +'git remote set-url --save-to-push' <name> <url>
>  'git remote' [-v | --verbose] 'show' [-n] <name>...
>  'git remote prune' [-n | --dry-run] <name>...
>  'git remote' [-v | --verbose] 'update' [-p | --prune] [(<group> | <remote>)...]
> @@ -155,6 +156,10 @@ With `--delete`, instead of changing existing URLs, all URLs matching
>  regex <url> are deleted for remote <name>.  Trying to delete all
>  non-push URLs is an error.
>  +
> +With `--save-to-push`, the current URL is saved into the push URL before
> +setting the URL to <url>. Note that this command will not work if more than one
> +URL is defined because the behavior would be ambiguous.
> ++
>  Note that the push URL and the fetch URL, even though they can
>  be set differently, must still refer to the same place.  What you
>  pushed to the push URL should be what you would see if you
> diff --git a/builtin/remote.c b/builtin/remote.c
> index f7edf7f2cb..3249c3face 100644
> --- a/builtin/remote.c
> +++ b/builtin/remote.c
> @@ -24,8 +24,9 @@ static const char * const builtin_remote_usage[] = {
>  	N_("git remote set-branches [--add] <name> <branch>..."),
>  	N_("git remote get-url [--push] [--all] <name>"),
>  	N_("git remote set-url [--push] <name> <newurl> [<oldurl>]"),
> -	N_("git remote set-url --add <name> <newurl>"),
> -	N_("git remote set-url --delete <name> <url>"),
> +	N_("git remote set-url --add [--push] <name> <newurl>"),
> +	N_("git remote set-url --delete [--push] <name> <url>"),
> +	N_("git remote set-url --save-to-push <name> <url>"),
>  	NULL
>  };
>  
> @@ -77,8 +78,9 @@ static const char * const builtin_remote_geturl_usage[] = {
>  
>  static const char * const builtin_remote_seturl_usage[] = {
>  	N_("git remote set-url [--push] <name> <newurl> [<oldurl>]"),
> -	N_("git remote set-url --add <name> <newurl>"),
> -	N_("git remote set-url --delete <name> <url>"),
> +	N_("git remote set-url --add [--push] <name> <newurl>"),
> +	N_("git remote set-url --delete [--push] <name> <url>"),
> +	N_("git remote set-url --save-to-push <name> <url>"),
>  	NULL
>  };
>  
> @@ -1519,7 +1521,7 @@ static int get_url(int argc, const char **argv)
>  
>  static int set_url(int argc, const char **argv)
>  {
> -	int i, push_mode = 0, add_mode = 0, delete_mode = 0;
> +	int i, push_mode = 0, save_to_push = 0, add_mode = 0, delete_mode = 0;
>  	int matches = 0, negative_matches = 0;
>  	const char *remotename = NULL;
>  	const char *newurl = NULL;
> @@ -1532,6 +1534,8 @@ static int set_url(int argc, const char **argv)
>  	struct option options[] = {
>  		OPT_BOOL('\0', "push", &push_mode,
>  			 N_("manipulate push URLs")),
> +		OPT_BOOL('\0', "save-to-push", &save_to_push,
> +			 N_("change fetching URL behavior")),
>  		OPT_BOOL('\0', "add", &add_mode,
>  			 N_("add URL")),
>  		OPT_BOOL('\0', "delete", &delete_mode,
> @@ -1543,6 +1547,8 @@ static int set_url(int argc, const char **argv)
>  
>  	if (add_mode && delete_mode)
>  		die(_("--add --delete doesn't make sense"));
> +	if (save_to_push && (push_mode || add_mode || delete_mode))
> +		die(_("--save-to-push cannot be used with other options"));
>  
>  	if (argc < 3 || argc > 4 || ((add_mode || delete_mode) && argc != 3))
>  		usage_with_options(builtin_remote_seturl_usage, options);
> @@ -1564,6 +1570,16 @@ static int set_url(int argc, const char **argv)
>  		urlset = remote->pushurl;
>  		urlset_nr = remote->pushurl_nr;
>  	} else {
> +		if (save_to_push) {
> +			if (remote->url_nr != 1)
> +				die(_("--save-to-push can only be used when only one url is defined"), remotename);

Unused parameter "remotename" is fed to die().  I'll drop this.

> +
> +			strbuf_addf(&name_buf, "remote.%s.pushurl", remotename);
> +			git_config_set_multivar(name_buf.buf,
> +			      remote->url[0], "^$", 0);
> +			strbuf_reset(&name_buf);
> +		}
> +
>  		strbuf_addf(&name_buf, "remote.%s.url", remotename);
>  		urlset = remote->url;
>  		urlset_nr = remote->url_nr;
> diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
> index d2a2cdd453..434c1f828a 100755
> --- a/t/t5505-remote.sh
> +++ b/t/t5505-remote.sh
> @@ -1194,6 +1194,17 @@ test_expect_success 'remote set-url --delete baz' '
>  	cmp expect actual
>  '
>  
> +test_expect_success 'remote set-url --save-to-push bbb' '
> +	git remote set-url --save-to-push someremote bbb &&
> +	echo bbb >expect &&
> +	echo "YYY" >>expect &&
> +	echo ccc >>expect &&
> +	git config --get-all remote.someremote.url >actual &&
> +	echo "YYY" >>actual &&
> +	git config --get-all remote.someremote.pushurl >>actual &&
> +	cmp expect actual
> +'
> +
>  test_expect_success 'extra args: setup' '
>  	# add a dummy origin so that this does not trigger failure
>  	git remote add origin .

  reply	other threads:[~2018-11-13  9:46 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-27  8:09 [RFC PATCH] remote: add --fetch option to git remote set-url Denton Liu
2018-10-29  5:57 ` Junio C Hamano
2018-10-30  7:56   ` Denton Liu
2018-10-30 10:11     ` Junio C Hamano
2018-11-09  2:37       ` [RFC PATCH v2] remote: add --save-push " Denton Liu
2018-11-09  3:15         ` Junio C Hamano
2018-11-09  5:20           ` [PATCH v3] remote: add --save-to-push " Denton Liu
2018-11-13  9:46             ` Junio C Hamano [this message]
2018-12-10 14:15             ` [PATCH v4] " Denton Liu

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

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=xmqqy39xux6n.fsf@gitster-ct.c.googlers.com \
    --to=gitster@pobox.com \
    --cc=anmolmago@gmail.com \
    --cc=briankyho@gmail.com \
    --cc=david.lu97@outlook.com \
    --cc=git@vger.kernel.org \
    --cc=liu.denton@gmail.com \
    --cc=shirui.wang@hotmail.com \
    /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.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

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 read-only IMAP folder(s) and NNTP newsgroup(s).