git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Karthik Nayak <karthik.188@gmail.com>
To: git@vger.kernel.org
Cc: christian.couder@gmail.com, Matthieu.Moy@grenoble-inp.fr
Subject: [PATCH v2 09/10] tag.c: implement '--format' option
Date: Thu, 9 Jul 2015 16:29:46 +0530	[thread overview]
Message-ID: <559E5422.4070802@gmail.com> (raw)
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

  parent reply	other threads:[~2015-07-09 11:00 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-09 10:27 [PATCH v2 00/10] Port tag.c to use ref-filter APIs Karthik Nayak
2015-07-09 10:27 ` [PATCH v2 01/10] ref-filter: add %(refname:shortalign=X) option Karthik Nayak
2015-07-09 10:27   ` [PATCH v2 02/10] ref-filter: add option to filter only tags Karthik Nayak
2015-07-09 10:27   ` [PATCH v2 03/10] ref-filter: support printing N lines from tag annotation Karthik Nayak
2015-07-09 13:07     ` Matthieu Moy
2015-07-10 10:38       ` Karthik Nayak
2015-07-09 10:27   ` [PATCH v2 04/10] ref-filter: add support to sort by version Karthik Nayak
2015-07-09 13:29     ` Matthieu Moy
2015-07-10 10:52       ` Karthik Nayak
2015-07-10 11:01         ` Karthik Nayak
2015-07-10 12:18           ` Matthieu Moy
2015-07-11  5:54             ` Karthik Nayak
2015-07-09 10:27   ` [PATCH v2 05/10] ref-filter: add option to match literal pattern Karthik Nayak
2015-07-09 13:32     ` Matthieu Moy
2015-07-10 11:11       ` Karthik Nayak
2015-07-10 16:43     ` Junio C Hamano
2015-07-11  5:55       ` Karthik Nayak
2015-07-11  9:26         ` Matthieu Moy
2015-07-11 12:54           ` Karthik Nayak
2015-07-09 10:27   ` [PATCH v2 06/10] Documentation/tag: remove double occurance of "<pattern>" Karthik Nayak
2015-07-09 12:19     ` Christian Couder
2015-07-09 12:56       ` Karthik Nayak
2015-07-10 16:44       ` Junio C Hamano
2015-07-12 12:39         ` Karthik Nayak
2015-07-09 10:27   ` [PATCH v2 07/10] tag.c: use 'ref-filter' data structures Karthik Nayak
2015-07-09 10:55   ` [PATCH v2 08/10] tag.c: use 'ref-filter' APIs Karthik Nayak
2015-07-09 12:48     ` Matthieu Moy
2015-07-09 12:55       ` Karthik Nayak
2015-07-09 13:43         ` Matthieu Moy
2015-07-10  9:41           ` Karthik Nayak
2015-07-09 13:41     ` Matthieu Moy
2015-07-09 10:58   ` Karthik Nayak
2015-07-12  9:45     ` Duy Nguyen
2015-07-12 19:36       ` Karthik Nayak
2015-07-13 10:46         ` Duy Nguyen
2015-07-13 20:34           ` Karthik Nayak
2015-07-09 10:59   ` Karthik Nayak [this message]
2015-07-09 11:00   ` [PATCH v2 10/10] tag.c: implement '--merged' and '--no-merged' options Karthik Nayak
2015-07-09 12:58   ` [PATCH v2 01/10] ref-filter: add %(refname:shortalign=X) option Matthieu Moy
2015-07-11  6:07     ` Karthik Nayak
2015-07-11 10:20       ` Matthieu Moy
2015-07-10 16:20   ` Junio C Hamano
2015-07-11 12:05     ` Karthik Nayak
2015-07-12  1:47       ` Duy Nguyen
2015-07-12  8:59         ` Duy Nguyen
2015-07-12 19:56           ` Karthik Nayak
2015-07-13 10:51             ` Duy Nguyen
2015-07-13 20:36               ` Karthik Nayak

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=559E5422.4070802@gmail.com \
    --to=karthik.188@gmail.com \
    --cc=Matthieu.Moy@grenoble-inp.fr \
    --cc=christian.couder@gmail.com \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).