Merge branch 'en/test-cleanup'

Test cleanup.

* en/test-cleanup:
  t6020: new test with interleaved lexicographic ordering of directories
  t6022, t6046: test expected behavior instead of testing a proxy for it
  t3035: prefer test_must_fail to bash negation for git commands
  t6020, t6022, t6035: update merge tests to use test helper functions
  t602[1236], t6034: modernize test formatting
This commit is contained in:
Junio C Hamano 2020-03-09 11:21:20 -07:00
commit cf372dc815
9 changed files with 746 additions and 671 deletions

View File

@ -28,7 +28,7 @@ test_expect_success 'setup' '
git config core.sparseCheckout true && git config core.sparseCheckout true &&
echo "/checked-out" >.git/info/sparse-checkout && echo "/checked-out" >.git/info/sparse-checkout &&
git reset --hard && git reset --hard &&
! git merge theirs test_must_fail git merge theirs
' '
test_expect_success 'reset --hard works after the conflict' ' test_expect_success 'reset --hard works after the conflict' '
@ -42,7 +42,7 @@ test_expect_success 'is reset properly' '
' '
test_expect_success 'setup: conflict back' ' test_expect_success 'setup: conflict back' '
! git merge theirs test_must_fail git merge theirs
' '
test_expect_success 'Merge abort works after the conflict' ' test_expect_success 'Merge abort works after the conflict' '

View File

@ -83,9 +83,9 @@ test_expect_success 'modify/delete + directory/file conflict' '
test 4 -eq $(git ls-files -u | wc -l) && test 4 -eq $(git ls-files -u | wc -l) &&
test 1 -eq $(git ls-files -o | wc -l) && test 1 -eq $(git ls-files -o | wc -l) &&
test -f letters/file && test_path_is_file letters/file &&
test -f letters.txt && test_path_is_file letters.txt &&
test -f letters~modify test_path_is_file letters~modify
' '
test_expect_success 'modify/delete + directory/file conflict; other way' ' test_expect_success 'modify/delete + directory/file conflict; other way' '
@ -99,9 +99,52 @@ test_expect_success 'modify/delete + directory/file conflict; other way' '
test 4 -eq $(git ls-files -u | wc -l) && test 4 -eq $(git ls-files -u | wc -l) &&
test 1 -eq $(git ls-files -o | wc -l) && test 1 -eq $(git ls-files -o | wc -l) &&
test -f letters/file && test_path_is_file letters/file &&
test -f letters.txt && test_path_is_file letters.txt &&
test -f letters~HEAD test_path_is_file letters~HEAD
'
test_expect_success 'Simple merge in repo with interesting pathnames' '
# Simple lexicographic ordering of files and directories would be:
# foo
# foo/bar
# foo/bar-2
# foo/bar/baz
# foo/bar-2/baz
# The fact that foo/bar-2 appears between foo/bar and foo/bar/baz
# can trip up some codepaths, and is the point of this test.
test_create_repo name-ordering &&
(
cd name-ordering &&
mkdir -p foo/bar &&
mkdir -p foo/bar-2 &&
>foo/bar/baz &&
>foo/bar-2/baz &&
git add . &&
git commit -m initial &&
git branch main &&
git branch other &&
git checkout other &&
echo other >foo/bar-2/baz &&
git add -u &&
git commit -m other &&
git checkout main &&
echo main >foo/bar/baz &&
git add -u &&
git commit -m main &&
git merge other &&
git ls-files -s >out &&
test_line_count = 2 out &&
git rev-parse :0:foo/bar/baz :0:foo/bar-2/baz >actual &&
git rev-parse HEAD~1:foo/bar/baz other:foo/bar-2/baz >expect &&
test_cmp expect actual
)
' '
test_done test_done

View File

@ -10,87 +10,58 @@
test_description='Test criss-cross merge' test_description='Test criss-cross merge'
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'prepare repository' \ test_expect_success 'prepare repository' '
'echo "1 test_write_lines 1 2 3 4 5 6 7 8 9 >file &&
2 git add file &&
3 git commit -m "Initial commit" file &&
4
5
6
7
8
9" > file &&
git add file &&
git commit -m "Initial commit" file &&
git branch A &&
git branch B &&
git checkout A &&
echo "1
2
3
4
5
6
7
8 changed in B8, branch A
9" > file &&
git commit -m "B8" file &&
git checkout B &&
echo "1
2
3 changed in C3, branch B
4
5
6
7
8
9
" > file &&
git commit -m "C3" file &&
git branch C3 &&
git merge -m "pre E3 merge" A &&
echo "1
2
3 changed in E3, branch B. New file size
4
5
6
7
8 changed in B8, branch A
9
" > file &&
git commit -m "E3" file &&
git checkout A &&
git merge -m "pre D8 merge" C3 &&
echo "1
2
3 changed in C3, branch B
4
5
6
7
8 changed in D8, branch A. New file size 2
9" > file &&
git commit -m D8 file'
test_expect_success 'Criss-cross merge' 'git merge -m "final merge" B' git branch A &&
git branch B &&
git checkout A &&
cat > file-expect <<EOF test_write_lines 1 2 3 4 5 6 7 "8 changed in B8, branch A" 9 >file &&
1 git commit -m "B8" file &&
2 git checkout B &&
3 changed in E3, branch B. New file size
4
5
6
7
8 changed in D8, branch A. New file size 2
9
EOF
test_expect_success 'Criss-cross merge result' 'cmp file file-expect' test_write_lines 1 2 "3 changed in C3, branch B" 4 5 6 7 8 9 >file &&
git commit -m "C3" file &&
git branch C3 &&
test_expect_success 'Criss-cross merge fails (-s resolve)' \ git merge -m "pre E3 merge" A &&
'git reset --hard A^ &&
test_must_fail git merge -s resolve -m "final merge" B' test_write_lines 1 2 "3 changed in E3, branch B. New file size" 4 5 6 7 "8 changed in B8, branch A" 9 >file &&
git commit -m "E3" file &&
git checkout A &&
git merge -m "pre D8 merge" C3 &&
test_write_lines 1 2 "3 changed in C3, branch B" 4 5 6 7 "8 changed in D8, branch A. New file size 2" 9 >file &&
git commit -m D8 file
'
test_expect_success 'Criss-cross merge' '
git merge -m "final merge" B
'
test_expect_success 'Criss-cross merge result' '
cat <<-\EOF >file-expect &&
1
2
3 changed in E3, branch B. New file size
4
5
6
7
8 changed in D8, branch A. New file size 2
9
EOF
test_cmp file-expect file
'
test_expect_success 'Criss-cross merge fails (-s resolve)' '
git reset --hard A^ &&
test_must_fail git merge -s resolve -m "final merge" B
'
test_done test_done

View File

