[PATCH] Simplify "reverse-diff" logic in the diff core.
From: Junio C Hamano <hidden>
Date: 2016-06-15 22:41:57
Subsystem:
the rest · Maintainer:
Linus Torvalds
Instead of swapping the arguments just before output, this patch makes the swapping happen on the input side of the diff core, when "reverse-diff" is in effect. This greatly simplifies the logic, but more importantly it is necessary for upcoming "copy detection" work. Signed-off-by: Junio C Hamano <redacted> --- diff.c | 38 +++++++++++++++----------------------- 1 files changed, 15 insertions(+), 23 deletions(-)
diff --git a/diff.c b/diff.c
--- a/diff.c
+++ b/diff.c@@ -350,15 +350,6 @@ static void run_external_diff(const char int status; static int atexit_asked = 0; - if (reverse_diff) { - struct diff_spec *tmp_spec; - tmp_spec = one; one = two; two = tmp_spec; - if (other) { - const char *tmp; - tmp = name; name = other; other = tmp; - } - } - if (!matches_pathspec(name) && (!other || !matches_pathspec(other))) return;
@@ -765,11 +756,12 @@ void diff_addremove(int addremove, unsig char concatpath[PATH_MAX]; struct diff_spec spec[2], *one, *two; + if (reverse_diff) + addremove = (addremove == '+' ? '-' : '+'); + if (0 <= diff_raw_output) { if (!path) path = ""; - if (reverse_diff) - addremove = (addremove == '+' ? '-' : '+'); printf("%c%06o %s %s %s%s%c", addremove, mode,
@@ -806,24 +798,24 @@ void diff_change(unsigned old_mode, unsi char concatpath[PATH_MAX]; struct diff_spec spec[2]; + if (reverse_diff) { + unsigned tmp; + const unsigned char *tmp_c; + tmp = old_mode; old_mode = new_mode; new_mode = tmp; + tmp_c = old_sha1; old_sha1 = new_sha1; new_sha1 = tmp_c; + } + if (0 <= diff_raw_output) { char old_hex[41]; strcpy(old_hex, sha1_to_hex(old_sha1)); if (!path) path = ""; - if (reverse_diff) - printf("*%06o->%06o %s %s->%s %s%s%c", - new_mode, old_mode, - git_object_type(new_mode), - sha1_to_hex(new_sha1), old_hex, - base, path, diff_raw_output); - else - printf("*%06o->%06o %s %s->%s %s%s%c", - old_mode, new_mode, - git_object_type(new_mode), - old_hex, sha1_to_hex(new_sha1), - base, path, diff_raw_output); + printf("*%06o->%06o %s %s->%s %s%s%c", + old_mode, new_mode, + git_object_type(new_mode), + old_hex, sha1_to_hex(new_sha1), + base, path, diff_raw_output); return; } if (S_ISDIR(new_mode)) ------------------------------------------------