git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] Add --strict switch to diff-cache to force SHA1 checking

From
Jonas Fonseca <fonseca@diku.dk>
Date
Apr 24, 2005, 03:35 UTC
Message-ID
<20050424033554.GA23293@diku.dk>

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)

@@ -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
Next: Jonas Fonseca
Message 1 of 4 in “Add --strict switch to diff-cache to force SHA1 checking”
  1. Add --strict switch to diff-cache to force SHA1 checkingJonas Fonseca, Apr 24, 2005
  2. Use diff-cache --strict in gitdiff.shJonas Fonseca, Apr 24, 2005
  3. Linus TorvaldsApr 24, 2005
  4. fix segfault in fsck-cache (2nd attempt)Andreas Gal, Apr 24, 2005

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.