@ -8,94 +8,94 @@ modify () {
mv "$2.x" "$2" mv "$2.x" "$2"
} }
test_expect_success setup \ test_expect_success 'setup' '
cat >A <<-\EOF &&
a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
c cccccccccccccccccccccccccccccccccccccccccccccccc
d dddddddddddddddddddddddddddddddddddddddddddddddd
e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
f ffffffffffffffffffffffffffffffffffffffffffffffff
g gggggggggggggggggggggggggggggggggggggggggggggggg
h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
l llllllllllllllllllllllllllllllllllllllllllllllll
m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
o oooooooooooooooooooooooooooooooooooooooooooooooo
EOF
cat >M <<-\EOF &&
A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
EOF
git add A M &&
git commit -m "initial has A and M" &&
git branch white &&
git branch red &&
git branch blue &&
git branch yellow &&
git branch change &&
git branch change+rename &&
sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
mv A+ A &&
git commit -a -m "master updates A" &&
git checkout yellow &&
rm -f M &&
git commit -a -m "yellow removes M" &&
git checkout white &&
sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
rm -f A M &&
git update-index --add --remove A B M N &&
git commit -m "white renames A->B, M->N" &&
git checkout red &&
sed -e "/^g /s/.*/g : red changes a line/" <A >B &&
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
rm -f A M &&
git update-index --add --remove A B M N &&
git commit -m "red renames A->B, M->N" &&
git checkout blue &&
sed -e "/^g /s/.*/g : blue changes a line/" <A >C &&
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
rm -f A M &&
git update-index --add --remove A C M N &&
git commit -m "blue renames A->C, M->N" &&
git checkout change &&
sed -e "/^g /s/.*/g : changed line/" <A >A+ &&
mv A+ A &&
git commit -q -a -m "changed" &&
git checkout change+rename &&
sed -e "/^g /s/.*/g : changed line/" <A >B &&
rm A &&
git update-index --add B &&
git commit -q -a -m "changed and renamed" &&
git checkout master
' '
cat >A <<\EOF &&
a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
c cccccccccccccccccccccccccccccccccccccccccccccccc
d dddddddddddddddddddddddddddddddddddddddddddddddd
e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
f ffffffffffffffffffffffffffffffffffffffffffffffff
g gggggggggggggggggggggggggggggggggggggggggggggggg
h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
l llllllllllllllllllllllllllllllllllllllllllllllll
m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
o oooooooooooooooooooooooooooooooooooooooooooooooo
EOF
cat >M <<\EOF &&
A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
EOF
git add A M &&
git commit -m "initial has A and M" &&
git branch white &&
git branch red &&
git branch blue &&
git branch yellow &&
git branch change &&
git branch change+rename &&
sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
mv A+ A &&
git commit -a -m "master updates A" &&
git checkout yellow &&
rm -f M &&
git commit -a -m "yellow removes M" &&
git checkout white &&
sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
rm -f A M &&
git update-index --add --remove A B M N &&
git commit -m "white renames A->B, M->N" &&
git checkout red &&
sed -e "/^g /s/.*/g : red changes a line/" <A >B &&
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
rm -f A M &&
git update-index --add --remove A B M N &&
git commit -m "red renames A->B, M->N" &&
git checkout blue &&
sed -e "/^g /s/.*/g : blue changes a line/" <A >C &&
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
rm -f A M &&
git update-index --add --remove A C M N &&
git commit -m "blue renames A->C, M->N" &&
git checkout change &&
sed -e "/^g /s/.*/g : changed line/" <A >A+ &&
mv A+ A &&
git commit -q -a -m "changed" &&
git checkout change+rename &&
sed -e "/^g /s/.*/g : changed line/" <A >B &&
rm A &&
git update-index --add B &&
git commit -q -a -m "changed and renamed" &&
git checkout master'
test_expect_success 'pull renaming branch into unrenaming one' \ test_expect_success 'pull renaming branch into unrenaming one' \
' '
@ -242,12 +242,23 @@ test_expect_success 'merge of identical changes in a renamed file' '
rm -f A M N && rm -f A M N &&
git reset --hard && git reset --hard &&
git checkout change+rename && git checkout change+rename &&
test-tool chmtime =31337 B &&
test-tool chmtime --get B >old-mtime &&
GIT_MERGE_VERBOSITY=3 git merge change >out && GIT_MERGE_VERBOSITY=3 git merge change >out &&
test_i18ngrep "^Skipped B" out &&
test-tool chmtime --get B >new-mtime &&
test_cmp old-mtime new-mtime &&
git reset --hard HEAD^ && git reset --hard HEAD^ &&
git checkout change && git checkout change &&
test-tool chmtime =-1 M &&
test-tool chmtime --get M >old-mtime &&
GIT_MERGE_VERBOSITY=3 git merge change+rename >out && GIT_MERGE_VERBOSITY=3 git merge change+rename >out &&
test_i18ngrep ! "^Skipped B" out
test-tool chmtime --get B >new-mtime &&
test $(cat old-mtime) -lt $(cat new-mtime)
' '
test_expect_success 'setup for rename + d/f conflicts' ' test_expect_success 'setup for rename + d/f conflicts' '
@ -288,14 +299,15 @@ test_expect_success 'setup for rename + d/f conflicts' '
git commit -m "Conflicting change" git commit -m "Conflicting change"
' '
printf "1\n2\n3\n4\n5555\n6\n7\n8\n9\n10\n11\n" >expected
test_expect_success 'Rename+D/F conflict; renamed file merges + dir not in way' ' test_expect_success 'Rename+D/F conflict; renamed file merges + dir not in way' '
git reset --hard && git reset --hard &&
git checkout -q renamed-file-has-no-conflicts^0 && git checkout -q renamed-file-has-no-conflicts^0 &&
git merge --strategy=recursive dir-not-in-way && git merge --strategy=recursive dir-not-in-way &&
git diff --quiet && git diff --quiet &&
test -f dir && test_path_is_file dir &&
test_write_lines 1 2 3 4 5555 6 7 8 9 10 11 >expected &&
test_cmp expected dir test_cmp expected dir
' '
@ -315,8 +327,8 @@ test_expect_success 'Rename+D/F conflict; renamed file merges but dir in way' '
test_must_fail git diff --quiet && test_must_fail git diff --quiet &&
test_must_fail git diff --cached --quiet && test_must_fail git diff --cached --quiet &&
test -f dir/file-in-the-way && test_path_is_file dir/file-in-the-way &&
test -f dir~HEAD && test_path_is_file dir~HEAD &&
test_cmp expected dir~HEAD test_cmp expected dir~HEAD
' '
@ -337,29 +349,11 @@ test_expect_success 'Same as previous, but merged other way' '
test_must_fail git diff --quiet && test_must_fail git diff --quiet &&
test_must_fail git diff --cached --quiet && test_must_fail git diff --cached --quiet &&
test -f dir/file-in-the-way && test_path_is_file dir/file-in-the-way &&
test -f dir~renamed-file-has-no-conflicts && test_path_is_file dir~renamed-file-has-no-conflicts &&
test_cmp expected dir~renamed-file-has-no-conflicts test_cmp expected dir~renamed-file-has-no-conflicts
' '
cat >expected <<\EOF &&
1
2
3
4
5
6
7
8
9
10
<<<<<<< HEAD:dir
12
=======
11
>>>>>>> dir-not-in-way:sub/file
EOF
test_expect_success 'Rename+D/F conflict; renamed file cannot merge, dir not in way' ' test_expect_success 'Rename+D/F conflict; renamed file cannot merge, dir not in way' '
git reset --hard && git reset --hard &&
rm -rf dir~* && rm -rf dir~* &&
@ -372,7 +366,24 @@ test_expect_success 'Rename+D/F conflict; renamed file cannot merge, dir not in
test_must_fail git diff --quiet && test_must_fail git diff --quiet &&
test_must_fail git diff --cached --quiet && test_must_fail git diff --cached --quiet &&
test -f dir && test_path_is_file dir &&
cat >expected <<-\EOF &&
1
2
3
4
5
6
7
8
9
10
<<<<<<< HEAD:dir
12
=======
11
>>>>>>> dir-not-in-way:sub/file
EOF
test_cmp expected dir test_cmp expected dir
' '
@ -391,29 +402,11 @@ test_expect_success 'Rename+D/F conflict; renamed file cannot merge and dir in t
test_must_fail git diff --quiet && test_must_fail git diff --quiet &&
test_must_fail git diff --cached --quiet && test_must_fail git diff --cached --quiet &&
test -f dir/file-in-the-way && test_path_is_file dir/file-in-the-way &&
test -f dir~HEAD && test_path_is_file dir~HEAD &&
test_cmp expected dir~HEAD test_cmp expected dir~HEAD
' '
cat >expected <<\EOF &&
1
2
3
4
5
6
7
8
9
10
<<<<<<< HEAD:sub/file
11
=======
12
>>>>>>> renamed-file-has-conflicts:dir
EOF
test_expect_success 'Same as previous, but merged other way' ' test_expect_success 'Same as previous, but merged other way' '
git reset --hard && git reset --hard &&
rm -rf dir~* && rm -rf dir~* &&
@ -427,8 +420,25 @@ test_expect_success 'Same as previous, but merged other way' '
test_must_fail git diff --quiet && test_must_fail git diff --quiet &&
test_must_fail git diff --cached --quiet && test_must_fail git diff --cached --quiet &&
test -f dir/file-in-the-way && test_path_is_file dir/file-in-the-way &&
test -f dir~renamed-file-has-conflicts && test_path_is_file dir~renamed-file-has-conflicts &&
cat >expected <<-\EOF &&
1
2
3
4
5
6
7
8
9
10
<<<<<<< HEAD:sub/file
11
=======
12
>>>>>>> renamed-file-has-conflicts:dir
EOF
test_cmp expected dir~renamed-file-has-conflicts test_cmp expected dir~renamed-file-has-conflicts
' '
@ -464,9 +474,9 @@ test_expect_success 'both rename source and destination involved in D/F conflict
test_must_fail git diff --quiet && test_must_fail git diff --quiet &&
test -f destdir/foo && test_path_is_file destdir/foo &&
test -f one && test_path_is_file one &&
test -f destdir~HEAD && test_path_is_file destdir~HEAD &&
test "stuff" = "$(cat destdir~HEAD)" test "stuff" = "$(cat destdir~HEAD)"
' '
@ -507,9 +517,9 @@ test_expect_success 'pair rename to parent of other (D/F conflicts) w/ untracked
test 4 -eq $(find . | grep -v .git | wc -l) && test 4 -eq $(find . | grep -v .git | wc -l) &&
test -d one && test_path_is_dir one &&
test -f one~rename-two && test_path_is_file one~rename-two &&
test -f two && test_path_is_file two &&
test "other" = $(cat one~rename-two) && test "other" = $(cat one~rename-two) &&
test "stuff" = $(cat two) test "stuff" = $(cat two)
' '
@ -527,8 +537,8 @@ test_expect_success 'pair rename to parent of other (D/F conflicts) w/ clean sta
test 3 -eq $(find . | grep -v .git | wc -l) && test 3 -eq $(find . | grep -v .git | wc -l) &&
test -f one && test_path_is_file one &&
test -f two && test_path_is_file two &&
test "other" = $(cat one) && test "other" = $(cat one) &&
test "stuff" = $(cat two) test "stuff" = $(cat two)
' '
@ -568,11 +578,11 @@ test_expect_success 'check handling of differently renamed file with D/F conflic
test 1 -eq "$(git ls-files -u original | wc -l)" && test 1 -eq "$(git ls-files -u original | wc -l)" &&
test 2 -eq "$(git ls-files -o | wc -l)" && test 2 -eq "$(git ls-files -o | wc -l)" &&
test -f one/file && test_path_is_file one/file &&
test -f two/file && test_path_is_file two/file &&
test -f one~HEAD && test_path_is_file one~HEAD &&
test -f two~second-rename && test_path_is_file two~second-rename &&
! test -f original test_path_is_missing original
' '
test_expect_success 'setup rename one file to two; directories moving out of the way' ' test_expect_success 'setup rename one file to two; directories moving out of the way' '
@ -607,9 +617,9 @@ test_expect_success 'check handling of differently renamed file with D/F conflic
test 1 -eq "$(git ls-files -u original | wc -l)" && test 1 -eq "$(git ls-files -u original | wc -l)" &&
test 0 -eq "$(git ls-files -o | wc -l)" && test 0 -eq "$(git ls-files -o | wc -l)" &&
test -f one && test_path_is_file one &&
test -f two && test_path_is_file two &&
! test -f original test_path_is_missing original
' '
test_expect_success 'setup avoid unnecessary update, normal rename' ' test_expect_success 'setup avoid unnecessary update, normal rename' '
@ -810,48 +820,48 @@ test_expect_success 'setup for use of extended merge markers' '
git commit -mC git commit -mC
' '
cat >expected <<\EOF &&
1
2
3
4
5
6
7
8
<<<<<<< HEAD:renamed_file
9
=======
8.5
>>>>>>> master^0:original_file
EOF
test_expect_success 'merge master into rename has correct extended markers' ' test_expect_success 'merge master into rename has correct extended markers' '
git checkout rename^0 && git checkout rename^0 &&
test_must_fail git merge -s recursive master^0 && test_must_fail git merge -s recursive master^0 &&
cat >expected <<-\EOF &&
1
2
3
4
5
6
7
8
<<<<<<< HEAD:renamed_file
9
=======
8.5
>>>>>>> master^0:original_file
EOF
test_cmp expected renamed_file test_cmp expected renamed_file
' '
cat >expected <<\EOF &&
1
2
3
4
5
6
7
8
<<<<<<< HEAD:original_file
8.5
=======
9
>>>>>>> rename^0:renamed_file
EOF
test_expect_success 'merge rename into master has correct extended markers' ' test_expect_success 'merge rename into master has correct extended markers' '
git reset --hard && git reset --hard &&
git checkout master^0 && git checkout master^0 &&
test_must_fail git merge -s recursive rename^0 && test_must_fail git merge -s recursive rename^0 &&
cat >expected <<-\EOF &&
1
2
3
4
5
6
7
8
<<<<<<< HEAD:original_file
8.5
=======
9
>>>>>>> rename^0:renamed_file
EOF
test_cmp expected renamed_file test_cmp expected renamed_file
' '

