From fdee7d07ba6c79b3e5125e96adbe1d9c3e75ce1d Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Thu, 14 Jul 2005 16:43:01 -0700 Subject: 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 be92222..37c6eb5 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, -- cgit v0.10.2-6-g49f6