git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/3] for-each-ref: let upstream/push optionally report the remote name

From
Junio C Hamano <gitster@pobox.com>
Date
Oct 4, 2017, 07:14 UTC
Message-ID
<xmqq376zcrls.fsf@gitster.mtv.corp.google.com>
In-Reply-To
<0e03bf1e50e24a52f57be0f51d19f4657c68d2fa.1506952571.git.johannes.schindelin@gmx.de>
Johannes Schindelin <johannes.schindelin@gmx.de> writes:
> This patch offers the new suffix :remote for the upstream and for the
> push atoms, allowing to show exactly that.

Has the design changed since this description and examples were written? The documentation talks about ":remote-name". I suspect calling this ":remote" might be less hassle, as we do not have to vet the current vocabulary to see if "remote-name" is the right way to name a multi-word modifer (as opposed to "remotename", or "remoteName", or "remote_name", or...).

Show 5 quoted lines
> 	...
>
> 	$ git for-each-ref \
> 		--format='%(upstream) %(upstream:remote) %(push:remote)' \
> 		refs/heads/master
Show 5 quoted lines
> diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
> index 66b4e0a4050..776368ee531 100644
> --- a/Documentation/git-for-each-ref.txt
> +++ b/Documentation/git-for-each-ref.txt
> @@ -140,17 +140,19 @@ upstream::

Aside from "':remote-name'? Do we really want that?" issue I already mentioned, the changes to this file look sensible.

Show 33 quoted lines
> diff --git a/ref-filter.c b/ref-filter.c
> index bc591f4f3de..58d53c09390 100644
> --- a/ref-filter.c
> +++ b/ref-filter.c
> @@ -76,7 +76,9 @@ static struct used_atom {
>  		char color[COLOR_MAXLEN];
>  		struct align align;
>  		struct {
> -			enum { RR_REF, RR_TRACK, RR_TRACKSHORT } option;
> +			enum {
> +				RR_REF, RR_TRACK, RR_TRACKSHORT, RR_REMOTE_NAME
> +			} option;
>  			struct refname_atom refname;
>  			unsigned int nobracket : 1;
>  		} remote_ref;
> @@ -156,6 +158,8 @@ static void remote_ref_atom_parser(const struct ref_format *format, struct used_
>  			atom->u.remote_ref.option = RR_TRACKSHORT;
>  		else if (!strcmp(s, "nobracket"))
>  			atom->u.remote_ref.nobracket = 1;
> +		else if (!strcmp(s, "remote-name"))
> +			atom->u.remote_ref.option = RR_REMOTE_NAME;
>  		else {
>  			atom->u.remote_ref.option = RR_REF;
>  			refname_atom_parser_internal(&atom->u.remote_ref.refname,
> @@ -1247,6 +1251,15 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
>  			*s = ">";
>  		else
>  			*s = "<>";
> +	} else if (atom->u.remote_ref.option == RR_REMOTE_NAME) {
> +		int explicit;
> +		const char *remote = starts_with(atom->name, "push") ?
> +			pushremote_for_branch(branch, &explicit) :
> +			remote_for_branch(branch, &explicit);

I think "int explicit = 0;" is needed, as pushremote_for_branch() does seem to expect that the "explicit" return parameter is initialized by the caller.

> +		if (explicit)
> +			*s = xstrdup(remote);
> +		else
> +			*s = "";

This one is debatable. For the user of "push" who wants to learn where the branch is pushed to, the choice this patch makes is not useful (i.e. such a user does not care where the definition comes from; s/he only wants to know where the push goes). For the user of "git config" who wants to know how pushremote is configured, and does not want to accept the fallback to remote, the behaviour of this patch is useful. I have a mild suspicion that majority of users who would want to use this feature would fall into the former category, i.e. users of "push", rather than the latter, i.e. debuggers of their config files, and if that is true, we can drop the whole "explicit" business to simplify the code and get a more useful behaviour at the same time ;-)

Show 8 quoted lines
> @@ -1364,9 +1377,13 @@ static void populate_value(struct ref_array_item *ref)
>  				continue;
>  			branch = branch_get(branch_name);
>  
> -			refname = branch_get_push(branch, NULL);
> -			if (!refname)
> -				continue;
> +			if (starts_with(name, "push:remote-"))
I am not sure what is going on here.  

Are we expecting "push:remote-name" here, or anticipating "push:remote-bar" can also be given or what?

Show 9 quoted lines
> +				refname = NULL;
> +			else {
> +				refname = branch_get_push(branch, NULL);
> +				if (!refname)
> +					continue;
> +			}
>  			fill_remote_ref_details(atom, refname, branch, &v->s);
>  			continue;
>  		} else if (starts_with(name, "color:")) {
Previous: Johannes SchindelinNext: Junio C Hamano
Message 3 of 32 in “for-each-ref: add :remote-ref and :remote-name specifiers”
  1. 0/3 for-each-ref: add :remote-ref and :remote-name specifiersJohannes Schindelin, Oct 2, 2017
  2. 1/3 for-each-ref: let upstream/push optionally report the remote nameJohannes Schindelin, Oct 2, 2017
  3. Junio C HamanoOct 4, 2017
  4. Junio C HamanoOct 4, 2017
  5. Johannes SchindelinOct 5, 2017
  6. 2/3 for-each-ref: let upstream/push optionally report merge name.Johannes Schindelin, Oct 2, 2017
  7. Junio C HamanoOct 4, 2017
  8. Junio C HamanoOct 4, 2017
  9. Junio C HamanoOct 5, 2017
  10. 3/3 for-each-ref: test :remote-name and :remote-refJohannes Schindelin, Oct 2, 2017
  11. Junio C HamanoOct 5, 2017
  12. 0/3 for-each-ref: add :remoteref and :remotename specifiersJohannes Schindelin, Oct 5, 2017
  13. 1/3 for-each-ref: let upstream/push optionally report the remote nameJohannes Schindelin, Oct 5, 2017
  14. Junio C HamanoOct 10, 2017
  15. Junio C HamanoOct 11, 2017
  16. 2/3 for-each-ref: let upstream/push optionally remote ref nameJohannes Schindelin, Oct 5, 2017
  17. Junio C HamanoOct 6, 2017
  18. Junio C HamanoOct 11, 2017
  19. Johannes SchindelinOct 12, 2017
  20. Junio C HamanoOct 13, 2017
  21. Johannes SchindelinOct 15, 2017
  22. Kevin DaudtOct 13, 2017
  23. Junio C HamanoOct 14, 2017
  24. Johannes SchindelinOct 15, 2017
  25. Junio C HamanoOct 16, 2017
  26. Johannes SchindelinOct 16, 2017
  27. 3/3 for-each-ref: test :remotename and :remoterefJohannes Schindelin, Oct 5, 2017
  28. 0/3 for-each-ref: add :remoteref and :remotename specifiersJohannes Schindelin, Nov 7, 2017
  29. 1/3 for-each-ref: let upstream/push optionally report the remote nameJohannes Schindelin, Nov 7, 2017
  30. 2/3 for-each-ref: let upstream/push report the remote ref nameJohannes Schindelin, Nov 7, 2017
  31. 3/3 for-each-ref: test :remotename and :remoterefJohannes Schindelin, Nov 7, 2017
  32. Junio C HamanoNov 8, 2017

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.