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

[PATCH v7 10/11] tag.c: implement '--format' option

From
Karthik Nayak <karthik.188@gmail.com>
Date
Jul 30, 2015, 15:35 UTC
Message-ID
<1438270552-10333-10-git-send-email-Karthik.188@gmail.com>
In-Reply-To
<1438270552-10333-1-git-send-email-Karthik.188@gmail.com>
From: Karthik Nayak <karthik.188@gmail.com>

Implement the '--format' option provided by 'ref-filter'. This lets the user list tags as per desired format similar to the implementation in 'git for-each-ref'.

Add tests and documentation for the same.
Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Matthieu Moy <matthieu.moy@grenoble-inp.fr>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
 Documentation/git-tag.txt | 15 ++++++++++++++-
 builtin/tag.c             | 11 +++++++----
 t/t7004-tag.sh            | 16 ++++++++++++++++
 3 files changed, 37 insertions(+), 5 deletions(-)
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 3ac4a96..75703c5 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -13,7 +13,8 @@ SYNOPSIS
 	<tagname> [<commit> | <object>]
 'git tag' -d <tagname>...
 'git tag' [-n[<num>]] -l [--contains <commit>] [--points-at <object>]
-	[--column[=<options>] | --no-column] [--create-reflog] [--sort=<key>] [<pattern>...]
+	[--column[=<options>] | --no-column] [--create-reflog] [--sort=<key>]
+	[--format=<format>] [<pattern>...]
 'git tag' -v <tagname>...
 
 DESCRIPTION
@@ -158,6 +159,18 @@ This option is only applicable when listing tags without annotation lines.
 	The object that the new tag will refer to, usually a commit.
 	Defaults to HEAD.
 
+<format>::
+	A string that interpolates `%(fieldname)` from the object
+	pointed at by a ref being shown.  If `fieldname` is prefixed
+	with an asterisk (`*`) and the ref points at a tag object, the
+	value for the field in the object tag refers is used.  When
+	unspecified, defaults to `%(refname:short)`.  It also
+	interpolates `%%` to `%`, and `%xx` where `xx` are hex digits
+	interpolates to character with hex code `xx`; for example
+	`%00` interpolates to `\0` (NUL), `%09` to `\t` (TAB) and
+	`%0a` to `\n` (LF).  The fields are same as those in `git
+	for-each-ref`.
+
 
 CONFIGURATION
 -------------
diff --git a/builtin/tag.c b/builtin/tag.c
index 1e8d1b2..7de49c4 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -30,10 +30,9 @@ static const char * const git_tag_usage[] = {
 
 static unsigned int colopts;
 
-static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting)
+static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, const char *format)
 {
 	struct ref_array array;
-	char *format;
 	int i;
 
 	memset(&array, 0, sizeof(array));
@@ -43,7 +42,7 @@ static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting)
 
 	if (filter->lines)
 		format = "%(padright:16)%(refname:short)";
-	else
+	else if (!format)
 		format = "%(refname:short)";
 
 	verify_ref_format(format);
@@ -327,6 +326,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 	struct strbuf err = STRBUF_INIT;
 	struct ref_filter filter;
 	static struct ref_sorting *sorting = NULL, **sorting_tail = &sorting;
+	const char *format = NULL;
 	struct option options[] = {
 		OPT_CMDMODE('l', "list", &cmdmode, N_("list tag names"), 'l'),
 		{ OPTION_INTEGER, 'n', NULL, &filter.lines, N_("n"),
@@ -359,6 +359,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 			OPTION_CALLBACK, 0, "points-at", &filter.points_at, N_("object"),
 			N_("print only tags of the object"), 0, parse_opt_object_name
 		},
+		OPT_STRING(  0 , "format", &format, N_("format"), N_("format to use for the output")),
 		OPT_END()
 	};
 
@@ -398,8 +399,10 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
 			copts.padding = 2;
 			run_column_filter(colopts, &copts);
 		}
+		if (format && (filter.lines != -1))
+			die(_("--format and -n are incompatible"));
 		filter.name_patterns = argv;
-		ret = list_tags(&filter, sorting);
+		ret = list_tags(&filter, sorting, format);
 		if (column_active(colopts))
 			stop_column_filter();
 		return ret;
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index 1f066aa..1809011 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1519,4 +1519,20 @@ EOF"
 	test_cmp expect actual
 '
 
