Commit e2cdc145b9633ed0f7fcfdeed5eb4a7fc65653ae

Edward Thomson 2015-09-23T17:48:52

patch: show modes when only the mode has changed

diff --git a/src/diff_print.c b/src/diff_print.c
index 93c887b..32283d5 100644
--- a/src/diff_print.c
+++ b/src/diff_print.c
@@ -258,6 +258,15 @@ static int diff_print_one_raw(
 	return pi->print_cb(delta, NULL, &pi->line, pi->payload);
 }
 
+static int diff_print_modes(
+	git_buf *out, const git_diff_delta *delta)
+{
+	git_buf_printf(out, "old mode %o\n", delta->old_file.mode);
+	git_buf_printf(out, "new mode %o\n", delta->new_file.mode);
+
+	return git_buf_oom(out) ? -1 : 0;
+}
+
 static int diff_print_oid_range(
 	git_buf *out, const git_diff_delta *delta, int oid_strlen)
 {
@@ -286,14 +295,13 @@ static int diff_print_oid_range(
 		git_buf_printf(out, "index %s..%s %o\n",
 			start_oid, end_oid, delta->old_file.mode);
 	} else {
-		if (delta->old_file.mode == 0) {
+		if (delta->old_file.mode == 0)
 			git_buf_printf(out, "new file mode %o\n", delta->new_file.mode);
-		} else if (delta->new_file.mode == 0) {
+		else if (delta->new_file.mode == 0)
 			git_buf_printf(out, "deleted file mode %o\n", delta->old_file.mode);
-		} else {
-			git_buf_printf(out, "old mode %o\n", delta->old_file.mode);
-			git_buf_printf(out, "new mode %o\n", delta->new_file.mode);
-		}
+		else
+			diff_print_modes(out, delta);
+
 		git_buf_printf(out, "index %s..%s\n", start_oid, end_oid);
 	}
 
@@ -309,7 +317,6 @@ static int diff_delta_format_path(
 	return git_buf_quote(out);
 }
 
-
 static int diff_delta_format_with_paths(
 	git_buf *out,
 	const git_diff_delta *delta,
@@ -371,7 +378,7 @@ int git_diff_delta__format_file_header(
 	int oid_strlen)
 {
 	git_buf old_path = GIT_BUF_INIT, new_path = GIT_BUF_INIT;
-	bool skip_index;
+	bool unchanged;
 	int error = 0;
 
 	if (!oldpfx)
@@ -397,12 +404,10 @@ int git_diff_delta__format_file_header(
 			goto done;
 	}
 
-	skip_index = (delta->status == GIT_DELTA_RENAMED &&
-		delta->similarity == 100 &&
-		delta->old_file.mode == 0 &&
-		delta->new_file.mode == 0);
+	unchanged = (git_oid_iszero(&delta->old_file.id) &&
+		git_oid_iszero(&delta->new_file.id));
 
-	if (!skip_index) {
+	if (!unchanged) {
 		if ((error = diff_print_oid_range(out, delta, oid_strlen)) < 0)
 			goto done;
 
@@ -411,6 +416,9 @@ int git_diff_delta__format_file_header(
 				"--- %s\n+++ %s\n", old_path.ptr, new_path.ptr);
 	}
 
+	if (unchanged && delta->old_file.mode != delta->new_file.mode)
+		diff_print_modes(out, delta);
+
 	if (git_buf_oom(out))
 		error = -1;