View File

@ -3,56 +3,59 @@
test_description='RCS merge replacement: merge-file' test_description='RCS merge replacement: merge-file'
. ./test-lib.sh . ./test-lib.sh
cat > orig.txt << EOF test_expect_success 'setup' '
Dominus regit me, cat >orig.txt <<-\EOF &&
et nihil mihi deerit. Dominus regit me,
In loco pascuae ibi me collocavit, et nihil mihi deerit.
super aquam refectionis educavit me; In loco pascuae ibi me collocavit,
animam meam convertit, super aquam refectionis educavit me;
deduxit me super semitas jusitiae, animam meam convertit,
propter nomen suum. deduxit me super semitas jusitiae,
EOF propter nomen suum.
EOF
cat > new1.txt << EOF cat >new1.txt <<-\EOF &&
Dominus regit me, Dominus regit me,
et nihil mihi deerit. et nihil mihi deerit.
In loco pascuae ibi me collocavit, In loco pascuae ibi me collocavit,
super aquam refectionis educavit me; super aquam refectionis educavit me;
animam meam convertit, animam meam convertit,
deduxit me super semitas jusitiae, deduxit me super semitas jusitiae,
propter nomen suum. propter nomen suum.
Nam et si ambulavero in medio umbrae mortis, Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam tu mecum es: non timebo mala, quoniam tu mecum es:
virga tua et baculus tuus ipsa me consolata sunt. virga tua et baculus tuus ipsa me consolata sunt.
EOF EOF
cat > new2.txt << EOF cat >new2.txt <<-\EOF &&
Dominus regit me, et nihil mihi deerit. Dominus regit me, et nihil mihi deerit.
In loco pascuae ibi me collocavit, In loco pascuae ibi me collocavit,
super aquam refectionis educavit me; super aquam refectionis educavit me;
animam meam convertit, animam meam convertit,
deduxit me super semitas jusitiae, deduxit me super semitas jusitiae,
propter nomen suum. propter nomen suum.
EOF EOF
cat > new3.txt << EOF cat >new3.txt <<-\EOF &&
DOMINUS regit me, DOMINUS regit me,
et nihil mihi deerit. et nihil mihi deerit.
In loco pascuae ibi me collocavit, In loco pascuae ibi me collocavit,
super aquam refectionis educavit me; super aquam refectionis educavit me;
animam meam convertit, animam meam convertit,
deduxit me super semitas jusitiae, deduxit me super semitas jusitiae,
propter nomen suum. propter nomen suum.
EOF EOF
cat > new4.txt << EOF cat >new4.txt <<-\EOF &&
Dominus regit me, et nihil mihi deerit. Dominus regit me, et nihil mihi deerit.
In loco pascuae ibi me collocavit, In loco pascuae ibi me collocavit,
super aquam refectionis educavit me; super aquam refectionis educavit me;
animam meam convertit, animam meam convertit,
deduxit me super semitas jusitiae, deduxit me super semitas jusitiae,
EOF EOF
printf "propter nomen suum." >> new4.txt
printf "propter nomen suum." >>new4.txt
'
test_expect_success 'merge with no changes' ' test_expect_success 'merge with no changes' '
cp orig.txt test.txt && cp orig.txt test.txt &&
@ -60,9 +63,10 @@ test_expect_success 'merge with no changes' '
test_cmp test.txt orig.txt test_cmp test.txt orig.txt
' '
cp new1.txt test.txt test_expect_success "merge without conflict" '
test_expect_success "merge without conflict" \ cp new1.txt test.txt &&
"git merge-file test.txt orig.txt new2.txt" git merge-file test.txt orig.txt new2.txt
'
test_expect_success 'works in subdirectory' ' test_expect_success 'works in subdirectory' '
mkdir dir && mkdir dir &&
@ -73,151 +77,176 @@ test_expect_success 'works in subdirectory' '
test_path_is_missing a.txt test_path_is_missing a.txt
' '
cp new1.txt test.txt test_expect_success "merge without conflict (--quiet)" '
test_expect_success "merge without conflict (--quiet)" \ cp new1.txt test.txt &&
"git merge-file --quiet test.txt orig.txt new2.txt" git merge-file --quiet test.txt orig.txt new2.txt
'
cp new1.txt test2.txt test_expect_failure "merge without conflict (missing LF at EOF)" '
test_expect_failure "merge without conflict (missing LF at EOF)" \ cp new1.txt test2.txt &&
"git merge-file test2.txt orig.txt new4.txt" git merge-file test2.txt orig.txt new4.txt
'
test_expect_failure "merge result added missing LF" \ test_expect_failure "merge result added missing LF" '
"test_cmp test.txt test2.txt" test_cmp test.txt test2.txt
'
cp new4.txt test3.txt test_expect_success "merge without conflict (missing LF at EOF, away from change in the other file)" '
test_expect_success "merge without conflict (missing LF at EOF, away from change in the other file)" \ cp new4.txt test3.txt &&
"git merge-file --quiet test3.txt new2.txt new3.txt" git merge-file --quiet test3.txt new2.txt new3.txt
'
cat > expect.txt << EOF test_expect_success "merge does not add LF away of change" '
DOMINUS regit me, cat >expect.txt <<-\EOF &&
et nihil mihi deerit. DOMINUS regit me,
In loco pascuae ibi me collocavit, et nihil mihi deerit.
super aquam refectionis educavit me; In loco pascuae ibi me collocavit,
animam meam convertit, super aquam refectionis educavit me;
deduxit me super semitas jusitiae, animam meam convertit,
EOF deduxit me super semitas jusitiae,
printf "propter nomen suum." >> expect.txt EOF
printf "propter nomen suum." >>expect.txt &&
test_expect_success "merge does not add LF away of change" \ test_cmp expect.txt test3.txt
"test_cmp expect.txt test3.txt" '
cp test.txt backup.txt test_expect_success "merge with conflicts" '
test_expect_success "merge with conflicts" \ cp test.txt backup.txt &&
"test_must_fail git merge-file test.txt orig.txt new3.txt" test_must_fail git merge-file test.txt orig.txt new3.txt
'
cat > expect.txt << EOF test_expect_success "expected conflict markers" '
<<<<<<< test.txt cat >expect.txt <<-\EOF &&
Dominus regit me, et nihil mihi deerit. <<<<<<< test.txt
======= Dominus regit me, et nihil mihi deerit.
DOMINUS regit me, =======
et nihil mihi deerit. DOMINUS regit me,
>>>>>>> new3.txt et nihil mihi deerit.
In loco pascuae ibi me collocavit, >>>>>>> new3.txt
super aquam refectionis educavit me; In loco pascuae ibi me collocavit,
animam meam convertit, super aquam refectionis educavit me;
deduxit me super semitas jusitiae, animam meam convertit,
propter nomen suum. deduxit me super semitas jusitiae,
Nam et si ambulavero in medio umbrae mortis, propter nomen suum.
non timebo mala, quoniam tu mecum es: Nam et si ambulavero in medio umbrae mortis,
virga tua et baculus tuus ipsa me consolata sunt. non timebo mala, quoniam tu mecum es:
EOF virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_expect_success "expected conflict markers" "test_cmp expect.txt test.txt" test_cmp expect.txt test.txt
'
cp backup.txt test.txt test_expect_success "merge conflicting with --ours" '
cp backup.txt test.txt &&
cat > expect.txt << EOF cat >expect.txt <<-\EOF &&
Dominus regit me, et nihil mihi deerit. Dominus regit me, et nihil mihi deerit.
In loco pascuae ibi me collocavit, In loco pascuae ibi me collocavit,
super aquam refectionis educavit me; super aquam refectionis educavit me;
animam meam convertit, animam meam convertit,
deduxit me super semitas jusitiae, deduxit me super semitas jusitiae,
propter nomen suum. propter nomen suum.
Nam et si ambulavero in medio umbrae mortis, Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam tu mecum es: non timebo mala, quoniam tu mecum es:
virga tua et baculus tuus ipsa me consolata sunt. virga tua et baculus tuus ipsa me consolata sunt.
EOF EOF
test_expect_success "merge conflicting with --ours" \
"git merge-file --ours test.txt orig.txt new3.txt && test_cmp expect.txt test.txt"
cp backup.txt test.txt
cat > expect.txt << EOF git merge-file --ours test.txt orig.txt new3.txt &&
DOMINUS regit me, test_cmp expect.txt test.txt
et nihil mihi deerit. '
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam tu mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_expect_success "merge conflicting with --theirs" \
"git merge-file --theirs test.txt orig.txt new3.txt && test_cmp expect.txt test.txt"
cp backup.txt test.txt
cat > expect.txt << EOF test_expect_success "merge conflicting with --theirs" '
Dominus regit me, et nihil mihi deerit. cp backup.txt test.txt &&
DOMINUS regit me,
et nihil mihi deerit.
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam tu mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_expect_success "merge conflicting with --union" \
"git merge-file --union test.txt orig.txt new3.txt && test_cmp expect.txt test.txt"
cp backup.txt test.txt
test_expect_success "merge with conflicts, using -L" \ cat >expect.txt <<-\EOF &&
"test_must_fail git merge-file -L 1 -L 2 test.txt orig.txt new3.txt" DOMINUS regit me,
et nihil mihi deerit.
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam tu mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
cat > expect.txt << EOF git merge-file --theirs test.txt orig.txt new3.txt &&
<<<<<<< 1 test_cmp expect.txt test.txt
Dominus regit me, et nihil mihi deerit. '
=======
DOMINUS regit me,
et nihil mihi deerit.
>>>>>>> new3.txt
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam tu mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_expect_success "expected conflict markers, with -L" \ test_expect_success "merge conflicting with --union" '
"test_cmp expect.txt test.txt" cp backup.txt test.txt &&
sed "s/ tu / TU /" < new1.txt > new5.txt cat >expect.txt <<-\EOF &&
test_expect_success "conflict in removed tail" \ Dominus regit me, et nihil mihi deerit.
"test_must_fail git merge-file -p orig.txt new1.txt new5.txt > out" DOMINUS regit me,
et nihil mihi deerit.
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam tu mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
cat > expect << EOF git merge-file --union test.txt orig.txt new3.txt &&
Dominus regit me, test_cmp expect.txt test.txt
et nihil mihi deerit. '
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
<<<<<<< orig.txt
=======
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam TU mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
>>>>>>> new5.txt
EOF
test_expect_success "expected conflict markers" "test_cmp expect out" test_expect_success "merge with conflicts, using -L" '
cp backup.txt test.txt &&
test_must_fail git merge-file -L 1 -L 2 test.txt orig.txt new3.txt
'
test_expect_success "expected conflict markers, with -L" '
cat >expect.txt <<-\EOF &&
<<<<<<< 1
Dominus regit me, et nihil mihi deerit.
=======
DOMINUS regit me,
et nihil mihi deerit.
>>>>>>> new3.txt
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam tu mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_cmp expect.txt test.txt
'
test_expect_success "conflict in removed tail" '
sed "s/ tu / TU /" <new1.txt >new5.txt &&
test_must_fail git merge-file -p orig.txt new1.txt new5.txt >out
'
test_expect_success "expected conflict markers" '
cat >expect <<-\EOF &&
Dominus regit me,
et nihil mihi deerit.
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
<<<<<<< orig.txt
=======
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam TU mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
>>>>>>> new5.txt
EOF
test_cmp expect out
'
test_expect_success 'binary files cannot be merged' ' test_expect_success 'binary files cannot be merged' '
test_must_fail git merge-file -p \ test_must_fail git merge-file -p \
@ -225,59 +254,55 @@ test_expect_success 'binary files cannot be merged' '
grep "Cannot merge binary files" merge.err grep "Cannot merge binary files" merge.err
' '
sed -e "s/deerit.\$/deerit;/" -e "s/me;\$/me./" < new5.txt > new6.txt
sed -e "s/deerit.\$/deerit,/" -e "s/me;\$/me,/" < new5.txt > new7.txt
test_expect_success 'MERGE_ZEALOUS simplifies non-conflicts' ' test_expect_success 'MERGE_ZEALOUS simplifies non-conflicts' '
sed -e "s/deerit.\$/deerit;/" -e "s/me;\$/me./" <new5.txt >new6.txt &&
sed -e "s/deerit.\$/deerit,/" -e "s/me;\$/me,/" <new5.txt >new7.txt &&
test_must_fail git merge-file -p new6.txt new5.txt new7.txt > output && test_must_fail git merge-file -p new6.txt new5.txt new7.txt > output &&
test 1 = $(grep ======= < output | wc -l) test 1 = $(grep ======= <output | wc -l)
' '
sed -e 's/deerit./&%%%%/' -e "s/locavit,/locavit;/"< new6.txt | tr '%' '\012' > new8.txt
sed -e 's/deerit./&%%%%/' -e "s/locavit,/locavit --/" < new7.txt | tr '%' '\012' > new9.txt
test_expect_success 'ZEALOUS_ALNUM' ' test_expect_success 'ZEALOUS_ALNUM' '
sed -e "s/deerit./&%%%%/" -e "s/locavit,/locavit;/" <new6.txt | tr % "\012" >new8.txt &&
sed -e "s/deerit./&%%%%/" -e "s/locavit,/locavit --/" <new7.txt | tr % "\012" >new9.txt &&
test_must_fail git merge-file -p \ test_must_fail git merge-file -p \
new8.txt new5.txt new9.txt > merge.out && new8.txt new5.txt new9.txt >merge.out &&
test 1 = $(grep ======= < merge.out | wc -l) test 1 = $(grep ======= <merge.out | wc -l)
' '
cat >expect <<\EOF
Dominus regit me,
<<<<<<< new8.txt
et nihil mihi deerit;
In loco pascuae ibi me collocavit;
super aquam refectionis educavit me.
||||||| new5.txt
et nihil mihi deerit.
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
=======
et nihil mihi deerit,
In loco pascuae ibi me collocavit --
super aquam refectionis educavit me,
>>>>>>> new9.txt
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam TU mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_expect_success '"diff3 -m" style output (1)' ' test_expect_success '"diff3 -m" style output (1)' '
cat >expect <<-\EOF &&
Dominus regit me,
<<<<<<< new8.txt
et nihil mihi deerit;
In loco pascuae ibi me collocavit;
super aquam refectionis educavit me.
||||||| new5.txt
et nihil mihi deerit.
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
=======
et nihil mihi deerit,
In loco pascuae ibi me collocavit --
super aquam refectionis educavit me,
>>>>>>> new9.txt
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam TU mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_must_fail git merge-file -p --diff3 \ test_must_fail git merge-file -p --diff3 \
new8.txt new5.txt new9.txt >actual && new8.txt new5.txt new9.txt >actual &&
test_cmp expect actual test_cmp expect actual
@ -290,61 +315,64 @@ test_expect_success '"diff3 -m" style output (2)' '
test_cmp expect actual test_cmp expect actual
' '
cat >expect <<\EOF
Dominus regit me,
<<<<<<<<<< new8.txt
et nihil mihi deerit;
In loco pascuae ibi me collocavit;
super aquam refectionis educavit me.
|||||||||| new5.txt
et nihil mihi deerit.
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
==========
et nihil mihi deerit,
In loco pascuae ibi me collocavit --
super aquam refectionis educavit me,
>>>>>>>>>> new9.txt
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam TU mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_expect_success 'marker size' ' test_expect_success 'marker size' '
cat >expect <<-\EOF &&
Dominus regit me,
<<<<<<<<<< new8.txt
et nihil mihi deerit;
In loco pascuae ibi me collocavit;
super aquam refectionis educavit me.
|||||||||| new5.txt
et nihil mihi deerit.
In loco pascuae ibi me collocavit,
super aquam refectionis educavit me;
==========
et nihil mihi deerit,
In loco pascuae ibi me collocavit --
super aquam refectionis educavit me,
>>>>>>>>>> new9.txt
animam meam convertit,
deduxit me super semitas jusitiae,
propter nomen suum.
Nam et si ambulavero in medio umbrae mortis,
non timebo mala, quoniam TU mecum es:
virga tua et baculus tuus ipsa me consolata sunt.
EOF
test_must_fail git merge-file -p --marker-size=10 \ test_must_fail git merge-file -p --marker-size=10 \
new8.txt new5.txt new9.txt >actual && new8.txt new5.txt new9.txt >actual &&
test_cmp expect actual test_cmp expect actual
' '
printf "line1\nline2\nline3" >nolf-orig.txt test_expect_success 'conflict at EOF without LF resolved by --ours' '
printf "line1\nline2\nline3x" >nolf-diff1.txt printf "line1\nline2\nline3" >nolf-orig.txt &&
printf "line1\nline2\nline3y" >nolf-diff2.txt printf "line1\nline2\nline3x" >nolf-diff1.txt &&
printf "line1\nline2\nline3y" >nolf-diff2.txt &&
test_expect_success 'conflict at EOF without LF resolved by --ours' \ git merge-file -p --ours nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt &&
'git merge-file -p --ours nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt && printf "line1\nline2\nline3x" >expect.txt &&
printf "line1\nline2\nline3x" >expect.txt && test_cmp expect.txt output.txt
test_cmp expect.txt output.txt' '
test_expect_success 'conflict at EOF without LF resolved by --theirs' \ test_expect_success 'conflict at EOF without LF resolved by --theirs' '
'git merge-file -p --theirs nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt && git merge-file -p --theirs nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt &&
printf "line1\nline2\nline3y" >expect.txt && printf "line1\nline2\nline3y" >expect.txt &&
test_cmp expect.txt output.txt' test_cmp expect.txt output.txt
'
test_expect_success 'conflict at EOF without LF resolved by --union' \ test_expect_success 'conflict at EOF without LF resolved by --union' '
'git merge-file -p --union nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt && git merge-file -p --union nolf-diff1.txt nolf-orig.txt nolf-diff2.txt >output.txt &&
printf "line1\nline2\nline3x\nline3y" >expect.txt && printf "line1\nline2\nline3x\nline3y" >expect.txt &&
test_cmp expect.txt output.txt' test_cmp expect.txt output.txt
'
test_expect_success 'conflict sections match existing line endings' ' test_expect_success 'conflict sections match existing line endings' '
printf "1\\r\\n2\\r\\n3" >crlf-orig.txt && printf "1\\r\\n2\\r\\n3" >crlf-orig.txt &&

