Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.kernel.org/pub/scm/git/git.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2005-07-15 03:43:01 +0400
committerLinus Torvalds <torvalds@g5.osdl.org>2005-07-15 03:43:01 +0400
commitfdee7d07ba6c79b3e5125e96adbe1d9c3e75ce1d (patch)
treee90f4a9069556f5442e999f0bff5f8c570ab4967 /diff-cache.c
parenta74ba54bd15d63bfb962b584fa96937b06cdfc87 (diff)
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.c30
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,