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

Re: [PATCH] git-tag: Fix -l option to use better shell style globs.

From
CRCarlos Rica <jasampler@gmail.com>
Date
Sep 1, 2007, 14:33 UTC
Message-ID
<1b46aba20709010733x45960f00g8732f6a1af363768@mail.gmail.com>
In-Reply-To
<7v8x7qvrka.fsf@gitster.siamese.dyndns.org>
2007/9/1, Junio C Hamano <gitster@pobox.com>:
Show 10 quoted lines
> I think it is conceptually simpler on the show_reference side to
> allow (filter.pattern == NULL) and say:
>
>         if (!filter->pattern || !fnmatch(filter->pattern, refname, 0)) {
>                 ... show that ref ...
>         }
>
> It is not such a big deal now you do not do newpattern
> allocation anymore, so I'll apply the patch as is.
>

You are right. I changed the patch also to reflect this. I cannot send a reply using my email client now, so I send it attached to this response to avoid gmail breaks in long lines.

From d10170c5a2c3cf1fc6ad270e9a2c82ff29a98871 Mon Sep 17 00:00:00 2001
From: Carlos Rica <jasampler@gmail.com>
Date: Sat, 1 Sep 2007 06:58:40 +0200
Subject: [PATCH] git-tag: Fix -l option to use better shell style globs.

This patch removes the behaviour of "git tag -l foo", currently listing every tag name having "foo" as a substring. The same thing now could be achieved doing "git tag -l '*foo*'".

The "feature" was added recently when git-tag.sh got the -n option for showing tag annotations, because that commit also replaced the old "grep pattern" behaviour with a more preferable "shell pattern" behaviour (although slightly modified as you can see). Thus, the following builtin-tag.c implemented it in order to ensure that tests were passing unchanged with both programs.

Since common "shell patterns" match names with a given substring _only_ when * is inserted before and after (as in "*substr*"), and the "plain" behaviour cannot be achieved easily with the current implementation, this is mostly the right thing to do, in order to make it more flexible and consistent.

Tests for "git tag" were also changed to reflect this.
Signed-off-by: Carlos Rica <jasampler@gmail.com>
---
 builtin-tag.c  |   14 ++------------
 t/t7004-tag.sh |   20 +++++++++-----------
 2 files changed, 11 insertions(+), 23 deletions(-)
diff --git a/builtin-tag.c b/builtin-tag.c
index d6d38ad..0e01b98 100644
--- a/builtin-tag.c
+++ b/builtin-tag.c
@@ -75,7 +75,7 @@ static int show_reference(const char *refname, const unsigned char *sha1,
 {
 	struct tag_filter *filter = cb_data;
 
-	if (!fnmatch(filter->pattern, refname, 0)) {
+	if (!filter->pattern || !fnmatch(filter->pattern, refname, 0)) {
 		int i;
 		unsigned long size;
 		enum object_type type;
@@ -123,22 +123,12 @@ static int show_reference(const char *refname, const unsigned char *sha1,
 static int list_tags(const char *pattern, int lines)
 {
 	struct tag_filter filter;
-	char *newpattern;
 
-	if (pattern == NULL)
-		pattern = "";
-
-	/* prepend/append * to the shell pattern: */
-	newpattern = xmalloc(strlen(pattern) + 3);
-	sprintf(newpattern, "*%s*", pattern);
-
-	filter.pattern = newpattern;
+	filter.pattern = pattern;
 	filter.lines = lines;
 
 	for_each_tag_ref(show_reference, (void *) &filter);
 
-	free(newpattern);
-
 	return 0;
 }
 
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index c4fa446..606d4f2 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -185,18 +185,17 @@ cba
 EOF
 test_expect_success \
 	'listing tags with substring as pattern must print those matching' '
-	git-tag -l a > actual &&
+	git-tag -l "*a*" > actual &&
 	git diff expect actual
 '
 
 cat >expect <<EOF
 v0.2.1
 v1.0.1
-v1.1.3
 EOF
 test_expect_success \
-	'listing tags with substring as pattern must print those matching' '
-	git-tag -l .1 > actual &&
+	'listing tags with a suffix as pattern must print those matching' '
+	git-tag -l "*.1" > actual &&
 	git diff expect actual
 '
 
@@ -205,37 +204,36 @@ t210
 t211
 EOF
 test_expect_success \
-	'listing tags with substring as pattern must print those matching' '
-	git-tag -l t21 > actual &&
+	'listing tags with a prefix as pattern must print those matching' '
+	git-tag -l "t21*" > actual &&
 	git diff expect actual
 '
 
 cat >expect <<EOF
 a1
-aa1
 EOF
 test_expect_success \
-	'listing tags using a name as pattern must print those matching' '
+	'listing tags using a name as pattern must print that one matching' '
 	git-tag -l a1 > actual &&
 	git diff expect actual
 '
 
 cat >expect <<EOF
 v1.0
-v1.0.1
 EOF
 test_expect_success \
-	'listing tags using a name as pattern must print those matching' '
+	'listing tags using a name as pattern must print that one matching' '
 	git-tag -l v1.0 > actual &&
 	git diff expect actual
 '
 
 cat >expect <<EOF
+v1.0.1
 v1.1.3
 EOF
 test_expect_success \
 	'listing tags with ? in the pattern should print those matching' '
-	git-tag -l "1.1?" > actual &&
+	git-tag -l "v1.?.?" > actual &&
 	git diff expect actual
 '
 
-- 
1.5.0
Previous: Junio C HamanoNext: Carlos Rica
Message 5 of 6 in “git-tag: Fix -l option to use better shell style globs.”
  1. git-tag: Fix -l option to use better shell style globs.Carlos Rica, Sep 1, 2007
  2. Shawn O. PearceSep 1, 2007
  3. Junio C HamanoSep 1, 2007
  4. Junio C HamanoSep 1, 2007
  5. Carlos RicaSep 1, 2007
  6. Carlos RicaSep 1, 2007

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.