From: Tom Grennan Date: Sat, 11 Feb 2012 02:16:56 GMT Subject: [PATCHv2 2/4] tag: use refs.c:refname_match_patterns() Message-ID: <1328926618-17167-3-git-send-email-tmgrennan@gmail.com> In-Reply-To: <1328926618-17167-1-git-send-email-tmgrennan@gmail.com> This will exclude tags matching patterns prefaced with the '!' character. This has precedence over other matching patterns. For example, $ git tag -l \!*-rc? v1.7.8* v1.7.8 v1.7.8.1 v1.7.8.2 v1.7.8.3 v1.7.8.4 $ git tag -l v1.7.8* \!*-rc? v1.7.8 v1.7.8.1 v1.7.8.2 v1.7.8.3 v1.7.8.4 This is equivalent to, $ git tag -l v1.7.8* | grep -v '\-rc.' Without a matching pattern, filter all tags with the "!" patterns, $ ./git-tag -l \!*-rc? gitgui-0.10.0 gitgui-0.10.1 gitgui-0.10.2 ... v1.7.8.3 v1.7.8.4 v1.7.9 That is equivalent to, $ git tag -l | grep -v '\-rc.' Signed-off-by: Tom Grennan --- Documentation/git-tag.txt | 10 ++++++---- builtin/tag.c | 15 ++------------- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index 53ff5f6..56ea2fa 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -12,7 +12,7 @@ SYNOPSIS 'git tag' [-a | -s | -u ] [-f] [-m | -F ] [ | ] 'git tag' -d ... -'git tag' [-n[]] -l [--contains ] [...] +'git tag' [-n[]] -l [--contains ] [[!]...] 'git tag' -v ... DESCRIPTION @@ -75,13 +75,15 @@ OPTIONS If no number is given to `-n`, only the first line is printed. If the tag is not annotated, the commit message is displayed instead. --l :: ---list :: +-l [!]:: +--list [!]:: List tags with names that match the given pattern (or all if no pattern is given). Running "git tag" without arguments also lists all tags. The pattern is a shell wildcard (i.e., matched using fnmatch(3)). Multiple patterns may be given; if any of - them matches, the tag is shown. + them matches, the tag is shown. If the pattern is prefaced with + the '!' character, all tags matching the pattern are filtered + from the list. --contains :: Only list tags which contain the specified commit. diff --git a/builtin/tag.c b/builtin/tag.c index 31f02e8..7f99424 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -19,7 +19,7 @@ static const char * const git_tag_usage[] = { "git tag [-a|-s|-u ] [-f] [-m |-F ] []", "git tag -d ...", - "git tag -l [-n[]] [...]", + "git tag -l [-n[]] [[!]...]", "git tag -v ...", NULL }; @@ -30,17 +30,6 @@ struct tag_filter { struct commit_list *with_commit; }; -static int match_pattern(const char **patterns, const char *ref) -{ - /* no pattern means match everything */ - if (!*patterns) - return 1; - for (; *patterns; patterns++) - if (!fnmatch(*patterns, ref, 0)) - return 1; - return 0; -} - static int in_commit_list(const struct commit_list *want, struct commit *c) { for (; want; want = want->next) @@ -88,7 +77,7 @@ static int show_reference(const char *refname, const unsigned char *sha1, { struct tag_filter *filter = cb_data; - if (match_pattern(filter->patterns, refname)) { + if (refname_match_patterns(filter->patterns, refname)) { int i; unsigned long size; enum object_type type; -- 1.7.8