+test_expect_success '--format cannot be used with -n' '
+	test_must_fail git tag -l -n4 --format="%(refname)"
+'
+
+test_expect_success '--format should list tags as per format given' '
+	cat >expect <<-\EOF &&
+	refname : refs/tags/foo1.10
+	refname : refs/tags/foo1.3
+	refname : refs/tags/foo1.6
+	refname : refs/tags/foo1.6-rc1
+	refname : refs/tags/foo1.6-rc2
+	EOF
+	git tag -l --format="refname : %(refname)" "foo*" >actual &&
+	test_cmp expect actual
+'
+
 test_done
-- 
2.4.6
Previous: Karthik NayakNext: Karthik Nayak
Message 41 of 42 in “port tag.c to use ref-filter APIs”
  1. 0/10 port tag.c to use ref-filter APIsKarthik Nayak, Jul 28, 2015
  2. 01/10 ref-filter: introduce 'ref_formatting_state'Karthik Nayak, Jul 28, 2015
  3. 02/10 ref-filter: add option to pad atoms to the rightKarthik Nayak, Jul 28, 2015
  4. Eric SunshineJul 29, 2015
  5. Karthik NayakJul 30, 2015
  6. 03/10 ref-filter: add option to filter only tagsKarthik Nayak, Jul 28, 2015
  7. 04/10 ref-filter: support printing N lines from tag annotationKarthik Nayak, Jul 28, 2015
  8. 05/10 ref-filter: add support to sort by versionKarthik Nayak, Jul 28, 2015
  9. Eric SunshineJul 29, 2015
  10. Karthik NayakJul 30, 2015
  11. 06/10 ref-filter: add option to match literal patternKarthik Nayak, Jul 28, 2015
  12. 07/10 tag.c: use 'ref-filter' data structuresKarthik Nayak, Jul 28, 2015
  13. 08/10 tag.c: use 'ref-filter' APIsKarthik Nayak, Jul 28, 2015
  14. 09/10 tag.c: implement '--format' optionKarthik Nayak, Jul 28, 2015
  15. 10/10 tag.c: implement '--merged' and '--no-merged' optionsKarthik Nayak, Jul 28, 2015
  16. Matthieu MoyJul 28, 2015
  17. Karthik NayakJul 29, 2015
  18. Matthieu MoyJul 29, 2015
  19. Karthik NayakJul 29, 2015
  20. Matthieu MoyJul 29, 2015
  21. 01/10 ref-filter: introduce 'ref_formatting_state'Eric Sunshine, Jul 29, 2015
  22. Junio C HamanoJul 29, 2015
  23. Junio C HamanoJul 29, 2015
  24. Karthik NayakJul 30, 2015
  25. Matthieu MoyJul 30, 2015
  26. Matthieu MoyJul 29, 2015
  27. Karthik NayakJul 30, 2015
  28. Eric SunshineJul 29, 2015
  29. Junio C HamanoJul 29, 2015
  30. Matthieu MoyJul 30, 2015
  31. Karthik NayakJul 30, 2015
  32. 01/11 ref-filter: introduce 'ref_formatting_state'Karthik Nayak, Jul 30, 2015
  33. 02/11 ref-filter: make `color` use `ref_formatting_state`Karthik Nayak, Jul 30, 2015
  34. 03/11 ref-filter: add option to pad atoms to the rightKarthik Nayak, Jul 30, 2015
  35. 04/11 ref-filter: add option to filter only tagsKarthik Nayak, Jul 30, 2015
  36. 05/11 ref-filter: support printing N lines from tag annotationKarthik Nayak, Jul 30, 2015
  37. 06/11 ref-filter: add support to sort by versionKarthik Nayak, Jul 30, 2015
  38. 07/11 ref-filter: add option to match literal patternKarthik Nayak, Jul 30, 2015
  39. 08/11 tag.c: use 'ref-filter' data structuresKarthik Nayak, Jul 30, 2015
  40. 09/11 tag.c: use 'ref-filter' APIsKarthik Nayak, Jul 30, 2015
  41. 10/11 tag.c: implement '--format' optionKarthik Nayak, Jul 30, 2015
  42. 11/11 tag.c: implement '--merged' and '--no-merged' optionsKarthik Nayak, Jul 30, 2015

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.