View File

@ -32,7 +32,29 @@ test_expect_success setup '
test_tick && test_tick &&
git commit -m Side && git commit -m Side &&
git tag anchor git tag anchor &&
cat >./custom-merge <<-\EOF &&
#!/bin/sh
orig="$1" ours="$2" theirs="$3" exit="$4" path=$5
(
echo "orig is $orig"
echo "ours is $ours"
echo "theirs is $theirs"
echo "path is $path"
echo "=== orig ==="
cat "$orig"
echo "=== ours ==="
cat "$ours"
echo "=== theirs ==="
cat "$theirs"
) >"$ours+"
cat "$ours+" >"$ours"
rm -f "$ours+"
exit "$exit"
EOF
chmod +x ./custom-merge
' '
test_expect_success merge ' test_expect_success merge '
@ -82,28 +104,6 @@ test_expect_success 'retry the merge with longer context' '
grep "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" actual grep "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<" actual
' '
cat >./custom-merge <<\EOF
#!/bin/sh
orig="$1" ours="$2" theirs="$3" exit="$4" path=$5
(
echo "orig is $orig"
echo "ours is $ours"
echo "theirs is $theirs"
echo "path is $path"
echo "=== orig ==="
cat "$orig"
echo "=== ours ==="
cat "$ours"
echo "=== theirs ==="
cat "$theirs"
) >"$ours+"
cat "$ours+" >"$ours"
rm -f "$ours+"
exit "$exit"
EOF
chmod +x ./custom-merge
test_expect_success 'custom merge backend' ' test_expect_success 'custom merge backend' '
echo "* merge=union" >.gitattributes && echo "* merge=union" >.gitattributes &&

