It seems by far the easiest to let diff-cache take care of skipping files which have not been modified. The alternative is to keep diff-cache's lazy checking and make cogito's diff jump through hoops. Note, although the new SHA1 signature is derived, diff-cache still prints the special no-SHA1 for the modified file. -
Add --strict switch to diff-cache to force it to check the SHA1 signature of modified files so files are only listed if the mode or content changed.
Signed-off-by: Jonas Fonseca <fonseca@diku.dk>
--- 3b4a5bb703599458ce8fe504f37f8e28b77bd6ca/diff-cache.c (mode:100644 sha1:2ec6c29ab6b79a10277a2ff9021a2032d656abf0) +++ uncommitted/diff-cache.c (mode:100644)
Show changes to diff +32 −1
@@ -1,6 +1,7 @@ #include "cache.h" static int cached_only = 0; +static int strict_checking = 0; static int line_termination = '\n'; /* A file entry went away or appeared */ @@ -10,6 +11,26 @@ sha1_to_hex(ce->sha1), ce->name, line_termination); } +static int check_modified_signature(struct cache_entry *old, struct stat *st) +{ + void *map; + int ret = -1; + int fd = open(old->name, O_RDONLY); + + if (fd < 0) + return -1; + + map = mmap(NULL, st->st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (map != MAP_FAILED) { + ret = check_sha1_signature(old->sha1, map, st->st_size, "blob"); + munmap(map, st->st_size); + } + + close(fd); + + return ret; +} + static int show_modified(struct cache_entry *old, struct cache_entry *new) { unsigned int mode = ntohl(new->ce_mode), oldmode; @@ -27,6 +48,12 @@ changed = cache_match_stat(new, &st); if (changed) { mode = st.st_mode; + + if (strict_checking + && mode == ntohl(old->ce_mode) + && check_modified_signature(old, &st) == 0) + return 0; + sha1 = no_sha1; } } @@ -85,7 +112,7 @@ } } -static char *diff_cache_usage = "diff-cache [-r] [-z] [--cached] <tree sha1>"; +static char *diff_cache_usage = "diff-cache [-r] [-z] [--cached] [--strict] <tree sha1>"; int main(int argc, char **argv) { @@ -110,6 +137,10 @@ cached_only = 1; continue; } + if (!strcmp(arg, "--strict")) { + strict_checking = 1; + continue; + } usage(diff_cache_usage); }
-- Jonas Fonseca