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

[PATCH] fast-export: ensure that a renamed file is printed after all references

From
Johannes Sixt <j6t@kdbg.org>
Date
Sep 7, 2010, 19:33 UTC
Message-ID
<201009072133.02930.j6t@kdbg.org>

t9350 sets up a commit where a file is both copied and renamed. The output of fast-export for this commit should look like this:

  author ...
  committer ...
  from :19
  C "file2" "file4"
  R "file2" "file5"

The order of the two modification lines is derived from the result that the diff machinery produces.

060df62 (fast-export: Fix output order of D/F changes) inserted a qsort call that modifies the order of the diff result. Unfortunately, qsort need not be stable. Therefore, it is possible that the 'R' line appears before the 'C' line and the resulting fast-import stream is incorrect.

Fix it by forcing that the rename entry is printed after all other modification lines with the same file name.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
---
 builtin/fast-export.c |   10 +++++++++-
 1 files changed, 9 insertions(+), 1 deletions(-)
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index 965e90e..007bba6 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -166,7 +166,15 @@ static int depth_first(const void *a_, const void *b_)
 	cmp = memcmp(name_a, name_b, len);
 	if (cmp)
 		return cmp;
-	return (len_b - len_a);
+	cmp = len_b - len_a;
+	if (cmp)
+		return cmp;
+	/*
+	 * Move 'R'ename entries last so that all references of the file
+	 * appear in the output before it is renamed (e.g., when a file
+	 * was copied and renamed in the same commit).
+	 */
+	return (a->status == 'R') - (b->status == 'R');
 }
 
 static void show_filemodify(struct diff_queue_struct *q,
-- 
1.7.1.402.gf1eeb
Next: Elijah Newren
Message 1 of 4 in “fast-export: ensure that a renamed file is printed after all references”
  1. fast-export: ensure that a renamed file is printed after all referencesJohannes Sixt, Sep 7, 2010
  2. Elijah NewrenSep 8, 2010
  3. Johannes SixtSep 8, 2010
  4. Elijah NewrenSep 8, 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.