Junio C Hamano <gitster@xxxxxxxxx> writes: > Jeff King <peff@xxxxxxxx> writes: > >> On Thu, Aug 25, 2011 at 10:30:17AM +0200, Michael J Gruber wrote: >> >>> - else if (argc == 0) >>> - return print_ref_list(kinds, detached, verbose, abbrev, with_commit); >>> + else if (argc == 0 || (verbose && argc == 1)) >>> + return print_ref_list(kinds, detached, verbose, abbrev, with_commit, argc ? argv[0] : NULL); >> >> Note that "git tag -l" takes multiple patterns these days (it used to >> silently ignore everything after the first one!). "git branch" should >> probably do the same. > > Agreed. ... and can be done without too much additional code. An offtopic side note about naming: I called it "const char **pattern" not "patterns" and that is deliberate. I find it natural to be able to call the 2nd pattern, counting from 0 as any CS person would, by spelling "pattern[2]". "patterns[2]" sounds as if I am have multiple sets of patterns and refering to the second set of patterns. builtin/branch.c | 25 +++++++++++++++++++------ 1 files changed, 19 insertions(+), 6 deletions(-) diff --git a/builtin/branch.c b/builtin/branch.c index 495bf2e..0fa62bd 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -260,10 +260,22 @@ static char *resolve_symref(const char *src, const char *prefix) struct append_ref_cb { struct ref_list *ref_list; - const char *pattern; + const char **pattern; int ret; }; +static int match_patterns(const char **pattern, const char *refname) +{ + if (!*pattern) + return 1; /* no pattern always matches */ + while (*pattern) { + if (!fnmatch(*pattern, refname, 0)) + return 1; + pattern++; + } + return 0; +} + static int append_ref(const char *refname, const unsigned char *sha1, int flags, void *cb_data) { struct append_ref_cb *cb = (struct append_ref_cb *)(cb_data); @@ -298,7 +310,7 @@ static int append_ref(const char *refname, const unsigned char *sha1, int flags, if ((kind & ref_list->kinds) == 0) return 0; - if (cb->pattern && fnmatch(cb->pattern, refname, 0)) + if (!match_patterns(cb->pattern, refname)) return 0; commit = NULL; @@ -496,7 +508,7 @@ static void show_detached(struct ref_list *ref_list) } } -static int print_ref_list(int kinds, int detached, int verbose, int abbrev, struct commit_list *with_commit, const char *pattern) +static int print_ref_list(int kinds, int detached, int verbose, int abbrev, struct commit_list *with_commit, const char **pattern) { int i; struct append_ref_cb cb; @@ -528,7 +540,7 @@ static int print_ref_list(int kinds, int detached, int verbose, int abbrev, stru qsort(ref_list.list, ref_list.index, sizeof(struct ref_item), ref_cmp); detached = (detached && (kinds & REF_LOCAL_BRANCH)); - if (detached && (!pattern || !fnmatch(pattern, "HEAD", 0))) + if (detached && match_patterns(pattern, "HEAD")) show_detached(&ref_list); for (i = 0; i < ref_list.index; i++) { @@ -703,8 +715,9 @@ int cmd_branch(int argc, const char **argv, const char *prefix) if (delete) return delete_branches(argc, argv, delete > 1, kinds); - else if (argc == 0 || (verbose && argc == 1)) - return print_ref_list(kinds, detached, verbose, abbrev, with_commit, argc ? argv[0] : NULL); + else if (argc == 0 || (verbose && argc)) + return print_ref_list(kinds, detached, verbose, abbrev, + with_commit, argv); else if (rename && (argc == 1)) rename_branch(head, argv[0], rename > 1); else if (rename && (argc == 2)) -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html