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

[PATCH 3/3] Teach 'diff' about 'nodiff' attribute.

From
Junio C Hamano <junkio@cox.net>
Date
Apr 13, 2007, 09:01 UTC
Message-ID
<7vodlsd4wc.fsf@assigned-by-dhcp.cox.net>

This makes paths with 'nodiff' attribute not to produce "textual" diffs from 'git-diff' family.

Signed-off-by: Junio C Hamano <junkio@cox.net>
---
 attr.c |   18 ------------------
 diff.c |   40 +++++++++++++++++++++++++++++++---------
 2 files changed, 31 insertions(+), 27 deletions(-)
diff --git a/attr.c b/attr.c
index d35ae9e..bdbc4a3 100644
--- a/attr.c
+++ b/attr.c
@@ -299,21 +299,3 @@ int git_checkattr(const char *path, int num, struct git_attr_check *check)
 		rem = fill(path, pathlen, stk, check, num, rem);
 	return 0;
 }
-
-static void setup_binary_check(struct git_attr_check *check)
-{
-	static struct git_attr *attr_binary;
-
-	if (!attr_binary)
-		attr_binary = git_attr("binary", 6);
-	check->attr = attr_binary;
-}
-
-int git_path_is_binary(const char *path)
-{
-	struct git_attr_check attr_binary_check;
-
-	setup_binary_check(&attr_binary_check);
-	return (!git_checkattr(path, 1, &attr_binary_check) &&
-		(0 < attr_binary_check.isset));
-}
diff --git a/diff.c b/diff.c
index fbb79d7..bc4af5c 100644
--- a/diff.c
+++ b/diff.c
@@ -8,6 +8,7 @@
 #include "delta.h"
 #include "xdiff-interface.h"
 #include "color.h"
+#include "attr.h"
 
 #ifdef NO_FAST_WORKING_DIRECTORY
 #define FAST_WORKING_DIRECTORY 0
@@ -1051,13 +1052,34 @@ static void emit_binary_diff(mmfile_t *one, mmfile_t *two)
 	emit_binary_diff_body(two, one);
 }
 
+static void setup_nodiff_check(struct git_attr_check *check)
+{
+	static struct git_attr *attr_nodiff;
+
+	if (!attr_nodiff)
+		attr_nodiff = git_attr("nodiff", 6);
+	check->attr = attr_nodiff;
+}
+
 #define FIRST_FEW_BYTES 8000
-static int mmfile_is_binary(mmfile_t *mf)
+static int file_is_binary(struct diff_filespec *one)
 {
-	long sz = mf->size;
+	unsigned long sz;
+	struct git_attr_check attr_nodiff_check;
+
+	setup_nodiff_check(&attr_nodiff_check);
+	if (!git_checkattr(one->path, 1, &attr_nodiff_check) &&
+	    (0 < attr_nodiff_check.isset))
+		return 1;
+	if (!one->data) {
+		if (!DIFF_FILE_VALID(one))
+			return 0;
+		diff_populate_filespec(one, 0);
+	}
+	sz = one->size;
 	if (FIRST_FEW_BYTES < sz)
 		sz = FIRST_FEW_BYTES;
-	return !!memchr(mf->ptr, 0, sz);
+	return !!memchr(one->data, 0, sz);
 }
 
 static void builtin_diff(const char *name_a,
@@ -1114,7 +1136,7 @@ static void builtin_diff(const char *name_a,
 	if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
 		die("unable to read files to diff");
 
-	if (!o->text && (mmfile_is_binary(&mf1) || mmfile_is_binary(&mf2))) {
+	if (!o->text && (file_is_binary(one) || file_is_binary(two))) {
 		/* Quite common confusing case */
 		if (mf1.size == mf2.size &&
 		    !memcmp(mf1.ptr, mf2.ptr, mf1.size))
@@ -1190,7 +1212,7 @@ static void builtin_diffstat(const char *name_a, const char *name_b,
 	if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
 		die("unable to read files to diff");
 
-	if (mmfile_is_binary(&mf1) || mmfile_is_binary(&mf2)) {
+	if (file_is_binary(one) || file_is_binary(two)) {
 		data->is_binary = 1;
 		data->added = mf2.size;
 		data->deleted = mf1.size;
@@ -1228,7 +1250,7 @@ static void builtin_checkdiff(const char *name_a, const char *name_b,
 	if (fill_mmfile(&mf1, one) < 0 || fill_mmfile(&mf2, two) < 0)
 		die("unable to read files to diff");
 
-	if (mmfile_is_binary(&mf2))
+	if (file_is_binary(two))
 		return;
 	else {
 		/* Crazy xdl interfaces.. */
@@ -1805,8 +1827,8 @@ static void run_diff(struct diff_filepair *p, struct diff_options *o)
 
 		if (o->binary) {
 			mmfile_t mf;
-			if ((!fill_mmfile(&mf, one) && mmfile_is_binary(&mf)) ||
-			    (!fill_mmfile(&mf, two) && mmfile_is_binary(&mf)))
+			if ((!fill_mmfile(&mf, one) && file_is_binary(one)) ||
+			    (!fill_mmfile(&mf, two) && file_is_binary(two)))
 				abbrev = 40;
 		}
 		len += snprintf(msg + len, sizeof(msg) - len,
@@ -2701,7 +2723,7 @@ static int diff_get_patch_id(struct diff_options *options, unsigned char *sha1)
 			return error("unable to read files to diff");
 
 		/* Maybe hash p->two? into the patch id? */
-		if (mmfile_is_binary(&mf2))
+		if (file_is_binary(p->two))
 			continue;
 
 		len1 = remove_space(p->one->path, strlen(p->one->path));
-- 
1.5.1.1.784.g95e2
Next: Johannes Sixt
Message 1 of 7 in “Teach 'diff' about 'nodiff' attribute.”
  1. 3/3 Teach 'diff' about 'nodiff' attribute.Junio C Hamano, Apr 13, 2007
  2. Johannes SixtApr 13, 2007
  3. Andy ParkinsApr 13, 2007
  4. Johannes SixtApr 13, 2007
  5. Andy ParkinsApr 13, 2007
  6. Nicolas PitreApr 13, 2007
  7. Julian PhillipsApr 13, 2007

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.