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

[PATCH v2 09/10] tag.c: implement '--format' option

From
Karthik Nayak <karthik.188@gmail.com>
Date
Jul 9, 2015, 10:59 UTC
Message-ID
<559E5422.4070802@gmail.com>
In-Reply-To
<1436437671-25600-1-git-send-email-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 | 16 +++++++++++++++-
  builtin/tag.c             | 11 +++++++----
  t/t7004-tag.sh            | 16 ++++++++++++++++
  3 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 02fb363..16e396c 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] [--sort=<key>] [<pattern>...]
+	[--column[=<options>] | --no-column] [--sort=<key>] [--format=<format>]
+	[<pattern>...]
  'git tag' -v <tagname>...

  DESCRIPTION
@@ -155,6 +156,19 @@ 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
+	`%(objectname) SPC %(objecttype) TAB %(refname)`.
+	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 36f8019..601b293 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 = "%(refname:shortalign=16)";
-	else
+	else if (!format)
  		format = "%(refname:short)";

  	verify_ref_format(format);
@@ -325,6 +324,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"),
@@ -356,6 +356,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()
  	};

@@ -395,8 +396,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 51a233f..e8cebb6 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1507,4 +1507,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 &&
+	foo1.10
+	foo1.3
+	foo1.6
+	foo1.6-rc1
+	foo1.6-rc2
+	EOF
+	git tag -l --format="%(refname)" "foo*" >actual &&
+	test_cmp expect actual
+'
+
  test_done
-- 
2.4.5
Previous: Karthik NayakNext: Karthik Nayak
Message 37 of 48 in “Port tag.c to use ref-filter APIs”
  1. 00/10 Port tag.c to use ref-filter APIsKarthik Nayak, Jul 9, 2015
  2. 01/10 ref-filter: add %(refname:shortalign=X) optionKarthik Nayak, Jul 9, 2015
  3. 02/10 ref-filter: add option to filter only tagsKarthik Nayak, Jul 9, 2015
  4. 03/10 ref-filter: support printing N lines from tag annotationKarthik Nayak, Jul 9, 2015
  5. Matthieu MoyJul 9, 2015
  6. Karthik NayakJul 10, 2015
  7. 04/10 ref-filter: add support to sort by versionKarthik Nayak, Jul 9, 2015
  8. Matthieu MoyJul 9, 2015
  9. Karthik NayakJul 10, 2015
  10. Karthik NayakJul 10, 2015
  11. Matthieu MoyJul 10, 2015
  12. Karthik NayakJul 11, 2015
  13. 05/10 ref-filter: add option to match literal patternKarthik Nayak, Jul 9, 2015
  14. Matthieu MoyJul 9, 2015
  15. Karthik NayakJul 10, 2015
  16. Junio C HamanoJul 10, 2015
  17. Karthik NayakJul 11, 2015
  18. Matthieu MoyJul 11, 2015
  19. Karthik NayakJul 11, 2015
  20. 06/10 Documentation/tag: remove double occurance of "<pattern>"Karthik Nayak, Jul 9, 2015
  21. Christian CouderJul 9, 2015
  22. Karthik NayakJul 9, 2015
  23. Junio C HamanoJul 10, 2015
  24. Karthik NayakJul 12, 2015
  25. 07/10 tag.c: use 'ref-filter' data structuresKarthik Nayak, Jul 9, 2015
  26. 08/10 tag.c: use 'ref-filter' APIsKarthik Nayak, Jul 9, 2015
  27. Matthieu MoyJul 9, 2015
  28. Karthik NayakJul 9, 2015
  29. Matthieu MoyJul 9, 2015
  30. Karthik NayakJul 10, 2015
  31. Matthieu MoyJul 9, 2015
  32. 08/10 tag.c: use 'ref-filter' APIsKarthik Nayak, Jul 9, 2015
  33. Duy NguyenJul 12, 2015
  34. Karthik NayakJul 12, 2015
  35. Duy NguyenJul 13, 2015
  36. Karthik NayakJul 13, 2015
  37. 09/10 tag.c: implement '--format' optionKarthik Nayak, Jul 9, 2015
  38. 10/10 tag.c: implement '--merged' and '--no-merged' optionsKarthik Nayak, Jul 9, 2015
  39. Matthieu MoyJul 9, 2015
  40. Karthik NayakJul 11, 2015
  41. Matthieu MoyJul 11, 2015
  42. Junio C HamanoJul 10, 2015
  43. Karthik NayakJul 11, 2015
  44. Duy NguyenJul 12, 2015
  45. Duy NguyenJul 12, 2015
  46. Karthik NayakJul 12, 2015
  47. Duy NguyenJul 13, 2015
  48. Karthik NayakJul 13, 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.