diff options
author | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-14 16:43:01 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-07-14 16:43:01 -0700 |
commit | fdee7d07ba6c79b3e5125e96adbe1d9c3e75ce1d (patch) | |
tree | e90f4a9069556f5442e999f0bff5f8c570ab4967 /diff-cache.c | |
parent | a74ba54bd15d63bfb962b584fa96937b06cdfc87 (diff) | |
download | git-fdee7d07ba6c79b3e5125e96adbe1d9c3e75ce1d.tar.gz |
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.
Diffstat (limited to 'diff-cache.c')
-rw-r--r-- | diff-cache.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/diff-cache.c b/diff-cache.c index be9222288f..37c6eb5804 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, |