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

[PATCHv3 5/6] fast-export: Fix output order of D/F changes

From
newren@gmail.com <newren@gmail.com>
Date
Jul 7, 2010, 05:20 UTC
Message-ID
<1278480034-22939-6-git-send-email-newren@gmail.com>
In-Reply-To
<1278480034-22939-1-git-send-email-newren@gmail.com>
From: Elijah Newren <newren@gmail.com>

The fast-import stream format requires incremental changes which take place immediately, meaning that for D->F conversions all files below the relevant directory must be deleted before the resulting file of the same name is created. Reversing the order can result in fast-import silently deleting the file right after creating it, resulting in the file missing from the resulting repository.

We correct the order by instructing the diff_tree machinery to compare entries using df_name_compare instead of base_name_compare.

Signed-off-by: Elijah Newren <newren@gmail.com>
---
 builtin/fast-export.c  |    1 +
 diff.h                 |    1 +
 t/t9350-fast-export.sh |    2 +-
 tree-diff.c            |    4 +++-
 4 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/builtin/fast-export.c b/builtin/fast-export.c
index c6dd71a..de6349f 100644
--- a/builtin/fast-export.c
+++ b/builtin/fast-export.c
@@ -614,6 +614,7 @@ int cmd_fast_export(int argc, const char **argv, const char *prefix)
 		die("revision walk setup failed");
 	revs.diffopt.format_callback = show_filemodify;
 	DIFF_OPT_SET(&revs.diffopt, RECURSIVE);
+	DIFF_OPT_SET(&revs.diffopt, COMPARE_DF_EQUAL);
 	while ((commit = get_revision(&revs))) {
 		if (has_unshown_parent(commit)) {
 			add_object_array(&commit->object, NULL, &commits);
diff --git a/diff.h b/diff.h
index 6a71013..6e1a1db 100644
--- a/diff.h
+++ b/diff.h
@@ -71,6 +71,7 @@ typedef void (*diff_format_fn_t)(struct diff_queue_struct *q,
 #define DIFF_OPT_SUBMODULE_LOG       (1 << 23)
 #define DIFF_OPT_DIRTY_SUBMODULES    (1 << 24)
 #define DIFF_OPT_IGNORE_UNTRACKED_IN_SUBMODULES (1 << 25)
+#define DIFF_OPT_COMPARE_DF_EQUAL    (1 << 26)
 
 #define DIFF_OPT_TST(opts, flag)    ((opts)->flags & DIFF_OPT_##flag)
 #define DIFF_OPT_SET(opts, flag)    ((opts)->flags |= DIFF_OPT_##flag)
diff --git a/t/t9350-fast-export.sh b/t/t9350-fast-export.sh
index 69179c6..1ee1461 100755
--- a/t/t9350-fast-export.sh
+++ b/t/t9350-fast-export.sh
@@ -376,7 +376,7 @@ test_expect_success 'tree_tag-obj'    'git fast-export tree_tag-obj'
 test_expect_success 'tag-obj_tag'     'git fast-export tag-obj_tag'
 test_expect_success 'tag-obj_tag-obj' 'git fast-export tag-obj_tag-obj'
 
-test_expect_failure 'directory becomes symlink'        '
+test_expect_success 'directory becomes symlink'        '
 	git init dirtosymlink &&
 	git init result &&
 	(
diff --git a/tree-diff.c b/tree-diff.c
index fe9f52c..03f93b7 100644
--- a/tree-diff.c
+++ b/tree-diff.c
@@ -40,7 +40,9 @@ static int compare_tree_entry(struct tree_desc *t1, struct tree_desc *t2, const
 
 	pathlen1 = tree_entry_len(path1, sha1);
 	pathlen2 = tree_entry_len(path2, sha2);
-	cmp = base_name_compare(path1, pathlen1, mode1, path2, pathlen2, mode2);
+	cmp = DIFF_OPT_TST(opt, COMPARE_DF_EQUAL) ?
+	      df_name_compare(path1, pathlen1, mode1, path2, pathlen2, mode2) :
+	      base_name_compare(path1, pathlen1, mode1, path2, pathlen2, mode2);
 	if (cmp < 0) {
 		show_entry(opt, "-", t1, base, baselen);
 		return -1;
-- 
1.7.1.1.10.g2e807
Previous: newren@gmail.comNext: Junio C Hamano
Message 13 of 17 in “[PATCHv3 0/6] D/F conflict fixes”
  1. newren@gmail.comJul 7, 2010
  2. 1/6 Add additional testcases for D/F conflictsnewren@gmail.com, Jul 7, 2010
  3. Junio C HamanoJul 7, 2010
  4. Elijah NewrenJul 8, 2010
  5. Junio C HamanoJul 8, 2010
  6. 2/6 Add a rename + D/F conflict testcasenewren@gmail.com, Jul 7, 2010
  7. Junio C HamanoJul 7, 2010
  8. Elijah NewrenJul 8, 2010
  9. 3/6 merge-recursive: Fix D/F conflictsnewren@gmail.com, Jul 7, 2010
  10. Junio C HamanoJul 7, 2010
  11. Elijah NewrenJul 8, 2010
  12. 4/6 merge_recursive: Fix renames across paths below D/F conflictsnewren@gmail.com, Jul 7, 2010
  13. 5/6 fast-export: Fix output order of D/F changesnewren@gmail.com, Jul 7, 2010
  14. Junio C HamanoJul 7, 2010
  15. Elijah NewrenJul 8, 2010
  16. Junio C HamanoJul 8, 2010
  17. 6/6 fast-import: Improve robustness when D->F changes provided in wrong ordernewren@gmail.com, Jul 7, 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.