Commits

Anonymous committed c0fd1f5

Make "ce_match_path()" a generic helper function

... and make git-diff-files use it too. This all _should_ make the
diffcore-pathspec.c phase unnecessary, since the diff'ers now all do the
path matching early interally.

Comments (0)

Files changed (4)

 extern int remove_file_from_cache(char *path);
 extern int ce_same_name(struct cache_entry *a, struct cache_entry *b);
 extern int ce_match_stat(struct cache_entry *ce, struct stat *st);
+extern int ce_path_match(const struct cache_entry *ce, const char **pathspec);
 extern int index_fd(unsigned char *sha1, int fd, struct stat *st, int write_object, const char *type);
 extern void fill_stat_cache_info(struct cache_entry *ce, struct stat *st);
 
 	return 0;
 }
 
-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) {
 int main(int argc, const char **argv)
 {
 	static const unsigned char null_sha1[20] = { 0, };
+	const char **pathspec;
 	int entries = read_cache();
 	int i;
 
 		argv++; argc--;
 	}
 
+	/* Do we have a pathspec? */
+	pathspec = (argc > 1) ? argv + 1 : NULL;
+
 	if (find_copies_harder && detect_rename != DIFF_DETECT_COPY)
 		usage(diff_files_usage);
 
 		struct cache_entry *ce = active_cache[i];
 		int changed;
 
+		if (!ce_path_match(ce, pathspec))
+			continue;
+
 		if (ce_stage(ce)) {
 			show_unmerge(ce->name);
 			while (i < entries &&
 			      ce->sha1, (changed ? null_sha1 : ce->sha1),
 			      ce->name);
 	}
-	diffcore_std((1 < argc) ? argv + 1 : NULL,
+	diffcore_std(pathspec, 
 		     detect_rename, diff_score_opt,
 		     pickaxe, pickaxe_opts,
 		     diff_break_opt,
 	return ce_namelen(b) == len && !memcmp(a->name, b->name, len);
 }
 
+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 (matchlen && name[matchlen-1] == '/')
+			return 1;
+		if (name[matchlen] == '/' || !name[matchlen])
+			return 1;
+	}
+	return 0;
+}
+
 /*
  * Do we have another file that has the beginning components being a
  * proper superset of the name we're trying to add?