From: Junio C Hamano Date: Fri, 22 Jul 2011 21:45:19 +0000 (-0700) Subject: Merge branch 'jk/tag-contains-ab' X-Git-Tag: v1.7.7-rc0~72 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=9c81e6421bca19ef779e84dbf9ebf148e1c1201f;p=git.git Merge branch 'jk/tag-contains-ab' * jk/tag-contains-ab: Revert clock-skew based attempt to optimize tag --contains traversal git skew: a tool to find how big a clock skew exists in the history default core.clockskew variable to one day limit "contains" traversals based on commit timestamp tag: speed up --contains calculation --- 9c81e6421bca19ef779e84dbf9ebf148e1c1201f 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) {