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

[PATCH v3 0/3] for-each-ref: add :remoteref and :remotename specifiers

From
Johannes Schindelin <johannes.schindelin@gmx.de>
Date
Nov 7, 2017, 16:30 UTC
Message-ID
<cover.1510072200.git.johannes.schindelin@gmx.de>
In-Reply-To
<cover.1507205895.git.johannes.schindelin@gmx.de>
This introduces support for
	git for-each-ref \
		--format="%(merge:remotename),%(merge:remoteref)"
	git for-each-ref \
		--format="%(push:remotename),%(push:remoteref)"

to figure out the remote nickname as well as the name of the corresponding branch on the remote.

Note: the `%(push:remotename)` placeholder is only interpolated by the value
of `branch.<name>.pushRemote`; unlike `git push`, it does not fall back to
`branch.<name>.remote`. Likewise, `%(push:remoteref)` interpolates to the
empty string unless `remote.<nick>.pushRefs` is configured.

This is useful for third-party tools that need to know this type of information for tons of branches.

Changes since v2:
- fixed the commit message of 1/3 to no longer talk about :remote.
- used the push atom in 2/3, made the code look more as suggested by Junio.
- fixed the oneline of 2/3 to use a verb ("report").
- butchered Junio's proposed documentation update for 2/3 to hopefully make
  the description of :remotename and :remoteref a lot clearer.
J Wyman (1):
  for-each-ref: let upstream/push report the remote ref name
Johannes Schindelin (2):
  for-each-ref: let upstream/push optionally report the remote name
  for-each-ref: test :remotename and :remoteref
 Documentation/git-for-each-ref.txt | 23 +++++++++++-------
 ref-filter.c                       | 48 ++++++++++++++++++++++++++++++++------
 remote.c                           | 30 ++++++++++++++++++++++++
 remote.h                           |  2 ++
 t/t6300-for-each-ref.sh            | 32 +++++++++++++++++++++++++
 5 files changed, 120 insertions(+), 15 deletions(-)
base-commit: 7668cbc60578f99a4c048f8f8f38787930b8147b
Published-As: https://github.com/dscho/git/releases/tag/ref-filter-remote-name-v3
Fetch-It-Via: git fetch https://github.com/dscho/git ref-filter-remote-name-v3
Interdiff vs v2:
 diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
 index aff44c064a4..dffa14a7950 100644
 --- a/Documentation/git-for-each-ref.txt
 +++ b/Documentation/git-for-each-ref.txt
 @@ -147,9 +147,12 @@ upstream::
  	encountered. Append `:track,nobracket` to show tracking
  	information without brackets (i.e "ahead N, behind M").
  +
 -Also respects `:remotename` to state the name of the *remote* instead
 -of the ref, and `:remoteref` to state the name of the *reference* as
 -locally known by the remote.
 +For any remote-tracking branch `%(upstream)`, `%(upstream:remotename)`
 +and `%(upstream:remoteref)` refer to the name of the remote and the
 +name of the tracked remote ref, respectively. In other words, the
 +remote-tracking branch can be updated explicitly and individually by
 +using the refspec `%(upstream:remoteref):%(upstream)` to fetch from
 +`%(upstream:remotename)`.
  +
  Has no effect if the ref does not have tracking information associated
  with it.  All the options apart from `nobracket` are mutually exclusive,
 diff --git a/ref-filter.c b/ref-filter.c
 index bf078657d91..3f9161707e6 100644
 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -1289,9 +1289,11 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
  		else
  			*s = "";
  	} else if (atom->u.remote_ref.option == RR_REMOTE_REF) {
 -		int explicit, for_push = starts_with(atom->name, "push");
 -		const char *merge = remote_ref_for_branch(branch, for_push,
 -							  &explicit);
 +		int explicit;
 +		const char *merge;
 +
 +		merge = remote_ref_for_branch(branch, atom->u.remote_ref.push,
 +					      &explicit);
  		if (explicit)
  			*s = xstrdup(merge);
  		else
-- 
2.15.0.windows.1
Previous: Johannes SchindelinNext: Johannes Schindelin
Message 28 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.