mirror of
https://github.com/git/git.git
synced 2024-11-24 02:17:02 +08:00
Merge branch 'en/rename-d-f' into en/merge-recursive
* en/rename-d-f: merge-recursive: D/F conflicts where was_a_dir/file -> was_a_dir t3509: Add rename + D/F conflict testcase that recursive strategy fails
This commit is contained in:
commit
a1155adc2d
@ -935,14 +935,7 @@ static int process_renames(struct merge_options *o,
|
||||
|
||||
try_merge = 0;
|
||||
|
||||
if (string_list_has_string(&o->current_directory_set, ren1_dst)) {
|
||||
clean_merge = 0;
|
||||
output(o, 1, "CONFLICT (rename/directory): Rename %s->%s in %s "
|
||||
" directory %s added in %s",
|
||||
ren1_src, ren1_dst, branch1,
|
||||
ren1_dst, branch2);
|
||||
conflict_rename_dir(o, ren1, branch1);
|
||||
} else if (sha_eq(src_other.sha1, null_sha1)) {
|
||||
if (sha_eq(src_other.sha1, null_sha1)) {
|
||||
clean_merge = 0;
|
||||
output(o, 1, "CONFLICT (rename/delete): Rename %s->%s in %s "
|
||||
"and deleted in %s",
|
||||
@ -1040,6 +1033,13 @@ static int process_renames(struct merge_options *o,
|
||||
if (!ren1->dst_entry->stages[2].mode !=
|
||||
!ren1->dst_entry->stages[3].mode)
|
||||
ren1->dst_entry->processed = 0;
|
||||
} else if (string_list_has_string(&o->current_directory_set, ren1_dst)) {
|
||||
clean_merge = 0;
|
||||
output(o, 1, "CONFLICT (rename/directory): Rename %s->%s in %s "
|
||||
" directory %s added in %s",
|
||||
ren1_src, ren1_dst, branch1,
|
||||
ren1_dst, branch2);
|
||||
conflict_rename_dir(o, ren1, branch1);
|
||||
} else {
|
||||
if (mfi.merge || !mfi.clean)
|
||||
output(o, 1, "Renaming %s => %s", ren1_src, ren1_dst);
|
||||
|
@ -32,4 +32,70 @@ test_expect_success SYMLINKS 'Cherry-pick succeeds with rename across D/F confli
|
||||
git cherry-pick branch
|
||||
'
|
||||
|
||||
test_expect_success 'Setup rename with file on one side matching directory name on other' '
|
||||
git checkout --orphan nick-testcase &&
|
||||
git rm -rf . &&
|
||||
|
||||
>empty &&
|
||||
git add empty &&
|
||||
git commit -m "Empty file" &&
|
||||
|
||||
git checkout -b simple &&
|
||||
mv empty file &&
|
||||
mkdir empty &&
|
||||
mv file empty &&
|
||||
git add empty/file &&
|
||||
git commit -m "Empty file under empty dir" &&
|
||||
|
||||
echo content >newfile &&
|
||||
git add newfile &&
|
||||
git commit -m "New file"
|
||||
'
|
||||
|
||||
test_expect_success 'Cherry-pick succeeds with was_a_dir/file -> was_a_dir (resolve)' '
|
||||
git reset --hard &&
|
||||
git checkout -q nick-testcase^0 &&
|
||||
git cherry-pick --strategy=resolve simple
|
||||
'
|
||||
|
||||
test_expect_success 'Cherry-pick succeeds with was_a_dir/file -> was_a_dir (recursive)' '
|
||||
git reset --hard &&
|
||||
git checkout -q nick-testcase^0 &&
|
||||
git cherry-pick --strategy=recursive simple
|
||||
'
|
||||
|
||||
test_expect_success 'Setup rename with file on one side matching different dirname on other' '
|
||||
git reset --hard &&
|
||||
git checkout --orphan mergeme &&
|
||||
git rm -rf . &&
|
||||
|
||||
mkdir sub &&
|
||||
mkdir othersub &&
|
||||
echo content > sub/file &&
|
||||
echo foo > othersub/whatever &&
|
||||
git add -A &&
|
||||
git commit -m "Common commmit" &&
|
||||
|
||||
git rm -rf othersub &&
|
||||
git mv sub/file othersub &&
|
||||
git commit -m "Commit to merge" &&
|
||||
|
||||
git checkout -b newhead mergeme~1 &&
|
||||
>independent-change &&
|
||||
git add independent-change &&
|
||||
git commit -m "Completely unrelated change"
|
||||
'
|
||||
|
||||
test_expect_success 'Cherry-pick with rename to different D/F conflict succeeds (resolve)' '
|
||||
git reset --hard &&
|
||||
git checkout -q newhead^0 &&
|
||||
git cherry-pick --strategy=resolve mergeme
|
||||
'
|
||||
|
||||
test_expect_success 'Cherry-pick with rename to different D/F conflict succeeds (recursive)' '
|
||||
git reset --hard &&
|
||||
git checkout -q newhead^0 &&
|
||||
git cherry-pick --strategy=recursive mergeme
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user