git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] Add --strict switch to diff-cache to force SHA1 checking
@ 2005-04-24  3:35 Jonas Fonseca
  2005-04-24  3:38 ` [PATCH] Use diff-cache --strict in gitdiff.sh Jonas Fonseca
  2005-04-24  3:57 ` [PATCH] Add --strict switch to diff-cache to force SHA1 checking Linus Torvalds
  0 siblings, 2 replies; 4+ messages in thread
From: Jonas Fonseca @ 2005-04-24  3:35 UTC (permalink / raw)
  To: torvalds, pasky; +Cc: git

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

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2005-04-24  5:51 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-24  3:35 [PATCH] Add --strict switch to diff-cache to force SHA1 checking Jonas Fonseca
2005-04-24  3:38 ` [PATCH] Use diff-cache --strict in gitdiff.sh Jonas Fonseca
2005-04-24  3:57 ` [PATCH] Add --strict switch to diff-cache to force SHA1 checking Linus Torvalds
2005-04-24  5:55   ` [PATCH] fix segfault in fsck-cache (2nd attempt) Andreas Gal

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).