View File

@ -3,74 +3,73 @@
test_description='Merge-recursive merging renames' test_description='Merge-recursive merging renames'
. ./test-lib.sh . ./test-lib.sh
test_expect_success setup \ test_expect_success 'setup' '
cat >A <<-\EOF &&
a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
c cccccccccccccccccccccccccccccccccccccccccccccccc
d dddddddddddddddddddddddddddddddddddddddddddddddd
e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
f ffffffffffffffffffffffffffffffffffffffffffffffff
g gggggggggggggggggggggggggggggggggggggggggggggggg
h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
l llllllllllllllllllllllllllllllllllllllllllllllll
m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
o oooooooooooooooooooooooooooooooooooooooooooooooo
EOF
cat >M <<-\EOF &&
A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
EOF
git add A M &&
git commit -m "initial has A and M" &&
git branch white &&
git branch red &&
git branch blue &&
git checkout white &&
sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
rm -f A M &&
git update-index --add --remove A B M N &&
git commit -m "white renames A->B, M->N" &&
git checkout red &&
echo created by red >R &&
git update-index --add R &&
git commit -m "red creates R" &&
git checkout blue &&
sed -e "/^o /s/.*/g : blue changes a line/" <A >B &&
rm -f A &&
mv B A &&
git update-index A &&
git commit -m "blue modify A" &&
git checkout master
' '
cat >A <<\EOF &&
a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
c cccccccccccccccccccccccccccccccccccccccccccccccc
d dddddddddddddddddddddddddddddddddddddddddddddddd
e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
f ffffffffffffffffffffffffffffffffffffffffffffffff
g gggggggggggggggggggggggggggggggggggggggggggggggg
h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
l llllllllllllllllllllllllllllllllllllllllllllllll
m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
o oooooooooooooooooooooooooooooooooooooooooooooooo
EOF
cat >M <<\EOF &&
A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
EOF
git add A M &&
git commit -m "initial has A and M" &&
git branch white &&
git branch red &&
git branch blue &&
git checkout white &&
sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
rm -f A M &&
git update-index --add --remove A B M N &&
git commit -m "white renames A->B, M->N" &&
git checkout red &&
echo created by red >R &&
git update-index --add R &&
git commit -m "red creates R" &&
git checkout blue &&
sed -e "/^o /s/.*/g : blue changes a line/" <A >B &&
rm -f A &&
mv B A &&
git update-index A &&
git commit -m "blue modify A" &&
git checkout master'
# This test broke in 65ac6e9c3f47807cb603af07a6a9e1a43bc119ae # This test broke in 65ac6e9c3f47807cb603af07a6a9e1a43bc119ae
test_expect_success 'merge white into red (A->B,M->N)' \ test_expect_success 'merge white into red (A->B,M->N)' '
'
git checkout -b red-white red && git checkout -b red-white red &&
git merge white && git merge white &&
git write-tree && git write-tree &&
@ -82,8 +81,7 @@ test_expect_success 'merge white into red (A->B,M->N)' \
' '
# This test broke in 8371234ecaaf6e14fe3f2082a855eff1bbd79ae9 # This test broke in 8371234ecaaf6e14fe3f2082a855eff1bbd79ae9
test_expect_success 'merge blue into white (A->B, mod A, A untracked)' \ test_expect_success 'merge blue into white (A->B, mod A, A untracked)' '
'
git checkout -b white-blue white && git checkout -b white-blue white &&
echo dirty >A && echo dirty >A &&
git merge blue && git merge blue &&

