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

[PATCH 3/6] Raw diff output format for bulk moves.

From
Yann Dirson <ydirson@altern.org>
Date
Dec 9, 2010, 21:38 UTC
Message-ID
<1291930687-8990-4-git-send-email-ydirson@altern.org>
In-Reply-To
<1291930687-8990-1-git-send-email-ydirson@altern.org>

To distinguish the general bulk-move case (where the destination directory was pre-existing) from the directory-rename case (where it was not), the output of raw diff is displayed as "Rnnn a/* b/". Those cannot be confused with renames of files named "whatever/*" with a literal star character, from the full-zero SHA1's.

Signed-off-by: Yann Dirson <ydirson@free.fr>
---
 Documentation/gitdiffcore.txt |    2 +-
 diff.c                        |    9 ++++++++-
 2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/Documentation/gitdiffcore.txt b/Documentation/gitdiffcore.txt
index 93111ac..2538dc0 100644
--- a/Documentation/gitdiffcore.txt
+++ b/Documentation/gitdiffcore.txt
@@ -181,7 +181,7 @@ additional pass on top of the results of per-file rename detection.
 They are reported with NULL SHA1 id, in addition to the file renames:
 
 ------------------------------------------------
-:040000 040000 0000000... 0000000... R100 foo/ bar/
+:040000 040000 0000000... 0000000... R100 foo/* bar/
 :100644 100644 0123456... 1234567... R090 foo/file0 bar/file3
 :100644 100644 2345678... 2345678... R100 foo/file1 bar/file1
 :100644 100644 3456789... 3456789... R100 foo/file2 bar/file2
diff --git a/diff.c b/diff.c
index d64ae44..0694d7f 100644
--- a/diff.c
+++ b/diff.c
@@ -3499,7 +3499,14 @@ static void diff_flush_raw(struct diff_filepair *p, struct diff_options *opt)
 	if (p->status == DIFF_STATUS_COPIED ||
 	    p->status == DIFF_STATUS_RENAMED) {
 		const char *name_a, *name_b;
-		name_a = p->one->path;
+		if (p->is_bulkmove) {
+			/* append "*" to the first dirname */
+			char buf[PATH_MAX];
+			char *next = memccpy(buf, p->one->path, '\0', PATH_MAX);
+			next[-1] = '*'; *next = '\0';
+			name_a = buf;
+		} else
+			name_a = p->one->path;
 		name_b = p->two->path;
 		strip_prefix(opt->prefix_length, &name_a, &name_b);
 		write_name_quoted(name_a, opt->file, inter_name_termination);
-- 
1.7.2.3
Previous: Yann DirsonNext: Yann Dirson
Message 4 of 7 in “Detection of directory renames”
  1. Detection of directory renamesYann Dirson, Dec 9, 2010
  2. 1/6 Introduce debug_bulkmove() in diffcore-rename.Yann Dirson, Dec 9, 2010
  3. 2/6 Introduce bulk-move detection in diffcore.Yann Dirson, Dec 9, 2010
  4. 3/6 Raw diff output format for bulk moves.Yann Dirson, Dec 9, 2010
  5. 4/6 Add testcases for the --detect-bulk-moves diffcore flag.Yann Dirson, Dec 9, 2010
  6. 5/6 Unified diff output format for bulk moves.Yann Dirson, Dec 9, 2010
  7. 6/6 [WIP] Allow hiding renames of individual files involved in a directory rename.Yann Dirson, Dec 9, 2010

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.