From: Junio C Hamano Date: Mon, 12 Sep 2011 04:54:32 +0000 (-0700) Subject: Merge branch 'jk/tag-contains-ab' (early part) into maint X-Git-Tag: v1.7.6.3~6 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=fcfc2d587962ed307b378074387ad7f472874bda;p=git.git Merge branch 'jk/tag-contains-ab' (early part) into maint * 'jk/tag-contains-ab' (early part): tag: speed up --contains calculation --- fcfc2d587962ed307b378074387ad7f472874bda diff --cc builtin/tag.c index cef27263b,f7a7943c9..667515e52 --- a/builtin/tag.c +++ b/builtin/tag.c @@@ -29,17 -31,50 +31,59 @@@ struct tag_filter struct commit_list *with_commit; }; -#define PGP_SIGNATURE "-----BEGIN PGP SIGNATURE-----" +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) + if (!hashcmp(want->item->object.sha1, c->object.sha1)) + return 1; + return 0; + } + + static int contains_recurse(struct commit *candidate, + const struct commit_list *want) + { + struct commit_list *p; + + /* was it previously marked as containing a want commit? */ + if (candidate->object.flags & TMP_MARK) + return 1; + /* or marked as not possibly containing a want commit? */ + if (candidate->object.flags & UNINTERESTING) + return 0; + /* or are we it? */ + if (in_commit_list(want, candidate)) + return 1; + + if (parse_commit(candidate) < 0) + return 0; + + /* Otherwise recurse and mark ourselves for future traversals. */ + for (p = candidate->parents; p; p = p->next) { + if (contains_recurse(p->item, want)) { + candidate->object.flags |= TMP_MARK; + return 1; + } + } + candidate->object.flags |= UNINTERESTING; + return 0; + } + + static int contains(struct commit *candidate, const struct commit_list *want) + { + return contains_recurse(candidate, want); + } + static int show_reference(const char *refname, const unsigned char *sha1, int flag, void *cb_data) {