View File

@ -31,19 +31,19 @@ test_expect_success 'a/b-2/c/d is kept when clobbering symlink b' '
git rm --cached a/b && git rm --cached a/b &&
git commit -m "untracked symlink remains" && git commit -m "untracked symlink remains" &&
git checkout -f start^0 && git checkout -f start^0 &&
test -f a/b-2/c/d test_path_is_file a/b-2/c/d
' '
test_expect_success 'checkout should not have deleted a/b-2/c/d' ' test_expect_success 'checkout should not have deleted a/b-2/c/d' '
git checkout HEAD^0 && git checkout HEAD^0 &&
git reset --hard master && git reset --hard master &&
git checkout start^0 && git checkout start^0 &&
test -f a/b-2/c/d test_path_is_file a/b-2/c/d
' '
test_expect_success 'setup for merge test' ' test_expect_success 'setup for merge test' '
git reset --hard && git reset --hard &&
test -f a/b-2/c/d && test_path_is_file a/b-2/c/d &&
echo x > a/x && echo x > a/x &&
git add a/x && git add a/x &&
git commit -m x && git commit -m x &&
@ -54,7 +54,7 @@ test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolv
git reset --hard && git reset --hard &&
git checkout baseline^0 && git checkout baseline^0 &&
git merge -s resolve master && git merge -s resolve master &&
test -f a/b-2/c/d test_path_is_file a/b-2/c/d
' '
test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test_expect_success SYMLINKS 'a/b was resolved as symlink' '
@ -65,7 +65,7 @@ test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recurs
git reset --hard && git reset --hard &&
git checkout baseline^0 && git checkout baseline^0 &&
git merge -s recursive master && git merge -s recursive master &&
test -f a/b-2/c/d test_path_is_file a/b-2/c/d
' '
test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test_expect_success SYMLINKS 'a/b was resolved as symlink' '
@ -76,7 +76,7 @@ test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolv
git reset --hard && git reset --hard &&
git checkout master^0 && git checkout master^0 &&
git merge -s resolve baseline^0 && git merge -s resolve baseline^0 &&
test -f a/b-2/c/d test_path_is_file a/b-2/c/d
' '
test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test_expect_success SYMLINKS 'a/b was resolved as symlink' '
@ -87,7 +87,7 @@ test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recurs
git reset --hard && git reset --hard &&
git checkout master^0 && git checkout master^0 &&
git merge -s recursive baseline^0 && git merge -s recursive baseline^0 &&
test -f a/b-2/c/d test_path_is_file a/b-2/c/d
' '
test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test_expect_success SYMLINKS 'a/b was resolved as symlink' '
@ -99,8 +99,8 @@ test_expect_failure 'do not lose untracked in merge (resolve)' '
git checkout baseline^0 && git checkout baseline^0 &&
>a/b/c/e && >a/b/c/e &&
test_must_fail git merge -s resolve master && test_must_fail git merge -s resolve master &&
test -f a/b/c/e && test_path_is_file a/b/c/e &&
test -f a/b-2/c/d test_path_is_file a/b-2/c/d
' '
test_expect_success 'do not lose untracked in merge (recursive)' ' test_expect_success 'do not lose untracked in merge (recursive)' '
@ -108,8 +108,8 @@ test_expect_success 'do not lose untracked in merge (recursive)' '
git checkout baseline^0 && git checkout baseline^0 &&
>a/b/c/e && >a/b/c/e &&
test_must_fail git merge -s recursive master && test_must_fail git merge -s recursive master &&
test -f a/b/c/e && test_path_is_file a/b/c/e &&
test -f a/b-2/c/d test_path_is_file a/b-2/c/d
' '
test_expect_success 'do not lose modifications in merge (resolve)' ' test_expect_success 'do not lose modifications in merge (resolve)' '
@ -140,7 +140,7 @@ test_expect_success 'merge should not have D/F conflicts (resolve)' '
git reset --hard && git reset --hard &&
git checkout baseline^0 && git checkout baseline^0 &&
git merge -s resolve test2 && git merge -s resolve test2 &&
test -f a/b/c/d test_path_is_file a/b/c/d
' '
test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' ' test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
@ -151,7 +151,7 @@ test_expect_success 'merge should not have D/F conflicts (recursive)' '
git reset --hard && git reset --hard &&
git checkout baseline^0 && git checkout baseline^0 &&
git merge -s recursive test2 && git merge -s recursive test2 &&
test -f a/b/c/d test_path_is_file a/b/c/d
' '
test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' ' test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
@ -162,7 +162,7 @@ test_expect_success 'merge should not have F/D conflicts (recursive)' '
git reset --hard && git reset --hard &&
git checkout -b foo test2 && git checkout -b foo test2 &&
git merge -s recursive baseline^0 && git merge -s recursive baseline^0 &&
test -f a/b/c/d test_path_is_file a/b/c/d
' '
test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' ' test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '

