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

[PATCH v8 12/19] ref-filter: make remote_ref_atom_parser() use refname_atom_parser_internal()

From
Karthik Nayak <karthik.188@gmail.com>
Date
Dec 7, 2016, 15:36 UTC
Message-ID
<20161207153627.1468-13-Karthik.188@gmail.com>
In-Reply-To
<20161207153627.1468-1-Karthik.188@gmail.com>
From: Karthik Nayak <karthik.188@gmail.com>

Use the recently introduced refname_atom_parser_internal() within remote_ref_atom_parser(), this provides a common base for all the ref printing atoms, allowing %(upstream) and %(push) to also use the ':strip' option.

The atoms '%(push)' and '%(upstream)' will retain the ':track' and ':trackshort' atom modifiers to themselves as they have no meaning in context to the '%(refname)' and '%(symref)' atoms.

Update the documentation and tests to reflect the same.
Signed-off-by: Karthik Nayak <Karthik.188@gmail.com>
---
 Documentation/git-for-each-ref.txt | 31 ++++++++++++++++---------------
 ref-filter.c                       | 26 +++++++++++++++-----------
 t/t6300-for-each-ref.sh            |  2 ++
 3 files changed, 33 insertions(+), 26 deletions(-)
diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt
index 8224f37..6a1e747 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -113,23 +113,24 @@ objectname::
 
 upstream::
 	The name of a local ref which can be considered ``upstream''
