From: Elijah Newren <newren@xxxxxxxxx> 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@xxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html