From: Linus Torvalds Date: Thu, 14 Jul 2005 23:43:01 +0000 (-0700) Subject: Make git-diff-cache skip any comparisons which don't match pathspec X-Git-Tag: v0.99.1~19 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=fdee7d07ba6c79b3e5125e96adbe1d9c3e75ce1d;p=git.git Make git-diff-cache skip any comparisons which don't match pathspec This brings all the same pathspec optimizations that git-diff-tree does to git-diff-cache. --- diff --git a/diff-cache.c b/diff-cache.c index be9222288..37c6eb580 100644 --- a/diff-cache.c +++ b/diff-cache.c @@ -87,12 +87,37 @@ static int show_modified(struct cache_entry *old, return 0; } -static int diff_cache(struct cache_entry **ac, int entries) +static int ce_path_match(const struct cache_entry *ce, const char **pathspec) +{ + const char *match, *name; + int len; + + if (!pathspec) + return 1; + + len = ce_namelen(ce); + name = ce->name; + while ((match = *pathspec++) != NULL) { + int matchlen = strlen(match); + if (matchlen > len) + continue; + if (memcmp(name, match, matchlen)) + continue; + if (name[matchlen] == '/' || !name[matchlen]) + return 1; + } + return 0; +} + +static int diff_cache(struct cache_entry **ac, int entries, const char **pathspec) { while (entries) { struct cache_entry *ce = *ac; int same = (entries > 1) && ce_same_name(ce, ac[1]); + if (!ce_path_match(ce, pathspec)) + goto skip_entry; + switch (ce_stage(ce)) { case 0: /* No stage 1 entry? That means it's a new file */ @@ -130,6 +155,7 @@ static int diff_cache(struct cache_entry **ac, int entries) die("impossible cache entry stage"); } +skip_entry: /* * Ignore all the different stages for this file, * we've handled the relevant cases now. @@ -281,7 +307,7 @@ int main(int argc, const char **argv) if (read_tree(tree, size, 1, pathspec)) die("unable to read tree object %s", tree_name); - ret = diff_cache(active_cache, active_nr); + ret = diff_cache(active_cache, active_nr, pathspec); diffcore_std(pathspec, detect_rename, diff_score_opt,