View File

@ -71,16 +71,16 @@ test_expect_success '1a-L: Modify(A)/Modify(B), change on B subset of A' '
git checkout A^0 && git checkout A^0 &&
test-tool chmtime =31337 b && test-tool chmtime =-1 b &&
test-tool chmtime -v +0 b >expected-mtime && test-tool chmtime --get b >old-mtime &&
GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err &&
test_i18ngrep "Skipped b" out &&
test_must_be_empty err && test_must_be_empty err &&
test-tool chmtime -v +0 b >actual-mtime && # Make sure b was NOT updated
test_cmp expected-mtime actual-mtime && test-tool chmtime --get b >new-mtime &&
test_cmp old-mtime new-mtime &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 1 index_files && test_line_count = 1 index_files &&
@ -102,9 +102,14 @@ test_expect_success '1a-R: Modify(A)/Modify(B), change on B subset of A' '
git checkout B^0 && git checkout B^0 &&
test-tool chmtime =-1 b &&
test-tool chmtime --get b >old-mtime &&
GIT_MERGE_VERBOSITY=3 git merge -s recursive A^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git merge -s recursive A^0 >out 2>err &&
test_i18ngrep "Auto-merging b" out && # Make sure b WAS updated
test-tool chmtime --get b >new-mtime &&
test $(cat old-mtime) -lt $(cat new-mtime) &&
test_must_be_empty err && test_must_be_empty err &&
git ls-files -s >index_files && git ls-files -s >index_files &&
@ -165,10 +170,10 @@ test_expect_success '2a-L: Modify/rename, merge into modify side' '
git checkout A^0 && git checkout A^0 &&
test_path_is_missing c &&
GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err &&
test_i18ngrep ! "Skipped c" out && test_path_is_file c &&
test_must_be_empty err &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 1 index_files && test_line_count = 1 index_files &&
@ -193,9 +198,14 @@ test_expect_success '2a-R: Modify/rename, merge into rename side' '
git checkout B^0 && git checkout B^0 &&
test-tool chmtime =-1 c &&
test-tool chmtime --get c >old-mtime &&
GIT_MERGE_VERBOSITY=3 git merge -s recursive A^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git merge -s recursive A^0 >out 2>err &&
test_i18ngrep ! "Skipped c" out && # Make sure c WAS updated
test-tool chmtime --get c >new-mtime &&
test $(cat old-mtime) -lt $(cat new-mtime) &&
test_must_be_empty err && test_must_be_empty err &&
git ls-files -s >index_files && git ls-files -s >index_files &&
@ -256,16 +266,15 @@ test_expect_success '2b-L: Rename+Mod(A)/Mod(B), B mods subset of A' '
git checkout A^0 && git checkout A^0 &&
test-tool chmtime =31337 c && test-tool chmtime =-1 c &&
test-tool chmtime -v +0 c >expected-mtime && test-tool chmtime --get c >old-mtime &&
GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err &&
test_i18ngrep "Skipped c" out &&
test_must_be_empty err && test_must_be_empty err &&
test-tool chmtime -v +0 c >actual-mtime && # Make sure c WAS updated
test_cmp expected-mtime actual-mtime && test-tool chmtime --get c >new-mtime &&
test_cmp old-mtime new-mtime &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 1 index_files && test_line_count = 1 index_files &&
@ -290,9 +299,12 @@ test_expect_success '2b-R: Rename+Mod(A)/Mod(B), B mods subset of A' '
git checkout B^0 && git checkout B^0 &&
test_path_is_missing c &&
GIT_MERGE_VERBOSITY=3 git merge -s recursive A^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git merge -s recursive A^0 >out 2>err &&
test_i18ngrep "Auto-merging c" out && # Make sure c now present (and thus was updated)
test_path_is_file c &&
test_must_be_empty err && test_must_be_empty err &&
git ls-files -s >index_files && git ls-files -s >index_files &&
@ -361,13 +373,18 @@ test_expect_success '2c: Modify b & add c VS rename b->c' '
git checkout A^0 && git checkout A^0 &&
test-tool chmtime =-1 c &&
test-tool chmtime --get c >old-mtime &&
GIT_MERGE_VERBOSITY=3 && GIT_MERGE_VERBOSITY=3 &&
export GIT_MERGE_VERBOSITY && export GIT_MERGE_VERBOSITY &&
test_must_fail git merge -s recursive B^0 >out 2>err && test_must_fail git merge -s recursive B^0 >out 2>err &&
test_i18ngrep "CONFLICT (rename/add): Rename b->c" out && test_i18ngrep "CONFLICT (rename/add): Rename b->c" out &&
test_i18ngrep ! "Skipped c" out && test_must_be_empty err &&
test_must_be_empty err
# Make sure c WAS updated
test-tool chmtime --get c >new-mtime &&
test $(cat old-mtime) -lt $(cat new-mtime)
# FIXME: rename/add conflicts are horribly broken right now; # FIXME: rename/add conflicts are horribly broken right now;
# when I get back to my patch series fixing it and # when I get back to my patch series fixing it and
@ -460,11 +477,13 @@ test_expect_success '3a-L: bq_1->foo/bq_2 on A, foo/->bar/ on B' '
git checkout A^0 && git checkout A^0 &&
test_path_is_missing bar/bq &&
GIT_MERGE_VERBOSITY=3 git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
test_i18ngrep ! "Skipped bar/bq" out &&
test_must_be_empty err && test_must_be_empty err &&
test_path_is_file bar/bq &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 2 index_files && test_line_count = 2 index_files &&
@ -488,11 +507,13 @@ test_expect_success '3a-R: bq_1->foo/bq_2 on A, foo/->bar/ on B' '
git checkout B^0 && git checkout B^0 &&
test_path_is_missing bar/bq &&
GIT_MERGE_VERBOSITY=3 git -c merge.directoryRenames=true merge -s recursive A^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git -c merge.directoryRenames=true merge -s recursive A^0 >out 2>err &&
test_i18ngrep ! "Skipped bar/bq" out &&
test_must_be_empty err && test_must_be_empty err &&
test_path_is_file bar/bq &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 2 index_files && test_line_count = 2 index_files &&
@ -552,11 +573,13 @@ test_expect_success '3b-L: bq_1->foo/bq_2 on A, foo/->bar/ on B' '
git checkout A^0 && git checkout A^0 &&
test_path_is_missing bar/bq &&
GIT_MERGE_VERBOSITY=3 git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git -c merge.directoryRenames=true merge -s recursive B^0 >out 2>err &&
test_i18ngrep ! "Skipped bar/bq" out &&
test_must_be_empty err && test_must_be_empty err &&
test_path_is_file bar/bq &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 2 index_files && test_line_count = 2 index_files &&
@ -580,11 +603,13 @@ test_expect_success '3b-R: bq_1->foo/bq_2 on A, foo/->bar/ on B' '
git checkout B^0 && git checkout B^0 &&
test_path_is_missing bar/bq &&
GIT_MERGE_VERBOSITY=3 git -c merge.directoryRenames=true merge -s recursive A^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git -c merge.directoryRenames=true merge -s recursive A^0 >out 2>err &&
test_i18ngrep ! "Skipped bar/bq" out &&
test_must_be_empty err && test_must_be_empty err &&
test_path_is_file bar/bq &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 2 index_files && test_line_count = 2 index_files &&
@ -654,16 +679,16 @@ test_expect_failure '4a: Change on A, change on B subset of A, dirty mods presen
git checkout A^0 && git checkout A^0 &&
echo "File rewritten" >b && echo "File rewritten" >b &&
test-tool chmtime =31337 b && test-tool chmtime =-1 b &&
test-tool chmtime -v +0 b >expected-mtime && test-tool chmtime --get b >old-mtime &&
GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err &&
test_i18ngrep "Skipped b" out &&
test_must_be_empty err && test_must_be_empty err &&
test-tool chmtime -v +0 b >actual-mtime && # Make sure b was NOT updated
test_cmp expected-mtime actual-mtime && test-tool chmtime --get b >new-mtime &&
test_cmp old-mtime new-mtime &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 1 index_files && test_line_count = 1 index_files &&
@ -722,16 +747,16 @@ test_expect_success '4b: Rename+Mod(A)/Mod(B), change on B subset of A, dirty mo
git checkout A^0 && git checkout A^0 &&
echo "File rewritten" >c && echo "File rewritten" >c &&
test-tool chmtime =31337 c && test-tool chmtime =-1 c &&
test-tool chmtime -v +0 c >expected-mtime && test-tool chmtime --get c >old-mtime &&
GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err && GIT_MERGE_VERBOSITY=3 git merge -s recursive B^0 >out 2>err &&
test_i18ngrep "Skipped c" out &&
test_must_be_empty err && test_must_be_empty err &&
test-tool chmtime -v +0 c >actual-mtime && # Make sure c was NOT updated
test_cmp expected-mtime actual-mtime && test-tool chmtime --get c >new-mtime &&
test_cmp old-mtime new-mtime &&
git ls-files -s >index_files && git ls-files -s >index_files &&
test_line_count = 1 index_files && test_line_count = 1 index_files &&