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

[PATCH] Simplify "reverse-diff" logic in the diff core.

From
Junio C Hamano <junkio@cox.net>
Date
May 20, 2005, 16:54 UTC
Message-ID
<7vfywhu9cg.fsf_-_@assigned-by-dhcp.cox.net>
In-Reply-To
<Pine.LNX.4.58.0505200806150.2206@ppc970.osdl.org>

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 <junkio@cox.net>
---

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))
------------------------------------------------
Previous: Junio C Hamano
Message 9 of 9 in “"git-diff-tree -R A B == git-diff-tree B A"?”
  1. Junio C HamanoMay 20, 2005
  2. Linus TorvaldsMay 20, 2005
  3. Junio C HamanoMay 20, 2005
  4. Junio C HamanoMay 20, 2005
  5. Linus TorvaldsMay 20, 2005
  6. Linus TorvaldsMay 20, 2005
  7. Linus TorvaldsMay 20, 2005
  8. Junio C HamanoMay 20, 2005
  9. Simplify "reverse-diff" logic in the diff core.Junio C Hamano, May 20, 2005

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.