-	from the displayed ref. Respects `:short` in the same way as
-	`refname` above.  Additionally respects `:track` to show
-	"[ahead N, behind M]" and `:trackshort` to show the terse
-	version: ">" (ahead), "<" (behind), "<>" (ahead and behind),
-	or "=" (in sync). `:track` also prints "[gone]" whenever
-	unknown upstream ref is encountered. Append `:track,nobracket`
-	to show tracking information without brackets (i.e "ahead N,
-	behind M").  Has no effect if the ref does not have tracking
-	information associated with it.  All the options apart from
-	`nobracket` are mutually exclusive, but if used together the
-	last option is selected.
+	from the displayed ref. Respects `:short` and `:strip` in the
+	same way as `refname` above.  Additionally respects `:track`
+	to show "[ahead N, behind M]" and `:trackshort` to show the
+	terse version: ">" (ahead), "<" (behind), "<>" (ahead and
+	behind), or "=" (in sync). `:track` also prints "[gone]"
+	whenever unknown upstream ref is encountered. Append
+	`:track,nobracket` to show tracking information without
+	brackets (i.e "ahead N, behind M").  Has no effect if the ref
+	does not have tracking information associated with it.  All
+	the options apart from `nobracket` are mutually exclusive, but
+	if used together the last option is selected.
 
 push::
-	The name of a local ref which represents the `@{push}` location
-	for the displayed ref. Respects `:short`, `:track`, and
-	`:trackshort` options as `upstream` does. Produces an empty
-	string if no `@{push}` ref is configured.
+	The name of a local ref which represents the `@{push}`
+	location for the displayed ref. Respects `:short`, `:strip`,
+	`:track`, and `:trackshort` options as `upstream`
+	does. Produces an empty string if no `@{push}` ref is
+	configured.
 
 HEAD::
 	'*' if HEAD matches current ref (the checked out branch), ' '
diff --git a/ref-filter.c b/ref-filter.c
index 9f5522d..be535a6 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -53,7 +53,8 @@ static struct used_atom {
 		char color[COLOR_MAXLEN];
 		struct align align;
 		struct {
-			enum { RR_NORMAL, RR_SHORTEN, RR_TRACK, RR_TRACKSHORT } option;
+			enum { RR_REF, RR_TRACK, RR_TRACKSHORT } option;
+			struct refname_atom refname;
 			unsigned int nobracket: 1;
 		} remote_ref;
 		struct {
@@ -103,7 +104,9 @@ static void remote_ref_atom_parser(struct used_atom *atom, const char *arg)
 	int i;
 
 	if (!arg) {
-		atom->u.remote_ref.option = RR_NORMAL;
+		atom->u.remote_ref.option = RR_REF;
+		refname_atom_parser_internal(&atom->u.remote_ref.refname,
+					     arg, atom->name);
 		return;
 	}
 
@@ -113,16 +116,17 @@ static void remote_ref_atom_parser(struct used_atom *atom, const char *arg)
 	for (i = 0; i < params.nr; i++) {
 		const char *s = params.items[i].string;
 
-		if (!strcmp(s, "short"))
-			atom->u.remote_ref.option = RR_SHORTEN;
-		else if (!strcmp(s, "track"))
+		if (!strcmp(s, "track"))
 			atom->u.remote_ref.option = RR_TRACK;
 		else if (!strcmp(s, "trackshort"))
 			atom->u.remote_ref.option = RR_TRACKSHORT;
 		else if (!strcmp(s, "nobracket"))
 			atom->u.remote_ref.nobracket = 1;
-		else
-			die(_("unrecognized format: %%(%s)"), atom->name);
+		else {
+			atom->u.remote_ref.option = RR_REF;
+			refname_atom_parser_internal(&atom->u.remote_ref.refname,
+						     arg, atom->name);
+		}
 	}
 
 	string_list_clear(&params, 0);
@@ -1099,8 +1103,8 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
 				    struct branch *branch, const char **s)
 {
 	int num_ours, num_theirs;
-	if (atom->u.remote_ref.option == RR_SHORTEN)
-		*s = shorten_unambiguous_ref(refname, warn_ambiguous_refs);
+	if (atom->u.remote_ref.option == RR_REF)
+		*s = show_ref(&atom->u.remote_ref.refname, refname);
 	else if (atom->u.remote_ref.option == RR_TRACK) {
 		if (stat_tracking_info(branch, &num_ours,
 				       &num_theirs, NULL)) {
@@ -1132,8 +1136,8 @@ static void fill_remote_ref_details(struct used_atom *atom, const char *refname,
 			*s = ">";
 		else
 			*s = "<>";
-	} else /* RR_NORMAL */
-		*s = refname;
+	} else
+		die("BUG: unhandled RR_* enum");
 }
 
 char *get_head_description(void)
diff --git a/t/t6300-for-each-ref.sh b/t/t6300-for-each-ref.sh
index b32ab79..2facfaf 100755
--- a/t/t6300-for-each-ref.sh
+++ b/t/t6300-for-each-ref.sh
@@ -55,8 +55,10 @@ test_atom head refname:strip=1 heads/master
 test_atom head refname:strip=2 master
 test_atom head upstream refs/remotes/origin/master
 test_atom head upstream:short origin/master
+test_atom head upstream:strip=2 origin/master
 test_atom head push refs/remotes/myfork/master
 test_atom head push:short myfork/master
+test_atom head push:strip=1 remotes/myfork/master
 test_atom head objecttype commit
 test_atom head objectsize 171
 test_atom head objectname $(git rev-parse refs/heads/master)
-- 
2.10.2
Previous: Karthik NayakNext: Karthik Nayak
Message 20 of 32 in “port branch.c to use ref-filter's printing options”
  1. 00/19 port branch.c to use ref-filter's printing optionsKarthik Nayak, Dec 7, 2016
  2. 02/19 ref-filter: include reference to 'used_atom' within 'atom_value'Karthik Nayak, Dec 7, 2016
  3. 15/19 ref-filter: add an 'rstrip=<N>' option to atoms which deal with refnamesKarthik Nayak, Dec 7, 2016
  4. 08/19 ref-filter: add support for %(upstream:track,nobracket)Karthik Nayak, Dec 7, 2016
  5. 09/19 ref-filter: make "%(symref)" atom work with the ':short' modifierKarthik Nayak, Dec 7, 2016
  6. 10/19 ref-filter: introduce refname_atom_parser_internal()Karthik Nayak, Dec 7, 2016
  7. 16/19 ref-filter: allow porcelain to translate messages in the outputKarthik Nayak, Dec 7, 2016
  8. 19/19 branch: implement '--format' optionKarthik Nayak, Dec 7, 2016
  9. 18/19 branch: use ref-filter printing APIsKarthik Nayak, Dec 7, 2016
  10. Jeff KingDec 9, 2016
  11. Karthik NayakDec 12, 2016
  12. Jeff KingDec 12, 2016
  13. Karthik NayakDec 12, 2016
  14. Jeff KingDec 12, 2016
  15. Karthik NayakDec 12, 2016
  16. 14/19 ref-filter: modify the 'lstrip=<N>' option to work with negative '<N>'Karthik Nayak, Dec 7, 2016
  17. 13/19 ref-filter: rename the 'strip' option to 'lstrip'Karthik Nayak, Dec 7, 2016
  18. 17/19 branch, tag: use porcelain outputKarthik Nayak, Dec 7, 2016
  19. 11/19 ref-filter: introduce refname_atom_parser()Karthik Nayak, Dec 7, 2016
  20. 12/19 ref-filter: make remote_ref_atom_parser() use refname_atom_parser_internal()Karthik Nayak, Dec 7, 2016
  21. 07/19 ref-filter: make %(upstream:track) prints "[gone]" for invalid upstreamsKarthik Nayak, Dec 7, 2016
  22. 04/19 ref-filter: modify "%(objectname:short)" to take lengthKarthik Nayak, Dec 7, 2016
  23. 05/19 ref-filter: move get_head_description() from branch.cKarthik Nayak, Dec 7, 2016
  24. 06/19 ref-filter: introduce format_ref_array_item()Karthik Nayak, Dec 7, 2016
  25. 03/19 ref-filter: implement %(if:equals=<string>) and %(if:notequals=<string>)Karthik Nayak, Dec 7, 2016
  26. 01/19 ref-filter: implement %(if), %(then), and %(else) atomsKarthik Nayak, Dec 7, 2016
  27. Jacob KellerDec 8, 2016
  28. Junio C HamanoDec 8, 2016
  29. Jacob KellerDec 9, 2016
  30. Karthik NayakDec 12, 2016
  31. Junio C HamanoDec 8, 2016
  32. Karthik NayakDec 12, 2016

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.