[PATCH] diff: treat -crlf files as binary

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The manual advertises that setting "crlf" attribute to false marks the
file as binary.  We should pay attention to this condition in addition
to the "do not diff" attribute (i.e. setting "diff" to false) when
deciding not to show the textual diff.

Signed-off-by: Junio C Hamano <gitster@xxxxxxxxx>
---

 * Strictly speaking any change is backward incompatible, and this is
   certainly one, but I do not think of a good use case to depend on the
   previous behaviour, which was reported as a bug by my coworker.

 diff.c |   28 +++++++++++++++++++---------
 1 files changed, 19 insertions(+), 9 deletions(-)

diff --git a/diff.c b/diff.c
index 18fa7a7..258b438 100644
--- a/diff.c
+++ b/diff.c
@@ -1314,36 +1314,46 @@ static void emit_binary_diff(FILE *file, mmfile_t *one, mmfile_t *two)
 static void setup_diff_attr_check(struct git_attr_check *check)
 {
 	static struct git_attr *attr_diff;
+	static struct git_attr *attr_crlf;
 
-	if (!attr_diff) {
+	if (!attr_diff)
 		attr_diff = git_attr("diff", 4);
-	}
+	if (!attr_crlf)
+		attr_crlf = git_attr("crlf", 4);
 	check[0].attr = attr_diff;
+	check[1].attr = attr_crlf;
 }
 
 static void diff_filespec_check_attr(struct diff_filespec *one)
 {
-	struct git_attr_check attr_diff_check;
+	struct git_attr_check attr_diff_check[2];
 	int check_from_data = 0;
 
 	if (one->checked_attr)
 		return;
 
-	setup_diff_attr_check(&attr_diff_check);
+	setup_diff_attr_check(attr_diff_check);
 	one->is_binary = 0;
 	one->funcname_pattern_ident = NULL;
 
-	if (!git_checkattr(one->path, 1, &attr_diff_check)) {
+	if (!git_checkattr(one->path, 2, attr_diff_check)) {
 		const char *value;
 
-		/* binaryness */
-		value = attr_diff_check.value;
+		/* binaryness; check both "diff" and "crlf" */
+		value = attr_diff_check[0].value;
 		if (ATTR_TRUE(value))
 			;
 		else if (ATTR_FALSE(value))
 			one->is_binary = 1;
-		else
-			check_from_data = 1;
+		else {
+			const char *crlf = attr_diff_check[1].value;
+			if (ATTR_TRUE(crlf))
+				;
+			else if (ATTR_FALSE(crlf))
+				one->is_binary = 1;
+			else
+				check_from_data = 1;
+		}
 
 		/* funcname pattern ident */
 		if (ATTR_TRUE(value) || ATTR_FALSE(value) || ATTR_UNSET(value))
-- 
1.6.0.1.90.g27a6e

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux