summaryrefslogtreecommitdiff
path: root/diff-cache.c
diff options
context:
space:
mode:
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 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,