From: Tom Grennan <tmgrennan@gmail.com>
To: git@vger.kernel.org
Cc: gitster@pobox.com, peff@peff.net, jasampler@gmail.com, pclouds@gmail.com
Subject: [PATCHv3 3/5] tag --exclude option
Date: Tue, 21 Feb 2012 17:28:48 -0800 [thread overview]
Message-ID: <1329874130-16818-4-git-send-email-tmgrennan@gmail.com> (raw)
In-Reply-To: <1329874130-16818-1-git-send-email-tmgrennan@gmail.com>
In-Reply-To: <20120211190856.GB4903@tgrennan-laptop>
Example,
$ git tag -l --exclude "*-rc?" "v1.7.8*"
v1.7.8
v1.7.8.1
v1.7.8.2
v1.7.8.3
v1.7.8.4
Which is equivalent to,
$ git tag -l "v1.7.8*" | grep -v \\-rc.
v1.7.8
v1.7.8.1
v1.7.8.2
v1.7.8.3
v1.7.8.4
Signed-off-by: Tom Grennan <tmgrennan@gmail.com>
---
Documentation/git-tag.txt | 6 ++++-
builtin/tag.c | 17 ++++++++++---
t/t7004-tag.sh | 56 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 74 insertions(+), 5 deletions(-)
diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 8d32b9a..470bd80 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -13,7 +13,7 @@ SYNOPSIS
<tagname> [<commit> | <object>]
'git tag' -d <tagname>...
'git tag' [-n[<num>]] -l [--contains <commit>] [--points-at <object>]
- [<pattern>...]
+ [--exclude <pattern>] [<pattern>...]
'git tag' -v <tagname>...
DESCRIPTION
@@ -90,6 +90,10 @@ OPTIONS
--points-at <object>::
Only list tags of the given object.
+--exclude <pattern>::
+ Don't list tags matching the given pattern. This has precedence
+ over any other match pattern arguments.
+
-m <msg>::
--message=<msg>::
Use the given tag message (instead of prompting).
diff --git a/builtin/tag.c b/builtin/tag.c
index 4a016d5..547f97d 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -21,7 +21,7 @@ static const char * const git_tag_usage[] = {
"git tag [-a|-s|-u <key-id>] [-f] [-m <msg>|-F <file>] <tagname> [<head>]",
"git tag -d <tagname>...",
"git tag -l [-n[<num>]] [--contains <commit>] [--points-at <object>] "
- "\n\t\t[<pattern>...]",
+ "\n\t\t[--exclude <pattern>] [<pattern>...]",
"git tag -v <tagname>...",
NULL
};
@@ -30,6 +30,7 @@ struct tag_filter {
const char **patterns;
int lines;
struct commit_list *with_commit;
+ struct string_list *exclude;
};
static struct sha1_array points_at;
@@ -138,7 +139,7 @@ static int show_reference(const char *refname, const unsigned char *sha1,
{
struct tag_filter *filter = cb_data;
- if (match_pattern(refname, filter->patterns, NULL, 0)) {
+ if (match_pattern(refname, filter->patterns, filter->exclude, 0)) {
if (filter->with_commit) {
struct commit *commit;
@@ -165,13 +166,15 @@ static int show_reference(const char *refname, const unsigned char *sha1,
}
static int list_tags(const char **patterns, int lines,
- struct commit_list *with_commit)
+ struct commit_list *with_commit,
+ struct string_list *exclude)
{
struct tag_filter filter;
filter.patterns = patterns;
filter.lines = lines;
filter.with_commit = with_commit;
+ filter.exclude = exclude;
for_each_tag_ref(show_reference, (void *) &filter);
@@ -428,6 +431,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
const char *msgfile = NULL, *keyid = NULL;
struct msg_arg msg = { 0, STRBUF_INIT };
struct commit_list *with_commit = NULL;
+ struct string_list exclude = STRING_LIST_INIT_NODUP;
struct option options[] = {
OPT_BOOLEAN('l', "list", &list, "list tag names"),
{ OPTION_INTEGER, 'n', NULL, &lines, "n",
@@ -459,6 +463,9 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPT_CALLBACK(0, "points-at", NULL, "object",
"print only tags of the object",
parse_opt_points_at),
+ OPT_CALLBACK(0, "exclude", &exclude, "pattern",
+ "ignore pattern matching tags",
+ parse_opt_string_list),
OPT_END()
};
@@ -485,13 +492,15 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
usage_with_options(git_tag_usage, options);
if (list)
return list_tags(argv, lines == -1 ? 0 : lines,
- with_commit);
+ with_commit, &exclude);
if (lines != -1)
die(_("-n option is only allowed with -l."));
if (with_commit)
die(_("--contains option is only allowed with -l."));
if (points_at.nr)
die(_("--points-at option is only allowed with -l."));
+ if (exclude.nr)
+ die(_("--exclude option is only allowed with -l."));
if (delete)
return for_each_tag_name(argv, delete_tag);
if (verify)
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index f8c247a..4f1cf48 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -82,6 +82,10 @@ test_expect_success \
'listing tags using a non-matching pattern should output nothing' \
'test `git tag -l xxx | wc -l` -eq 0'
+test_expect_success \
+ 'listing tags excluding "mytag" should output nothing' \
+ 'test `git tag -l --exclude mytag | wc -l` -eq 0'
+
# special cases for creating tags:
test_expect_success \
@@ -202,6 +206,15 @@ test_expect_success \
'
cat >expect <<EOF
+v0.2.1
+EOF
+test_expect_success \
+ 'listing tags with a suffix as pattern and prefix exclusion' '
+ git tag -l --exclude "v1.*" "*.1" > actual &&
+ test_cmp expect actual
+'
+
+cat >expect <<EOF
t210
t211
EOF
@@ -212,6 +225,15 @@ test_expect_success \
'
cat >expect <<EOF
+t210
+EOF
+test_expect_success \
+ 'listing tags with a prefix as pattern and suffix exclusion' '
+ git tag -l --exclude "*1" "t21*" > actual &&
+ test_cmp expect actual
+'
+
+cat >expect <<EOF
a1
EOF
test_expect_success \
@@ -239,6 +261,15 @@ test_expect_success \
test_cmp expect actual
'
+cat >expect <<EOF
+v1.0.1
+EOF
+test_expect_success \
+ 'listing tags with ? in the pattern and exclusion' '
+ git tag -l --exclude "v1.?.3" "v1.?.?" > actual &&
+ test_cmp expect actual
+'
+
>expect
test_expect_success \
'listing tags using v.* should print nothing because none have v.' '
@@ -263,6 +294,31 @@ test_expect_success 'tag -l can accept multiple patterns' '
test_cmp expect actual
'
+test_expect_success 'tag -l can cancel exclusions' '
+ git tag -l --exclude "v*.3" --no-exclude "v1*" "v0*" >actual &&
+ test_cmp expect actual
+'
+
+cat >expect <<EOF
+v0.2.1
+v1.0.1
+EOF
+test_expect_success 'tag -l can accept multiple patterns and exclusions' '
+ git tag -l --exclude "v*.3" --exclude "v1.0" "v1*" "v0*" >actual &&
+ test_cmp expect actual
+'
+
+cat >expect <<EOF
+v0.2.1
+v1.0.1
+v1.1.3
+EOF
+test_expect_success \
+ 'tag -l can cancel then reapply exclusions' '
+ git tag -l --exclude "v*.3" --no-exclude --exclude "v1.0" \
+ "v1*" "v0*" >actual &&
+ test_cmp expect actual
+'
# creating and verifying lightweight tags:
test_expect_success \
--
1.7.8
next prev parent reply other threads:[~2012-02-22 1:29 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-09 19:43 [RFC/PATCH] tag: make list exclude !<pattern> Tom Grennan
2012-02-09 19:43 ` Tom Grennan
2012-02-10 0:00 ` Tom Grennan
2012-02-10 6:34 ` Nguyen Thai Ngoc Duy
2012-02-10 18:55 ` Tom Grennan
2012-02-11 2:16 ` Tom Grennan
2012-02-11 3:06 ` Junio C Hamano
2012-02-11 7:50 ` Junio C Hamano
2012-02-11 10:13 ` Jakub Narebski
2012-02-11 14:06 ` Nguyen Thai Ngoc Duy
2012-02-11 18:31 ` Junio C Hamano
2012-02-11 19:47 ` Tom Grennan
2012-02-11 7:50 ` Michael Haggerty
2012-02-11 8:13 ` Junio C Hamano
2012-02-13 5:29 ` Michael Haggerty
2012-02-13 6:37 ` Junio C Hamano
2012-02-13 9:37 ` Michael Haggerty
2012-02-13 10:23 ` Junio C Hamano
2012-02-13 14:34 ` Michael Haggerty
2012-02-13 20:29 ` Junio C Hamano
2012-02-11 19:08 ` Tom Grennan
2012-02-22 1:28 ` [PATCHv3 0/5] " Tom Grennan
2012-02-22 1:28 ` [PATCHv3 1/5] refs: add match_pattern() Tom Grennan
2012-02-22 6:33 ` Junio C Hamano
2012-02-22 23:47 ` Tom Grennan
2012-02-23 0:17 ` Junio C Hamano
2012-02-23 0:59 ` Tom Grennan
2012-02-22 1:28 ` [PATCHv3 2/5] tag --points-at option wrapper Tom Grennan
2012-02-22 1:28 ` Tom Grennan [this message]
2012-02-22 6:33 ` [PATCHv3 3/5] tag --exclude option Junio C Hamano
2012-02-23 0:22 ` Tom Grennan
2012-02-23 1:00 ` Junio C Hamano
2012-03-01 1:45 ` [PATCH 0/5] modernize test style Tom Grennan
2012-03-03 2:15 ` [PATCHv2 " Tom Grennan
2012-03-03 8:04 ` Junio C Hamano
2012-03-03 17:42 ` Tom Grennan
2012-03-03 2:15 ` [PATCHv2 1/5] t7004 (tag): modernize style Tom Grennan
2012-03-03 21:31 ` Johannes Sixt
2012-03-03 2:15 ` [PATCHv2 2/5] t5512 (ls-remote): " Tom Grennan
2012-03-03 8:05 ` Junio C Hamano
2012-03-03 17:33 ` Tom Grennan
2012-03-03 2:15 ` [PATCHv2 3/5] t3200 (branch): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2 4/5] t0040 (parse-options): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2 5/5] t6300 (for-each-ref): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 101/105] t7004 (tag): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 102/105] t5512 (ls-remote): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 103/105] t3200 (branch): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 104/105] t0040 (parse-options): " Tom Grennan
2012-03-03 2:15 ` [PATCHv2-w 105/105] t6300 (for-each-ref): " Tom Grennan
2012-03-01 1:45 ` [PATCH 1/5] " Tom Grennan
2012-03-01 6:53 ` Johannes Sixt
2012-03-01 15:58 ` Tom Grennan
2012-03-01 1:45 ` [PATCH 2/5] t5512 (ls-remote): " Tom Grennan
2012-03-01 8:36 ` Thomas Rast
2012-03-01 1:45 ` [PATCH 3/5] t3200 (branch): " Tom Grennan
2012-03-01 1:45 ` [PATCH 4/5] t0040 (parse-options): " Tom Grennan
2012-03-01 1:45 ` [PATCH 5/5] t7004 (tag): " Tom Grennan
2012-03-01 1:45 ` [PATCH-w 101/105] t6300 (for-each-ref): " Tom Grennan
2012-03-01 2:13 ` Junio C Hamano
2012-03-01 3:20 ` Tom Grennan
2012-03-01 3:26 ` Junio C Hamano
2012-03-01 5:10 ` Tom Grennan
2012-03-01 5:57 ` Tom Grennan
2012-03-01 8:42 ` Thomas Rast
2012-03-01 15:48 ` Tom Grennan
2012-03-01 1:45 ` [PATCH-w 102/105] t5512 (ls-remote): " Tom Grennan
2012-03-01 1:45 ` [PATCH-w 103/105] t3200 (branch): " Tom Grennan
2012-03-01 1:45 ` [PATCH-w 104/105] t0040 (parse-options): " Tom Grennan
2012-03-01 1:45 ` [PATCH-w 105/105] t7004 (tag): " Tom Grennan
2012-02-22 1:28 ` [PATCHv3 4/5] branch --exclude option Tom Grennan
2012-02-22 1:28 ` [PATCHv3 5/5] for-each-ref " Tom Grennan
2012-02-11 2:16 ` [PATCHv2 1/4] refs: add common refname_match_patterns() Tom Grennan
2012-02-11 7:12 ` Michael Haggerty
2012-02-11 19:17 ` Tom Grennan
2012-02-13 5:00 ` Michael Haggerty
2012-02-13 17:27 ` Tom Grennan
2012-02-11 8:06 ` Junio C Hamano
2012-02-11 19:37 ` Tom Grennan
2012-02-11 23:43 ` Junio C Hamano
2012-02-13 16:29 ` Tom Grennan
2012-02-11 2:16 ` [PATCHv2 2/4] tag: use refs.c:refname_match_patterns() Tom Grennan
2012-02-11 2:16 ` [PATCHv2 3/4] branch: " Tom Grennan
2012-02-11 2:16 ` [PATCHv2 4/4] for-each-ref: " Tom Grennan
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1329874130-16818-4-git-send-email-tmgrennan@gmail.com \
--to=tmgrennan@gmail.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jasampler@gmail.com \
--cc=pclouds@gmail.com \
--cc=peff@peff.net \
/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.
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 NNTP newsgroup(s).