{"thread":{"id":"48560","subject":"[PATCH 0/5] Modernize some testcases for merge-recursive corner cases","startedAt":"2018-05-24T07:04:50Z","lastAt":"2018-05-26T00:44:29Z","messageCount":11,"participants":["Elijah Newren","SZEDER Gábor","Junio C Hamano"],"isPatch":true,"patchVersion":1,"patchTotal":5},"messages":[{"id":"348407","messageId":"20180524070439.6367-1-newren@gmail.com","threadId":"48560","inReplyTo":null,"subject":"[PATCH 0/5] Modernize some testcases for merge-recursive corner cases","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2018-05-24T07:04:34Z","receivedAt":"2018-05-24T07:04:50Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"I have about a dozen more testcases I want to add to the testsuite, in\norder to document additional situations that merge-recursive handles\nsuboptimally.  To avoid sending an excessively long series, I am splitting\nthis up.  This series just aims to modernize a pair of testfiles in which\nseveral of the new tests would most naturally belong.  This modernization\nserves two purposes: (1) it makes the existing tests easier to understand,\nand (2) it simplifies adding more tests to these test files.\n\nElijah Newren (5):\n  t6036, t6042: use test_create_repo to keep tests independent\n  t6036, t6042: use test_line_count instead of wc -l\n  t6036, t6042: prefer test_path_is_file, test_path_is_missing\n  t6036, t6042: prefer test_cmp to sequences of test\n  t6036: prefer test_when_finished to manual cleanup in following test\n\n t/t6036-recursive-corner-cases.sh    | 991 +++++++++++++++------------\n t/t6042-merge-rename-corner-cases.sh | 968 ++++++++++++++------------\n 2 files changed, 1098 insertions(+), 861 deletions(-)\n\n-- \n2.17.0.1.gda85003413\n\n"},{"id":"348408","messageId":"20180524070439.6367-2-newren@gmail.com","threadId":"48560","inReplyTo":"20180524070439.6367-1-newren@gmail.com","subject":"[PATCH 1/5] t6036, t6042: use test_create_repo to keep tests independent","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2018-05-24T07:04:35Z","receivedAt":"2018-05-24T07:04:55Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"These tests used pretty strong measures to get a clean slate:\n        git rm -rf . &&\n        git clean -fdqx &&\n        rm -rf .git &&\n        git init &&\nIt's easier, safer (what if a previous test has a bug and accidentally\nchanges into a directory outside the test path?), and allows re-inspecting\ntest setup later if we instead just use test_create_repo to put different\ntests into separate sub-repositories.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\nBest viewed with `git diff -w`...\n\n t/t6036-recursive-corner-cases.sh    | 854 ++++++++++++++------------\n t/t6042-merge-rename-corner-cases.sh | 887 ++++++++++++++-------------\n 2 files changed, 926 insertions(+), 815 deletions(-)\n\ndiff --git a/t/t6036-recursive-corner-cases.sh b/t/t6036-recursive-corner-cases.sh\nindex 18aa88b5c0..cfe6a99771 100755\n--- a/t/t6036-recursive-corner-cases.sh\n+++ b/t/t6036-recursive-corner-cases.sh\n@@ -21,51 +21,60 @@ get_clean_checkout () {\n #\n \n test_expect_success 'setup basic criss-cross + rename with no modifications' '\n-\tten=\"0 1 2 3 4 5 6 7 8 9\" &&\n-\tfor i in $ten\n-\tdo\n-\t\techo line $i in a sample file\n-\tdone >one &&\n-\tfor i in $ten\n-\tdo\n-\t\techo line $i in another sample file\n-\tdone >two &&\n-\tgit add one two &&\n-\ttest_tick && git commit -m initial &&\n-\n-\tgit branch L1 &&\n-\tgit checkout -b R1 &&\n-\tgit mv one three &&\n-\ttest_tick && git commit -m R1 &&\n-\n-\tgit checkout L1 &&\n-\tgit mv two three &&\n-\ttest_tick && git commit -m L1 &&\n-\n-\tgit checkout L1^0 &&\n-\ttest_tick && git merge -s ours R1 &&\n-\tgit tag L2 &&\n-\n-\tgit checkout R1^0 &&\n-\ttest_tick && git merge -s ours L1 &&\n-\tgit tag R2\n+\ttest_create_repo basic-rename &&\n+\t(\n+\t\tcd basic-rename &&\n+\n+\t\tten=\"0 1 2 3 4 5 6 7 8 9\" &&\n+\t\tfor i in $ten\n+\t\tdo\n+\t\t\techo line $i in a sample file\n+\t\tdone >one &&\n+\t\tfor i in $ten\n+\t\tdo\n+\t\t\techo line $i in another sample file\n+\t\tdone >two &&\n+\t\tgit add one two &&\n+\t\ttest_tick && git commit -m initial &&\n+\n+\t\tgit branch L1 &&\n+\t\tgit checkout -b R1 &&\n+\t\tgit mv one three &&\n+\t\ttest_tick && git commit -m R1 &&\n+\n+\t\tgit checkout L1 &&\n+\t\tgit mv two three &&\n+\t\ttest_tick && git commit -m L1 &&\n+\n+\t\tgit checkout L1^0 &&\n+\t\ttest_tick && git merge -s ours R1 &&\n+\t\tgit tag L2 &&\n+\n+\t\tgit checkout R1^0 &&\n+\t\ttest_tick && git merge -s ours L1 &&\n+\t\tgit tag R2\n+\t)\n '\n \n test_expect_success 'merge simple rename+criss-cross with no modifications' '\n-\tgit reset --hard &&\n-\tgit checkout L2^0 &&\n+\t(\n+\t\tcd basic-rename &&\n+\n+\t\tgit reset --hard &&\n+\t\tgit checkout L2^0 &&\n \n-\ttest_must_fail git merge -s recursive R2^0 &&\n+\t\ttest_must_fail git merge -s recursive R2^0 &&\n \n-\ttest 2 = $(git ls-files -s | wc -l) &&\n-\ttest 2 = $(git ls-files -u | wc -l) &&\n-\ttest 2 = $(git ls-files -o | wc -l) &&\n+\t\ttest 2 = $(git ls-files -s | wc -l) &&\n+\t\ttest 2 = $(git ls-files -u | wc -l) &&\n+\t\ttest 2 = $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n-\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n+\t\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n+\t\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n \n-\ttest $(git rev-parse L2:three) = $(git hash-object three~HEAD) &&\n-\ttest $(git rev-parse R2:three) = $(git hash-object three~R2^0)\n+\t\ttest $(git rev-parse L2:three) = $(git hash-object three~HEAD) &&\n+\t\ttest $(git rev-parse R2:three) = $(git hash-object three~R2^0)\n+\t)\n '\n \n #\n@@ -81,58 +90,61 @@ test_expect_success 'merge simple rename+criss-cross with no modifications' '\n #\n \n test_expect_success 'setup criss-cross + rename merges with basic modification' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tten=\"0 1 2 3 4 5 6 7 8 9\" &&\n-\tfor i in $ten\n-\tdo\n-\t\techo line $i in a sample file\n-\tdone >one &&\n-\tfor i in $ten\n-\tdo\n-\t\techo line $i in another sample file\n-\tdone >two &&\n-\tgit add one two &&\n-\ttest_tick && git commit -m initial &&\n-\n-\tgit branch L1 &&\n-\tgit checkout -b R1 &&\n-\tgit mv one three &&\n-\techo more >>two &&\n-\tgit add two &&\n-\ttest_tick && git commit -m R1 &&\n-\n-\tgit checkout L1 &&\n-\tgit mv two three &&\n-\ttest_tick && git commit -m L1 &&\n-\n-\tgit checkout L1^0 &&\n-\ttest_tick && git merge -s ours R1 &&\n-\tgit tag L2 &&\n-\n-\tgit checkout R1^0 &&\n-\ttest_tick && git merge -s ours L1 &&\n-\tgit tag R2\n+\ttest_create_repo rename-modify &&\n+\t(\n+\t\tcd rename-modify &&\n+\n+\t\tten=\"0 1 2 3 4 5 6 7 8 9\" &&\n+\t\tfor i in $ten\n+\t\tdo\n+\t\t\techo line $i in a sample file\n+\t\tdone >one &&\n+\t\tfor i in $ten\n+\t\tdo\n+\t\t\techo line $i in another sample file\n+\t\tdone >two &&\n+\t\tgit add one two &&\n+\t\ttest_tick && git commit -m initial &&\n+\n+\t\tgit branch L1 &&\n+\t\tgit checkout -b R1 &&\n+\t\tgit mv one three &&\n+\t\techo more >>two &&\n+\t\tgit add two &&\n+\t\ttest_tick && git commit -m R1 &&\n+\n+\t\tgit checkout L1 &&\n+\t\tgit mv two three &&\n+\t\ttest_tick && git commit -m L1 &&\n+\n+\t\tgit checkout L1^0 &&\n+\t\ttest_tick && git merge -s ours R1 &&\n+\t\tgit tag L2 &&\n+\n+\t\tgit checkout R1^0 &&\n+\t\ttest_tick && git merge -s ours L1 &&\n+\t\tgit tag R2\n+\t)\n '\n \n test_expect_success 'merge criss-cross + rename merges with basic modification' '\n-\tgit reset --hard &&\n-\tgit checkout L2^0 &&\n+\t(\n+\t\tcd rename-modify &&\n+\n+\t\tgit checkout L2^0 &&\n \n-\ttest_must_fail git merge -s recursive R2^0 &&\n+\t\ttest_must_fail git merge -s recursive R2^0 &&\n \n-\ttest 2 = $(git ls-files -s | wc -l) &&\n-\ttest 2 = $(git ls-files -u | wc -l) &&\n-\ttest 2 = $(git ls-files -o | wc -l) &&\n+\t\ttest 2 = $(git ls-files -s | wc -l) &&\n+\t\ttest 2 = $(git ls-files -u | wc -l) &&\n+\t\ttest 2 = $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n-\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n+\t\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n+\t\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n \n-\ttest $(git rev-parse L2:three) = $(git hash-object three~HEAD) &&\n-\ttest $(git rev-parse R2:three) = $(git hash-object three~R2^0)\n+\t\ttest $(git rev-parse L2:three) = $(git hash-object three~HEAD) &&\n+\t\ttest $(git rev-parse R2:three) = $(git hash-object three~R2^0)\n+\t)\n '\n \n #\n@@ -156,64 +168,67 @@ test_expect_success 'merge criss-cross + rename merges with basic modification'\n #\n \n test_expect_success 'setup differently handled merges of rename/add conflict' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"0\\n1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n\" >a &&\n-\tgit add a &&\n-\ttest_tick && git commit -m A &&\n-\n-\tgit branch B &&\n-\tgit checkout -b C &&\n-\techo 10 >>a &&\n-\techo \"other content\" >>new_a &&\n-\tgit add a new_a &&\n-\ttest_tick && git commit -m C &&\n-\n-\tgit checkout B &&\n-\tgit mv a new_a &&\n-\ttest_tick && git commit -m B &&\n-\n-\tgit checkout B^0 &&\n-\ttest_must_fail git merge C &&\n-\tgit clean -f &&\n-\ttest_tick && git commit -m D &&\n-\tgit tag D &&\n-\n-\tgit checkout C^0 &&\n-\ttest_must_fail git merge B &&\n-\trm new_a~HEAD new_a &&\n-\tprintf \"Incorrectly merged content\" >>new_a &&\n-\tgit add -u &&\n-\ttest_tick && git commit -m E &&\n-\tgit tag E\n+\ttest_create_repo rename-add &&\n+\t(\n+\t\tcd rename-add &&\n+\n+\t\tprintf \"0\\n1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n9\\n\" >a &&\n+\t\tgit add a &&\n+\t\ttest_tick && git commit -m A &&\n+\n+\t\tgit branch B &&\n+\t\tgit checkout -b C &&\n+\t\techo 10 >>a &&\n+\t\techo \"other content\" >>new_a &&\n+\t\tgit add a new_a &&\n+\t\ttest_tick && git commit -m C &&\n+\n+\t\tgit checkout B &&\n+\t\tgit mv a new_a &&\n+\t\ttest_tick && git commit -m B &&\n+\n+\t\tgit checkout B^0 &&\n+\t\ttest_must_fail git merge C &&\n+\t\tgit clean -f &&\n+\t\ttest_tick && git commit -m D &&\n+\t\tgit tag D &&\n+\n+\t\tgit checkout C^0 &&\n+\t\ttest_must_fail git merge B &&\n+\t\trm new_a~HEAD new_a &&\n+\t\tprintf \"Incorrectly merged content\" >>new_a &&\n+\t\tgit add -u &&\n+\t\ttest_tick && git commit -m E &&\n+\t\tgit tag E\n+\t)\n '\n \n test_expect_success 'git detects differently handled merges conflict' '\n-\tgit reset --hard &&\n-\tgit checkout D^0 &&\n-\n-\ttest_must_fail git merge -s recursive E^0 &&\n-\n-\ttest 3 = $(git ls-files -s | wc -l) &&\n-\ttest 3 = $(git ls-files -u | wc -l) &&\n-\ttest 0 = $(git ls-files -o | wc -l) &&\n-\n-\ttest $(git rev-parse :2:new_a) = $(git rev-parse D:new_a) &&\n-\ttest $(git rev-parse :3:new_a) = $(git rev-parse E:new_a) &&\n-\n-\tgit cat-file -p B:new_a >>merged &&\n-\tgit cat-file -p C:new_a >>merge-me &&\n-\t>empty &&\n-\ttest_must_fail git merge-file \\\n-\t\t-L \"Temporary merge branch 2\" \\\n-\t\t-L \"\" \\\n-\t\t-L \"Temporary merge branch 1\" \\\n-\t\tmerged empty merge-me &&\n-\tsed -e \"s/^\\([<=>]\\)/\\1\\1\\1/\" merged >merged-internal &&\n-\ttest $(git rev-parse :1:new_a) = $(git hash-object merged-internal)\n+\t(\n+\t\tcd rename-add &&\n+\n+\t\tgit checkout D^0 &&\n+\n+\t\ttest_must_fail git merge -s recursive E^0 &&\n+\n+\t\ttest 3 = $(git ls-files -s | wc -l) &&\n+\t\ttest 3 = $(git ls-files -u | wc -l) &&\n+\t\ttest 0 = $(git ls-files -o | wc -l) &&\n+\n+\t\ttest $(git rev-parse :2:new_a) = $(git rev-parse D:new_a) &&\n+\t\ttest $(git rev-parse :3:new_a) = $(git rev-parse E:new_a) &&\n+\n+\t\tgit cat-file -p B:new_a >>merged &&\n+\t\tgit cat-file -p C:new_a >>merge-me &&\n+\t\t>empty &&\n+\t\ttest_must_fail git merge-file \\\n+\t\t\t-L \"Temporary merge branch 2\" \\\n+\t\t\t-L \"\" \\\n+\t\t\t-L \"Temporary merge branch 1\" \\\n+\t\t\tmerged empty merge-me &&\n+\t\tsed -e \"s/^\\([<=>]\\)/\\1\\1\\1/\" merged >merged-internal &&\n+\t\ttest $(git rev-parse :1:new_a) = $(git hash-object merged-internal)\n+\t)\n '\n \n #\n@@ -236,67 +251,75 @@ test_expect_success 'git detects differently handled merges conflict' '\n # Merging commits D & E should result in modify/delete conflict.\n \n test_expect_success 'setup criss-cross + modify/delete resolved differently' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\techo A >file &&\n-\tgit add file &&\n-\ttest_tick &&\n-\tgit commit -m A &&\n-\n-\tgit branch B &&\n-\tgit checkout -b C &&\n-\tgit rm file &&\n-\ttest_tick &&\n-\tgit commit -m C &&\n-\n-\tgit checkout B &&\n-\techo B >file &&\n-\tgit add file &&\n-\ttest_tick &&\n-\tgit commit -m B &&\n-\n-\tgit checkout B^0 &&\n-\ttest_must_fail git merge C &&\n-\techo B >file &&\n-\tgit add file &&\n-\ttest_tick &&\n-\tgit commit -m D &&\n-\tgit tag D &&\n-\n-\tgit checkout C^0 &&\n-\ttest_must_fail git merge B &&\n-\tgit rm file &&\n-\ttest_tick &&\n-\tgit commit -m E &&\n-\tgit tag E\n+\ttest_create_repo modify-delete &&\n+\t(\n+\t\tcd modify-delete &&\n+\n+\t\techo A >file &&\n+\t\tgit add file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m A &&\n+\n+\t\tgit branch B &&\n+\t\tgit checkout -b C &&\n+\t\tgit rm file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m C &&\n+\n+\t\tgit checkout B &&\n+\t\techo B >file &&\n+\t\tgit add file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout B^0 &&\n+\t\ttest_must_fail git merge C &&\n+\t\techo B >file &&\n+\t\tgit add file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m D &&\n+\t\tgit tag D &&\n+\n+\t\tgit checkout C^0 &&\n+\t\ttest_must_fail git merge B &&\n+\t\tgit rm file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m E &&\n+\t\tgit tag E\n+\t)\n '\n \n test_expect_success 'git detects conflict merging criss-cross+modify/delete' '\n-\tgit checkout D^0 &&\n+\t(\n+\t\tcd modify-delete &&\n+\n+\t\tgit checkout D^0 &&\n \n-\ttest_must_fail git merge -s recursive E^0 &&\n+\t\ttest_must_fail git merge -s recursive E^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 2 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n \n-\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n-\ttest $(git rev-parse :2:file) = $(git rev-parse B:file)\n+\t\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n+\t\ttest $(git rev-parse :2:file) = $(git rev-parse B:file)\n+\t)\n '\n \n test_expect_success 'git detects conflict merging criss-cross+modify/delete, reverse direction' '\n-\tgit reset --hard &&\n-\tgit checkout E^0 &&\n+\t(\n+\t\tcd modify-delete &&\n+\n+\t\tgit reset --hard &&\n+\t\tgit checkout E^0 &&\n \n-\ttest_must_fail git merge -s recursive D^0 &&\n+\t\ttest_must_fail git merge -s recursive D^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 2 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n \n-\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n-\ttest $(git rev-parse :3:file) = $(git rev-parse B:file)\n+\t\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n+\t\ttest $(git rev-parse :3:file) = $(git rev-parse B:file)\n+\t)\n '\n \n #\n@@ -336,120 +359,136 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev\n #\n \n test_expect_success 'setup differently handled merges of directory/file conflict' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\t>ignore-me &&\n-\tgit add ignore-me &&\n-\ttest_tick &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit branch B &&\n-\tgit checkout -b C &&\n-\tmkdir a &&\n-\techo 10 >a/file &&\n-\tgit add a/file &&\n-\ttest_tick &&\n-\tgit commit -m C &&\n-\n-\tgit checkout B &&\n-\techo 5 >a &&\n-\tgit add a &&\n-\ttest_tick &&\n-\tgit commit -m B &&\n-\n-\tgit checkout B^0 &&\n-\ttest_must_fail git merge C &&\n-\tgit clean -f &&\n-\trm -rf a/ &&\n-\techo 5 >a &&\n-\tgit add a &&\n-\ttest_tick &&\n-\tgit commit -m D &&\n-\tgit tag D &&\n-\n-\tgit checkout C^0 &&\n-\ttest_must_fail git merge B &&\n-\tgit clean -f &&\n-\tgit rm --cached a &&\n-\techo 10 >a/file &&\n-\tgit add a/file &&\n-\ttest_tick &&\n-\tgit commit -m E1 &&\n-\tgit tag E1 &&\n-\n-\tgit checkout C^0 &&\n-\ttest_must_fail git merge B &&\n-\tgit clean -f &&\n-\tgit rm --cached a &&\n-\tprintf \"10\\n11\\n\" >a/file &&\n-\tgit add a/file &&\n-\ttest_tick &&\n-\tgit commit -m E2 &&\n-\tgit tag E2\n+\ttest_create_repo directory-file &&\n+\t(\n+\t\tcd directory-file &&\n+\n+\t\t>ignore-me &&\n+\t\tgit add ignore-me &&\n+\t\ttest_tick &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit branch B &&\n+\t\tgit checkout -b C &&\n+\t\tmkdir a &&\n+\t\techo 10 >a/file &&\n+\t\tgit add a/file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m C &&\n+\n+\t\tgit checkout B &&\n+\t\techo 5 >a &&\n+\t\tgit add a &&\n+\t\ttest_tick &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout B^0 &&\n+\t\ttest_must_fail git merge C &&\n+\t\tgit clean -f &&\n+\t\trm -rf a/ &&\n+\t\techo 5 >a &&\n+\t\tgit add a &&\n+\t\ttest_tick &&\n+\t\tgit commit -m D &&\n+\t\tgit tag D &&\n+\n+\t\tgit checkout C^0 &&\n+\t\ttest_must_fail git merge B &&\n+\t\tgit clean -f &&\n+\t\tgit rm --cached a &&\n+\t\techo 10 >a/file &&\n+\t\tgit add a/file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m E1 &&\n+\t\tgit tag E1 &&\n+\n+\t\tgit checkout C^0 &&\n+\t\ttest_must_fail git merge B &&\n+\t\tgit clean -f &&\n+\t\tgit rm --cached a &&\n+\t\tprintf \"10\\n11\\n\" >a/file &&\n+\t\tgit add a/file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m E2 &&\n+\t\tgit tag E2\n+\t)\n '\n \n test_expect_success 'merge of D & E1 fails but has appropriate contents' '\n-\tget_clean_checkout D^0 &&\n+\t(\n+\t\tcd directory-file &&\n \n-\ttest_must_fail git merge -s recursive E1^0 &&\n+\t\tget_clean_checkout D^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 1 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest_must_fail git merge -s recursive E1^0 &&\n \n-\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n-\ttest $(git rev-parse :2:a) = $(git rev-parse B:a)\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\n+\t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n+\t\ttest $(git rev-parse :2:a) = $(git rev-parse B:a)\n+\t)\n '\n \n test_expect_success 'merge of E1 & D fails but has appropriate contents' '\n-\tget_clean_checkout E1^0 &&\n+\t(\n+\t\tcd directory-file &&\n+\n+\t\tget_clean_checkout E1^0 &&\n \n-\ttest_must_fail git merge -s recursive D^0 &&\n+\t\ttest_must_fail git merge -s recursive D^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 1 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n-\ttest $(git rev-parse :3:a) = $(git rev-parse B:a)\n+\t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n+\t\ttest $(git rev-parse :3:a) = $(git rev-parse B:a)\n+\t)\n '\n \n test_expect_success 'merge of D & E2 fails but has appropriate contents' '\n-\tget_clean_checkout D^0 &&\n+\t(\n+\t\tcd directory-file &&\n+\n+\t\tget_clean_checkout D^0 &&\n \n-\ttest_must_fail git merge -s recursive E2^0 &&\n+\t\ttest_must_fail git merge -s recursive E2^0 &&\n \n-\ttest 4 -eq $(git ls-files -s | wc -l) &&\n-\ttest 3 -eq $(git ls-files -u | wc -l) &&\n-\ttest 1 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse :2:a) = $(git rev-parse B:a) &&\n-\ttest $(git rev-parse :3:a/file) = $(git rev-parse E2:a/file) &&\n-\ttest $(git rev-parse :1:a/file) = $(git rev-parse C:a/file) &&\n-\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n+\t\ttest $(git rev-parse :2:a) = $(git rev-parse B:a) &&\n+\t\ttest $(git rev-parse :3:a/file) = $(git rev-parse E2:a/file) &&\n+\t\ttest $(git rev-parse :1:a/file) = $(git rev-parse C:a/file) &&\n+\t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n \n-\ttest -f a~HEAD\n+\t\ttest -f a~HEAD\n+\t)\n '\n \n test_expect_success 'merge of E2 & D fails but has appropriate contents' '\n-\tget_clean_checkout E2^0 &&\n+\t(\n+\t\tcd directory-file &&\n \n-\ttest_must_fail git merge -s recursive D^0 &&\n+\t\tget_clean_checkout E2^0 &&\n \n-\ttest 4 -eq $(git ls-files -s | wc -l) &&\n-\ttest 3 -eq $(git ls-files -u | wc -l) &&\n-\ttest 1 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest_must_fail git merge -s recursive D^0 &&\n \n-\ttest $(git rev-parse :3:a) = $(git rev-parse B:a) &&\n-\ttest $(git rev-parse :2:a/file) = $(git rev-parse E2:a/file) &&\n-\ttest $(git rev-parse :1:a/file) = $(git rev-parse C:a/file) &&\n-\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n+\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest -f a~D^0\n+\t\ttest $(git rev-parse :3:a) = $(git rev-parse B:a) &&\n+\t\ttest $(git rev-parse :2:a/file) = $(git rev-parse E2:a/file) &&\n+\t\ttest $(git rev-parse :1:a/file) = $(git rev-parse C:a/file) &&\n+\t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n+\n+\t\ttest -f a~D^0\n+\t)\n '\n \n #\n@@ -492,52 +531,55 @@ test_expect_success 'merge of E2 & D fails but has appropriate contents' '\n # but that may cancel out at the final merge stage\".\n \n test_expect_success 'setup rename/rename(1to2)/modify followed by what looks like rename/rename(2to1)/modify' '\n-\tgit reset --hard &&\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n\" >a &&\n-\tgit add a &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a b &&\n-\techo 7 >>b &&\n-\tgit add -u &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a c &&\n-\tgit commit -m C &&\n-\n-\tgit checkout -q B^0 &&\n-\tgit merge --no-commit -s ours C^0 &&\n-\tgit mv b newname &&\n-\tgit commit -m \"Merge commit C^0 into HEAD\" &&\n-\tgit tag D &&\n-\n-\tgit checkout -q C^0 &&\n-\tgit merge --no-commit -s ours B^0 &&\n-\tgit mv c newname &&\n-\tprintf \"7\\n8\\n\" >>newname &&\n-\tgit add -u &&\n-\tgit commit -m \"Merge commit B^0 into HEAD\" &&\n-\tgit tag E\n+\ttest_create_repo rename-squared-squared &&\n+\t(\n+\t\tcd rename-squared-squared &&\n+\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n\" >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a b &&\n+\t\techo 7 >>b &&\n+\t\tgit add -u &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a c &&\n+\t\tgit commit -m C &&\n+\n+\t\tgit checkout -q B^0 &&\n+\t\tgit merge --no-commit -s ours C^0 &&\n+\t\tgit mv b newname &&\n+\t\tgit commit -m \"Merge commit C^0 into HEAD\" &&\n+\t\tgit tag D &&\n+\n+\t\tgit checkout -q C^0 &&\n+\t\tgit merge --no-commit -s ours B^0 &&\n+\t\tgit mv c newname &&\n+\t\tprintf \"7\\n8\\n\" >>newname &&\n+\t\tgit add -u &&\n+\t\tgit commit -m \"Merge commit B^0 into HEAD\" &&\n+\t\tgit tag E\n+\t)\n '\n \n test_expect_success 'handle rename/rename(1to2)/modify followed by what looks like rename/rename(2to1)/modify' '\n-\tgit checkout D^0 &&\n+\t(\n+\t\tcd rename-squared-squared &&\n \n-\tgit merge -s recursive E^0 &&\n+\t\tgit checkout D^0 &&\n \n-\ttest 1 -eq $(git ls-files -s | wc -l) &&\n-\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit merge -s recursive E^0 &&\n \n-\ttest $(git rev-parse HEAD:newname) = $(git rev-parse E:newname)\n+\t\ttest 1 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\n+\t\ttest $(git rev-parse HEAD:newname) = $(git rev-parse E:newname)\n+\t)\n '\n \n #\n@@ -562,59 +604,63 @@ test_expect_success 'handle rename/rename(1to2)/modify followed by what looks li\n # renaming carefully (both in the virtual merge base and later), and getting\n # content merge handled.\n \n-test_expect_success 'setup criss-cross + rename/rename/add + modify/modify' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"lots\\nof\\nwords\\nand\\ncontent\\n\" >a &&\n-\tgit add a &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a b &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a c &&\n-\tprintf \"2\\n3\\n4\\n5\\n6\\n7\\n\" >a &&\n-\tgit add a &&\n-\tgit commit -m C &&\n-\n-\tgit checkout B^0 &&\n-\tgit merge --no-commit -s ours C^0 &&\n-\tgit checkout C -- a c &&\n-\tmv a old_a &&\n-\techo 1 >a &&\n-\tcat old_a >>a &&\n-\trm old_a &&\n-\tgit add -u &&\n-\tgit commit -m \"Merge commit C^0 into HEAD\" &&\n-\tgit tag D &&\n-\n-\tgit checkout C^0 &&\n-\tgit merge --no-commit -s ours B^0 &&\n-\tgit checkout B -- b &&\n-\techo 8 >>a &&\n-\tgit add -u &&\n-\tgit commit -m \"Merge commit B^0 into HEAD\" &&\n-\tgit tag E\n+test_expect_success 'setup criss-cross + rename/rename/add-source + modify/modify' '\n+\ttest_create_repo rename-rename-add-source &&\n+\t(\n+\t\tcd rename-rename-add-source &&\n+\n+\t\tprintf \"lots\\nof\\nwords\\nand\\ncontent\\n\" >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a b &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a c &&\n+\t\tprintf \"2\\n3\\n4\\n5\\n6\\n7\\n\" >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m C &&\n+\n+\t\tgit checkout B^0 &&\n+\t\tgit merge --no-commit -s ours C^0 &&\n+\t\tgit checkout C -- a c &&\n+\t\tmv a old_a &&\n+\t\techo 1 >a &&\n+\t\tcat old_a >>a &&\n+\t\trm old_a &&\n+\t\tgit add -u &&\n+\t\tgit commit -m \"Merge commit C^0 into HEAD\" &&\n+\t\tgit tag D &&\n+\n+\t\tgit checkout C^0 &&\n+\t\tgit merge --no-commit -s ours B^0 &&\n+\t\tgit checkout B -- b &&\n+\t\techo 8 >>a &&\n+\t\tgit add -u &&\n+\t\tgit commit -m \"Merge commit B^0 into HEAD\" &&\n+\t\tgit tag E\n+\t)\n '\n \n test_expect_failure 'detect rename/rename/add-source for virtual merge-base' '\n-\tgit checkout D^0 &&\n+\t(\n+\t\tcd rename-rename-add-source &&\n+\n+\t\tgit checkout D^0 &&\n \n-\tgit merge -s recursive E^0 &&\n+\t\tgit merge -s recursive E^0 &&\n \n-\ttest 3 -eq $(git ls-files -s | wc -l) &&\n-\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n-\ttest $(git rev-parse HEAD:c) = $(git rev-parse A:a) &&\n-\ttest \"$(cat a)\" = \"$(printf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n\")\"\n+\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse HEAD:c) = $(git rev-parse A:a) &&\n+\t\ttest \"$(cat a)\" = \"$(printf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n\")\"\n+\t)\n '\n \n #\n@@ -638,52 +684,56 @@ test_expect_failure 'detect rename/rename/add-source for virtual merge-base' '\n # base of B & C needs to not delete B:c for that to work, though...\n \n test_expect_success 'setup criss-cross+rename/rename/add-dest + simple modify' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\t>a &&\n-\tgit add a &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a b &&\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n\" >c &&\n-\tgit add c &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a c &&\n-\tgit commit -m C &&\n-\n-\tgit checkout B^0 &&\n-\tgit merge --no-commit -s ours C^0 &&\n-\tgit mv b a &&\n-\tgit commit -m \"D is like B but renames b back to a\" &&\n-\tgit tag D &&\n-\n-\tgit checkout B^0 &&\n-\tgit merge --no-commit -s ours C^0 &&\n-\tgit mv b a &&\n-\techo 8 >>c &&\n-\tgit add c &&\n-\tgit commit -m \"E like D but has mod in c\" &&\n-\tgit tag E\n+\ttest_create_repo rename-rename-add-dest &&\n+\t(\n+\t\tcd rename-rename-add-dest &&\n+\n+\t\t>a &&\n+\t\tgit add a &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a b &&\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n\" >c &&\n+\t\tgit add c &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a c &&\n+\t\tgit commit -m C &&\n+\n+\t\tgit checkout B^0 &&\n+\t\tgit merge --no-commit -s ours C^0 &&\n+\t\tgit mv b a &&\n+\t\tgit commit -m \"D is like B but renames b back to a\" &&\n+\t\tgit tag D &&\n+\n+\t\tgit checkout B^0 &&\n+\t\tgit merge --no-commit -s ours C^0 &&\n+\t\tgit mv b a &&\n+\t\techo 8 >>c &&\n+\t\tgit add c &&\n+\t\tgit commit -m \"E like D but has mod in c\" &&\n+\t\tgit tag E\n+\t)\n '\n \n test_expect_success 'virtual merge base handles rename/rename(1to2)/add-dest' '\n-\tgit checkout D^0 &&\n+\t(\n+\t\tcd rename-rename-add-dest &&\n+\n+\t\tgit checkout D^0 &&\n \n-\tgit merge -s recursive E^0 &&\n+\t\tgit merge -s recursive E^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse HEAD:a) = $(git rev-parse A:a) &&\n-\ttest $(git rev-parse HEAD:c) = $(git rev-parse E:c)\n+\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse HEAD:c) = $(git rev-parse E:c)\n+\t)\n '\n \n test_done\ndiff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6042-merge-rename-corner-cases.sh\nindex 411550d2b6..bec0192c3b 100755\n--- a/t/t6042-merge-rename-corner-cases.sh\n+++ b/t/t6042-merge-rename-corner-cases.sh\n@@ -6,31 +6,40 @@ test_description=\"recursive merge corner cases w/ renames but not criss-crosses\"\n . ./test-lib.sh\n \n test_expect_success 'setup rename/delete + untracked file' '\n-\techo \"A pretty inscription\" >ring &&\n-\tgit add ring &&\n-\ttest_tick &&\n-\tgit commit -m beginning &&\n-\n-\tgit branch people &&\n-\tgit checkout -b rename-the-ring &&\n-\tgit mv ring one-ring-to-rule-them-all &&\n-\ttest_tick &&\n-\tgit commit -m fullname &&\n-\n-\tgit checkout people &&\n-\tgit rm ring &&\n-\techo gollum >owner &&\n-\tgit add owner &&\n-\ttest_tick &&\n-\tgit commit -m track-people-instead-of-objects &&\n-\techo \"Myyy PRECIOUSSS\" >ring\n+\ttest_create_repo rename-delete-untracked &&\n+\t(\n+\t\tcd rename-delete-untracked &&\n+\n+\t\techo \"A pretty inscription\" >ring &&\n+\t\tgit add ring &&\n+\t\ttest_tick &&\n+\t\tgit commit -m beginning &&\n+\n+\t\tgit branch people &&\n+\t\tgit checkout -b rename-the-ring &&\n+\t\tgit mv ring one-ring-to-rule-them-all &&\n+\t\ttest_tick &&\n+\t\tgit commit -m fullname &&\n+\n+\t\tgit checkout people &&\n+\t\tgit rm ring &&\n+\t\techo gollum >owner &&\n+\t\tgit add owner &&\n+\t\ttest_tick &&\n+\t\tgit commit -m track-people-instead-of-objects &&\n+\t\techo \"Myyy PRECIOUSSS\" >ring\n+\t)\n '\n \n test_expect_success \"Does git preserve Gollum's precious artifact?\" '\n-\ttest_must_fail git merge -s recursive rename-the-ring &&\n+\t(\n+\t\tcd rename-delete-untracked &&\n \n-\t# Make sure git did not delete an untracked file\n-\ttest -f ring\n+\t\ttest_must_fail git merge -s recursive rename-the-ring &&\n+\n+\t\t# Make sure git did not delete an untracked file\n+\t\ttest -f ring\n+\t)\n '\n \n # Testcase setup for rename/modify/add-source:\n@@ -41,96 +50,116 @@ test_expect_success \"Does git preserve Gollum's precious artifact?\" '\n # We should be able to merge B & C cleanly\n \n test_expect_success 'setup rename/modify/add-source conflict' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n\" >a &&\n-\tgit add a &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\techo 8 >>a &&\n-\tgit add a &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a b &&\n-\techo something completely different >a &&\n-\tgit add a &&\n-\tgit commit -m C\n+\ttest_create_repo rename-modify-add-source &&\n+\t(\n+\t\tcd rename-modify-add-source &&\n+\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n\" >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\techo 8 >>a &&\n+\t\tgit add a &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a b &&\n+\t\techo something completely different >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m C\n+\t)\n '\n \n test_expect_failure 'rename/modify/add-source conflict resolvable' '\n-\tgit checkout B^0 &&\n+\t(\n+\t\tcd rename-modify-add-source &&\n+\n+\t\tgit checkout B^0 &&\n \n-\tgit merge -s recursive C^0 &&\n+\t\tgit merge -s recursive C^0 &&\n \n-\ttest $(git rev-parse B:a) = $(git rev-parse b) &&\n-\ttest $(git rev-parse C:a) = $(git rev-parse a)\n+\t\ttest $(git rev-parse B:a) = $(git rev-parse b) &&\n+\t\ttest $(git rev-parse C:a) = $(git rev-parse a)\n+\t)\n '\n \n test_expect_success 'setup resolvable conflict missed if rename missed' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n\" >a &&\n-\techo foo >b &&\n-\tgit add a b &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a c &&\n-\techo \"Completely different content\" >a &&\n-\tgit add a &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\techo 6 >>a &&\n-\tgit add a &&\n-\tgit commit -m C\n+\ttest_create_repo break-detection-1 &&\n+\t(\n+\t\tcd break-detection-1 &&\n+\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n\" >a &&\n+\t\techo foo >b &&\n+\t\tgit add a b &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a c &&\n+\t\techo \"Completely different content\" >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\techo 6 >>a &&\n+\t\tgit add a &&\n+\t\tgit commit -m C\n+\t)\n '\n \n test_expect_failure 'conflict caused if rename not detected' '\n-\tgit checkout -q C^0 &&\n-\tgit merge -s recursive B^0 &&\n+\t(\n+\t\tcd break-detection-1 &&\n+\n+\t\tgit checkout -q C^0 &&\n+\t\tgit merge -s recursive B^0 &&\n \n-\ttest 3 -eq $(git ls-files -s | wc -l) &&\n-\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest_line_count = 6 c &&\n-\ttest $(git rev-parse HEAD:a) = $(git rev-parse B:a) &&\n-\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:b)\n+\t\ttest_line_count = 6 c &&\n+\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse B:a) &&\n+\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:b)\n+\t)\n '\n \n test_expect_success 'setup conflict resolved wrong if rename missed' '\n-\tgit reset --hard &&\n-\tgit clean -f &&\n-\n-\tgit checkout -b D A &&\n-\techo 7 >>a &&\n-\tgit add a &&\n-\tgit mv a c &&\n-\techo \"Completely different content\" >a &&\n-\tgit add a &&\n-\tgit commit -m D &&\n-\n-\tgit checkout -b E A &&\n-\tgit rm a &&\n-\techo \"Completely different content\" >>a &&\n-\tgit add a &&\n-\tgit commit -m E\n+\ttest_create_repo break-detection-2 &&\n+\t(\n+\t\tcd break-detection-2 &&\n+\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n\" >a &&\n+\t\techo foo >b &&\n+\t\tgit add a b &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b D A &&\n+\t\techo 7 >>a &&\n+\t\tgit add a &&\n+\t\tgit mv a c &&\n+\t\techo \"Completely different content\" >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m D &&\n+\n+\t\tgit checkout -b E A &&\n+\t\tgit rm a &&\n+\t\techo \"Completely different content\" >>a &&\n+\t\tgit add a &&\n+\t\tgit commit -m E\n+\t)\n '\n \n test_expect_failure 'missed conflict if rename not detected' '\n-\tgit checkout -q E^0 &&\n-\ttest_must_fail git merge -s recursive D^0\n+\t(\n+\t\tcd break-detection-2 &&\n+\n+\t\tgit checkout -q E^0 &&\n+\t\ttest_must_fail git merge -s recursive D^0\n+\t)\n '\n \n # Tests for undetected rename/add-source causing a file to erroneously be\n@@ -145,198 +174,210 @@ test_expect_failure 'missed conflict if rename not detected' '\n #   Commit C: rename a->b, add unrelated a\n \n test_expect_success 'setup undetected rename/add-source causes data loss' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n\" >a &&\n-\tgit add a &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a b &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a b &&\n-\techo foobar >a &&\n-\tgit add a &&\n-\tgit commit -m C\n+\ttest_create_repo break-detection-3 &&\n+\t(\n+\t\tcd break-detection-3 &&\n+\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n\" >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a b &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a b &&\n+\t\techo foobar >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m C\n+\t)\n '\n \n test_expect_failure 'detect rename/add-source and preserve all data' '\n-\tgit checkout B^0 &&\n+\t(\n+\t\tcd break-detection-3 &&\n+\n+\t\tgit checkout B^0 &&\n \n-\tgit merge -s recursive C^0 &&\n+\t\tgit merge -s recursive C^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 2 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest -f a &&\n-\ttest -f b &&\n+\t\ttest -f a &&\n+\t\ttest -f b &&\n \n-\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n-\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a)\n+\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a)\n+\t)\n '\n \n test_expect_failure 'detect rename/add-source and preserve all data, merge other way' '\n-\tgit checkout C^0 &&\n+\t(\n+\t\tcd break-detection-3 &&\n \n-\tgit merge -s recursive B^0 &&\n+\t\tgit checkout C^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 2 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit merge -s recursive B^0 &&\n \n-\ttest -f a &&\n-\ttest -f b &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n-\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a)\n+\t\ttest -f a &&\n+\t\ttest -f b &&\n+\n+\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a)\n+\t)\n '\n \n test_expect_success 'setup content merge + rename/directory conflict' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n\" >file &&\n-\tgit add file &&\n-\ttest_tick &&\n-\tgit commit -m base &&\n-\tgit tag base &&\n-\n-\tgit checkout -b right &&\n-\techo 7 >>file &&\n-\tmkdir newfile &&\n-\techo junk >newfile/realfile &&\n-\tgit add file newfile/realfile &&\n-\ttest_tick &&\n-\tgit commit -m right &&\n-\n-\tgit checkout -b left-conflict base &&\n-\techo 8 >>file &&\n-\tgit add file &&\n-\tgit mv file newfile &&\n-\ttest_tick &&\n-\tgit commit -m left &&\n-\n-\tgit checkout -b left-clean base &&\n-\techo 0 >newfile &&\n-\tcat file >>newfile &&\n-\tgit add newfile &&\n-\tgit rm file &&\n-\ttest_tick &&\n-\tgit commit -m left\n+\ttest_create_repo rename-directory-1 &&\n+\t(\n+\t\tcd rename-directory-1 &&\n+\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n\" >file &&\n+\t\tgit add file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m base &&\n+\t\tgit tag base &&\n+\n+\t\tgit checkout -b right &&\n+\t\techo 7 >>file &&\n+\t\tmkdir newfile &&\n+\t\techo junk >newfile/realfile &&\n+\t\tgit add file newfile/realfile &&\n+\t\ttest_tick &&\n+\t\tgit commit -m right &&\n+\n+\t\tgit checkout -b left-conflict base &&\n+\t\techo 8 >>file &&\n+\t\tgit add file &&\n+\t\tgit mv file newfile &&\n+\t\ttest_tick &&\n+\t\tgit commit -m left &&\n+\n+\t\tgit checkout -b left-clean base &&\n+\t\techo 0 >newfile &&\n+\t\tcat file >>newfile &&\n+\t\tgit add newfile &&\n+\t\tgit rm file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m left\n+\t)\n '\n \n test_expect_success 'rename/directory conflict + clean content merge' '\n-\tgit reset --hard &&\n-\tgit reset --hard &&\n-\tgit clean -fdqx &&\n+\t(\n+\t\tcd rename-directory-1 &&\n \n-\tgit checkout left-clean^0 &&\n+\t\tgit checkout left-clean^0 &&\n \n-\ttest_must_fail git merge -s recursive right^0 &&\n+\t\ttest_must_fail git merge -s recursive right^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 1 -eq $(git ls-files -u | wc -l) &&\n-\ttest 1 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n \n-\techo 0 >expect &&\n-\tgit cat-file -p base:file >>expect &&\n-\techo 7 >>expect &&\n-\ttest_cmp expect newfile~HEAD &&\n+\t\techo 0 >expect &&\n+\t\tgit cat-file -p base:file >>expect &&\n+\t\techo 7 >>expect &&\n+\t\ttest_cmp expect newfile~HEAD &&\n \n-\ttest $(git rev-parse :2:newfile) = $(git hash-object expect) &&\n+\t\ttest $(git rev-parse :2:newfile) = $(git hash-object expect) &&\n \n-\ttest -f newfile/realfile &&\n-\ttest -f newfile~HEAD\n+\t\ttest -f newfile/realfile &&\n+\t\ttest -f newfile~HEAD\n+\t)\n '\n \n test_expect_success 'rename/directory conflict + content merge conflict' '\n-\tgit reset --hard &&\n-\tgit reset --hard &&\n-\tgit clean -fdqx &&\n-\n-\tgit checkout left-conflict^0 &&\n-\n-\ttest_must_fail git merge -s recursive right^0 &&\n-\n-\ttest 4 -eq $(git ls-files -s | wc -l) &&\n-\ttest 3 -eq $(git ls-files -u | wc -l) &&\n-\ttest 1 -eq $(git ls-files -o | wc -l) &&\n-\n-\tgit cat-file -p left-conflict:newfile >left &&\n-\tgit cat-file -p base:file    >base &&\n-\tgit cat-file -p right:file   >right &&\n-\ttest_must_fail git merge-file \\\n-\t\t-L \"HEAD:newfile\" \\\n-\t\t-L \"\" \\\n-\t\t-L \"right^0:file\" \\\n-\t\tleft base right &&\n-\ttest_cmp left newfile~HEAD &&\n-\n-\ttest $(git rev-parse :1:newfile) = $(git rev-parse base:file) &&\n-\ttest $(git rev-parse :2:newfile) = $(git rev-parse left-conflict:newfile) &&\n-\ttest $(git rev-parse :3:newfile) = $(git rev-parse right:file) &&\n-\n-\ttest -f newfile/realfile &&\n-\ttest -f newfile~HEAD\n+\t(\n+\t\tcd rename-directory-1 &&\n+\n+\t\tgit reset --hard &&\n+\t\tgit reset --hard &&\n+\t\tgit clean -fdqx &&\n+\n+\t\tgit checkout left-conflict^0 &&\n+\n+\t\ttest_must_fail git merge -s recursive right^0 &&\n+\n+\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n+\n+\t\tgit cat-file -p left-conflict:newfile >left &&\n+\t\tgit cat-file -p base:file    >base &&\n+\t\tgit cat-file -p right:file   >right &&\n+\t\ttest_must_fail git merge-file \\\n+\t\t\t-L \"HEAD:newfile\" \\\n+\t\t\t-L \"\" \\\n+\t\t\t-L \"right^0:file\" \\\n+\t\t\tleft base right &&\n+\t\ttest_cmp left newfile~HEAD &&\n+\n+\t\ttest $(git rev-parse :1:newfile) = $(git rev-parse base:file) &&\n+\t\ttest $(git rev-parse :2:newfile) = $(git rev-parse left-conflict:newfile) &&\n+\t\ttest $(git rev-parse :3:newfile) = $(git rev-parse right:file) &&\n+\n+\t\ttest -f newfile/realfile &&\n+\t\ttest -f newfile~HEAD\n+\t)\n '\n \n test_expect_success 'setup content merge + rename/directory conflict w/ disappearing dir' '\n-\tgit reset --hard &&\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tmkdir sub &&\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n\" >sub/file &&\n-\tgit add sub/file &&\n-\ttest_tick &&\n-\tgit commit -m base &&\n-\tgit tag base &&\n-\n-\tgit checkout -b right &&\n-\techo 7 >>sub/file &&\n-\tgit add sub/file &&\n-\ttest_tick &&\n-\tgit commit -m right &&\n-\n-\tgit checkout -b left base &&\n-\techo 0 >newfile &&\n-\tcat sub/file >>newfile &&\n-\tgit rm sub/file &&\n-\tmv newfile sub &&\n-\tgit add sub &&\n-\ttest_tick &&\n-\tgit commit -m left\n+\ttest_create_repo rename-directory-2 &&\n+\t(\n+\t\tcd rename-directory-2 &&\n+\n+\t\tmkdir sub &&\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n\" >sub/file &&\n+\t\tgit add sub/file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m base &&\n+\t\tgit tag base &&\n+\n+\t\tgit checkout -b right &&\n+\t\techo 7 >>sub/file &&\n+\t\tgit add sub/file &&\n+\t\ttest_tick &&\n+\t\tgit commit -m right &&\n+\n+\t\tgit checkout -b left base &&\n+\t\techo 0 >newfile &&\n+\t\tcat sub/file >>newfile &&\n+\t\tgit rm sub/file &&\n+\t\tmv newfile sub &&\n+\t\tgit add sub &&\n+\t\ttest_tick &&\n+\t\tgit commit -m left\n+\t)\n '\n \n test_expect_success 'disappearing dir in rename/directory conflict handled' '\n-\tgit reset --hard &&\n-\tgit clean -fdqx &&\n+\t(\n+\t\tcd rename-directory-2 &&\n \n-\tgit checkout left^0 &&\n+\t\tgit checkout left^0 &&\n \n-\tgit merge -s recursive right^0 &&\n+\t\tgit merge -s recursive right^0 &&\n \n-\ttest 1 -eq $(git ls-files -s | wc -l) &&\n-\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 1 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\techo 0 >expect &&\n-\tgit cat-file -p base:sub/file >>expect &&\n-\techo 7 >>expect &&\n-\ttest_cmp expect sub &&\n+\t\techo 0 >expect &&\n+\t\tgit cat-file -p base:sub/file >>expect &&\n+\t\techo 7 >>expect &&\n+\t\ttest_cmp expect sub &&\n \n-\ttest -f sub\n+\t\ttest -f sub\n+\t)\n '\n \n # Test for all kinds of things that can go wrong with rename/rename (2to1):\n@@ -352,48 +393,52 @@ test_expect_success 'disappearing dir in rename/directory conflict handled' '\n #   * Nothing else should be present.  Is anything?\n \n test_expect_success 'setup rename/rename (2to1) + modify/modify' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n\" >a &&\n-\tprintf \"5\\n4\\n3\\n2\\n1\\n\" >b &&\n-\tgit add a b &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a c &&\n-\techo 0 >>b &&\n-\tgit add b &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv b c &&\n-\techo 6 >>a &&\n-\tgit add a &&\n-\tgit commit -m C\n+\ttest_create_repo rename-rename-2to1 &&\n+\t(\n+\t\tcd rename-rename-2to1 &&\n+\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n\" >a &&\n+\t\tprintf \"5\\n4\\n3\\n2\\n1\\n\" >b &&\n+\t\tgit add a b &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a c &&\n+\t\techo 0 >>b &&\n+\t\tgit add b &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv b c &&\n+\t\techo 6 >>a &&\n+\t\tgit add a &&\n+\t\tgit commit -m C\n+\t)\n '\n \n test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n-\tgit checkout B^0 &&\n+\t(\n+\t\tcd rename-rename-2to1 &&\n+\n+\t\tgit checkout B^0 &&\n \n-\ttest_must_fail git merge -s recursive C^0 >out &&\n-\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n+\t\ttest_must_fail git merge -s recursive C^0 >out &&\n+\t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 2 -eq $(git ls-files -u | wc -l) &&\n-\ttest 2 -eq $(git ls-files -u c | wc -l) &&\n-\ttest 3 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -u c | wc -l) &&\n+\t\ttest 3 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest ! -f a &&\n-\ttest ! -f b &&\n-\ttest -f c~HEAD &&\n-\ttest -f c~C^0 &&\n+\t\ttest ! -f a &&\n+\t\ttest ! -f b &&\n+\t\ttest -f c~HEAD &&\n+\t\ttest -f c~C^0 &&\n \n-\ttest $(git hash-object c~HEAD) = $(git rev-parse C:a) &&\n-\ttest $(git hash-object c~C^0) = $(git rev-parse B:b)\n+\t\ttest $(git hash-object c~HEAD) = $(git rev-parse C:a) &&\n+\t\ttest $(git hash-object c~C^0) = $(git rev-parse B:b)\n+\t)\n '\n \n # Testcase setup for simple rename/rename (1to2) conflict:\n@@ -401,44 +446,48 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n #   Commit B: rename a->b\n #   Commit C: rename a->c\n test_expect_success 'setup simple rename/rename (1to2) conflict' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\techo stuff >a &&\n-\tgit add a &&\n-\ttest_tick &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a b &&\n-\ttest_tick &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a c &&\n-\ttest_tick &&\n-\tgit commit -m C\n+\ttest_create_repo rename-rename-1to2 &&\n+\t(\n+\t\tcd rename-rename-1to2 &&\n+\n+\t\techo stuff >a &&\n+\t\tgit add a &&\n+\t\ttest_tick &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a b &&\n+\t\ttest_tick &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a c &&\n+\t\ttest_tick &&\n+\t\tgit commit -m C\n+\t)\n '\n \n test_expect_success 'merge has correct working tree contents' '\n-\tgit checkout C^0 &&\n+\t(\n+\t\tcd rename-rename-1to2 &&\n+\n+\t\tgit checkout C^0 &&\n \n-\ttest_must_fail git merge -s recursive B^0 &&\n+\t\ttest_must_fail git merge -s recursive B^0 &&\n \n-\ttest 3 -eq $(git ls-files -s | wc -l) &&\n-\ttest 3 -eq $(git ls-files -u | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n-\ttest $(git rev-parse :3:b) = $(git rev-parse A:a) &&\n-\ttest $(git rev-parse :2:c) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse :3:b) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse :2:c) = $(git rev-parse A:a) &&\n \n-\ttest ! -f a &&\n-\ttest $(git hash-object b) = $(git rev-parse A:a) &&\n-\ttest $(git hash-object c) = $(git rev-parse A:a)\n+\t\ttest ! -f a &&\n+\t\ttest $(git hash-object b) = $(git rev-parse A:a) &&\n+\t\ttest $(git hash-object c) = $(git rev-parse A:a)\n+\t)\n '\n \n # Testcase setup for rename/rename(1to2)/add-source conflict:\n@@ -449,130 +498,142 @@ test_expect_success 'merge has correct working tree contents' '\n # Merging of B & C should NOT be clean; there's a rename/rename conflict\n \n test_expect_success 'setup rename/rename(1to2)/add-source conflict' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n\" >a &&\n-\tgit add a &&\n-\tgit commit -m A &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a b &&\n-\tgit commit -m B &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a c &&\n-\techo something completely different >a &&\n-\tgit add a &&\n-\tgit commit -m C\n+\ttest_create_repo rename-rename-1to2-add-source-1 &&\n+\t(\n+\t\tcd rename-rename-1to2-add-source-1 &&\n+\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n\" >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m A &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a b &&\n+\t\tgit commit -m B &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a c &&\n+\t\techo something completely different >a &&\n+\t\tgit add a &&\n+\t\tgit commit -m C\n+\t)\n '\n \n test_expect_failure 'detect conflict with rename/rename(1to2)/add-source merge' '\n-\tgit checkout B^0 &&\n+\t(\n+\t\tcd rename-rename-1to2-add-source-1 &&\n \n-\ttest_must_fail git merge -s recursive C^0 &&\n+\t\tgit checkout B^0 &&\n \n-\ttest 4 -eq $(git ls-files -s | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest_must_fail git merge -s recursive C^0 &&\n \n-\ttest $(git rev-parse 3:a) = $(git rev-parse C:a) &&\n-\ttest $(git rev-parse 1:a) = $(git rev-parse A:a) &&\n-\ttest $(git rev-parse 2:b) = $(git rev-parse B:b) &&\n-\ttest $(git rev-parse 3:c) = $(git rev-parse C:c) &&\n+\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest -f a &&\n-\ttest -f b &&\n-\ttest -f c\n+\t\ttest $(git rev-parse 3:a) = $(git rev-parse C:a) &&\n+\t\ttest $(git rev-parse 1:a) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse 2:b) = $(git rev-parse B:b) &&\n+\t\ttest $(git rev-parse 3:c) = $(git rev-parse C:c) &&\n+\n+\t\ttest -f a &&\n+\t\ttest -f b &&\n+\t\ttest -f c\n+\t)\n '\n \n test_expect_success 'setup rename/rename(1to2)/add-source resolvable conflict' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\t>a &&\n-\tgit add a &&\n-\ttest_tick &&\n-\tgit commit -m base &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a b &&\n-\ttest_tick &&\n-\tgit commit -m one &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a b &&\n-\techo important-info >a &&\n-\tgit add a &&\n-\ttest_tick &&\n-\tgit commit -m two\n+\ttest_create_repo rename-rename-1to2-add-source-2 &&\n+\t(\n+\t\tcd rename-rename-1to2-add-source-2 &&\n+\n+\t\t>a &&\n+\t\tgit add a &&\n+\t\ttest_tick &&\n+\t\tgit commit -m base &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a b &&\n+\t\ttest_tick &&\n+\t\tgit commit -m one &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a b &&\n+\t\techo important-info >a &&\n+\t\tgit add a &&\n+\t\ttest_tick &&\n+\t\tgit commit -m two\n+\t)\n '\n \n test_expect_failure 'rename/rename/add-source still tracks new a file' '\n-\tgit checkout C^0 &&\n-\tgit merge -s recursive B^0 &&\n+\t(\n+\t\tcd rename-rename-1to2-add-source-2 &&\n+\n+\t\tgit checkout C^0 &&\n+\t\tgit merge -s recursive B^0 &&\n \n-\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n \n-\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a) &&\n-\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a)\n+\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a) &&\n+\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a)\n+\t)\n '\n \n test_expect_success 'setup rename/rename(1to2)/add-dest conflict' '\n-\tgit rm -rf . &&\n-\tgit clean -fdqx &&\n-\trm -rf .git &&\n-\tgit init &&\n-\n-\techo stuff >a &&\n-\tgit add a &&\n-\ttest_tick &&\n-\tgit commit -m base &&\n-\tgit tag A &&\n-\n-\tgit checkout -b B A &&\n-\tgit mv a b &&\n-\techo precious-data >c &&\n-\tgit add c &&\n-\ttest_tick &&\n-\tgit commit -m one &&\n-\n-\tgit checkout -b C A &&\n-\tgit mv a c &&\n-\techo important-info >b &&\n-\tgit add b &&\n-\ttest_tick &&\n-\tgit commit -m two\n+\ttest_create_repo rename-rename-1to2-add-dest &&\n+\t(\n+\t\tcd rename-rename-1to2-add-dest &&\n+\n+\t\techo stuff >a &&\n+\t\tgit add a &&\n+\t\ttest_tick &&\n+\t\tgit commit -m base &&\n+\t\tgit tag A &&\n+\n+\t\tgit checkout -b B A &&\n+\t\tgit mv a b &&\n+\t\techo precious-data >c &&\n+\t\tgit add c &&\n+\t\ttest_tick &&\n+\t\tgit commit -m one &&\n+\n+\t\tgit checkout -b C A &&\n+\t\tgit mv a c &&\n+\t\techo important-info >b &&\n+\t\tgit add b &&\n+\t\ttest_tick &&\n+\t\tgit commit -m two\n+\t)\n '\n \n test_expect_success 'rename/rename/add-dest merge still knows about conflicting file versions' '\n-\tgit checkout C^0 &&\n-\ttest_must_fail git merge -s recursive B^0 &&\n-\n-\ttest 5 -eq $(git ls-files -s | wc -l) &&\n-\ttest 2 -eq $(git ls-files -u b | wc -l) &&\n-\ttest 2 -eq $(git ls-files -u c | wc -l) &&\n-\ttest 4 -eq $(git ls-files -o | wc -l) &&\n-\n-\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n-\ttest $(git rev-parse :2:b) = $(git rev-parse C:b) &&\n-\ttest $(git rev-parse :3:b) = $(git rev-parse B:b) &&\n-\ttest $(git rev-parse :2:c) = $(git rev-parse C:c) &&\n-\ttest $(git rev-parse :3:c) = $(git rev-parse B:c) &&\n-\n-\ttest $(git hash-object c~HEAD) = $(git rev-parse C:c) &&\n-\ttest $(git hash-object c~B\\^0) = $(git rev-parse B:c) &&\n-\ttest $(git hash-object b~HEAD) = $(git rev-parse C:b) &&\n-\ttest $(git hash-object b~B\\^0) = $(git rev-parse B:b) &&\n-\n-\ttest ! -f b &&\n-\ttest ! -f c\n+\t(\n+\t\tcd rename-rename-1to2-add-dest &&\n+\n+\t\tgit checkout C^0 &&\n+\t\ttest_must_fail git merge -s recursive B^0 &&\n+\n+\t\ttest 5 -eq $(git ls-files -s | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -u b | wc -l) &&\n+\t\ttest 2 -eq $(git ls-files -u c | wc -l) &&\n+\t\ttest 4 -eq $(git ls-files -o | wc -l) &&\n+\n+\t\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n+\t\ttest $(git rev-parse :2:b) = $(git rev-parse C:b) &&\n+\t\ttest $(git rev-parse :3:b) = $(git rev-parse B:b) &&\n+\t\ttest $(git rev-parse :2:c) = $(git rev-parse C:c) &&\n+\t\ttest $(git rev-parse :3:c) = $(git rev-parse B:c) &&\n+\n+\t\ttest $(git hash-object c~HEAD) = $(git rev-parse C:c) &&\n+\t\ttest $(git hash-object c~B\\^0) = $(git rev-parse B:c) &&\n+\t\ttest $(git hash-object b~HEAD) = $(git rev-parse C:b) &&\n+\t\ttest $(git hash-object b~B\\^0) = $(git rev-parse B:b) &&\n+\n+\t\ttest ! -f b &&\n+\t\ttest ! -f c\n+\t)\n '\n \n test_done\n-- \n2.17.0.1.gda85003413\n\n"},{"id":"348409","messageId":"20180524070439.6367-3-newren@gmail.com","threadId":"48560","inReplyTo":"20180524070439.6367-1-newren@gmail.com","subject":"[PATCH 2/5] t6036, t6042: use test_line_count instead of wc -l","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2018-05-24T07:04:36Z","receivedAt":"2018-05-24T07:04:57Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"Signed-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6036-recursive-corner-cases.sh    | 102 ++++++++++++++++++---------\n t/t6042-merge-rename-corner-cases.sh |  99 +++++++++++++++++---------\n 2 files changed, 134 insertions(+), 67 deletions(-)\n\ndiff --git a/t/t6036-recursive-corner-cases.sh b/t/t6036-recursive-corner-cases.sh\nindex cfe6a99771..3e659cff28 100755\n--- a/t/t6036-recursive-corner-cases.sh\n+++ b/t/t6036-recursive-corner-cases.sh\n@@ -65,9 +65,12 @@ test_expect_success 'merge simple rename+criss-cross with no modifications' '\n \n \t\ttest_must_fail git merge -s recursive R2^0 &&\n \n-\t\ttest 2 = $(git ls-files -s | wc -l) &&\n-\t\ttest 2 = $(git ls-files -u | wc -l) &&\n-\t\ttest 2 = $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 3 out &&\n \n \t\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n \t\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n@@ -135,9 +138,12 @@ test_expect_success 'merge criss-cross + rename merges with basic modification'\n \n \t\ttest_must_fail git merge -s recursive R2^0 &&\n \n-\t\ttest 2 = $(git ls-files -s | wc -l) &&\n-\t\ttest 2 = $(git ls-files -u | wc -l) &&\n-\t\ttest 2 = $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 3 out &&\n \n \t\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n \t\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n@@ -211,9 +217,12 @@ test_expect_success 'git detects differently handled merges conflict' '\n \n \t\ttest_must_fail git merge -s recursive E^0 &&\n \n-\t\ttest 3 = $(git ls-files -s | wc -l) &&\n-\t\ttest 3 = $(git ls-files -u | wc -l) &&\n-\t\ttest 0 = $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse :2:new_a) = $(git rev-parse D:new_a) &&\n \t\ttest $(git rev-parse :3:new_a) = $(git rev-parse E:new_a) &&\n@@ -297,8 +306,10 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete' '\n \n \t\ttest_must_fail git merge -s recursive E^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 2 out &&\n \n \t\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n \t\ttest $(git rev-parse :2:file) = $(git rev-parse B:file)\n@@ -314,8 +325,10 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev\n \n \t\ttest_must_fail git merge -s recursive D^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 2 out &&\n \n \t\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n \t\ttest $(git rev-parse :3:file) = $(git rev-parse B:file)\n@@ -423,9 +436,12 @@ test_expect_success 'merge of D & E1 fails but has appropriate contents' '\n \n \t\ttest_must_fail git merge -s recursive E1^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 1 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n \t\ttest $(git rev-parse :2:a) = $(git rev-parse B:a)\n@@ -440,9 +456,12 @@ test_expect_success 'merge of E1 & D fails but has appropriate contents' '\n \n \t\ttest_must_fail git merge -s recursive D^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 1 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n \t\ttest $(git rev-parse :3:a) = $(git rev-parse B:a)\n@@ -457,9 +476,12 @@ test_expect_success 'merge of D & E2 fails but has appropriate contents' '\n \n \t\ttest_must_fail git merge -s recursive E2^0 &&\n \n-\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 4 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 2 out &&\n \n \t\ttest $(git rev-parse :2:a) = $(git rev-parse B:a) &&\n \t\ttest $(git rev-parse :3:a/file) = $(git rev-parse E2:a/file) &&\n@@ -478,9 +500,12 @@ test_expect_success 'merge of E2 & D fails but has appropriate contents' '\n \n \t\ttest_must_fail git merge -s recursive D^0 &&\n \n-\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 4 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 2 out &&\n \n \t\ttest $(git rev-parse :3:a) = $(git rev-parse B:a) &&\n \t\ttest $(git rev-parse :2:a/file) = $(git rev-parse E2:a/file) &&\n@@ -574,9 +599,12 @@ test_expect_success 'handle rename/rename(1to2)/modify followed by what looks li\n \n \t\tgit merge -s recursive E^0 &&\n \n-\t\ttest 1 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 1 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 0 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse HEAD:newname) = $(git rev-parse E:newname)\n \t)\n@@ -653,9 +681,12 @@ test_expect_failure 'detect rename/rename/add-source for virtual merge-base' '\n \n \t\tgit merge -s recursive E^0 &&\n \n-\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 0 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n \t\ttest $(git rev-parse HEAD:c) = $(git rev-parse A:a) &&\n@@ -727,9 +758,12 @@ test_expect_success 'virtual merge base handles rename/rename(1to2)/add-dest' '\n \n \t\tgit merge -s recursive E^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 0 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse HEAD:a) = $(git rev-parse A:a) &&\n \t\ttest $(git rev-parse HEAD:c) = $(git rev-parse E:c)\ndiff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6042-merge-rename-corner-cases.sh\nindex bec0192c3b..b76da8fcdf 100755\n--- a/t/t6042-merge-rename-corner-cases.sh\n+++ b/t/t6042-merge-rename-corner-cases.sh\n@@ -116,9 +116,12 @@ test_expect_failure 'conflict caused if rename not detected' '\n \t\tgit checkout -q C^0 &&\n \t\tgit merge -s recursive B^0 &&\n \n-\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 0 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest_line_count = 6 c &&\n \t\ttest $(git rev-parse HEAD:a) = $(git rev-parse B:a) &&\n@@ -203,9 +206,12 @@ test_expect_failure 'detect rename/add-source and preserve all data' '\n \n \t\tgit merge -s recursive C^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest -f a &&\n \t\ttest -f b &&\n@@ -223,9 +229,12 @@ test_expect_failure 'detect rename/add-source and preserve all data, merge other\n \n \t\tgit merge -s recursive B^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest -f a &&\n \t\ttest -f b &&\n@@ -279,9 +288,12 @@ test_expect_success 'rename/directory conflict + clean content merge' '\n \n \t\ttest_must_fail git merge -s recursive right^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 1 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 2 out &&\n \n \t\techo 0 >expect &&\n \t\tgit cat-file -p base:file >>expect &&\n@@ -307,9 +319,12 @@ test_expect_success 'rename/directory conflict + content merge conflict' '\n \n \t\ttest_must_fail git merge -s recursive right^0 &&\n \n-\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 4 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 2 out &&\n \n \t\tgit cat-file -p left-conflict:newfile >left &&\n \t\tgit cat-file -p base:file    >base &&\n@@ -367,9 +382,12 @@ test_expect_success 'disappearing dir in rename/directory conflict handled' '\n \n \t\tgit merge -s recursive right^0 &&\n \n-\t\ttest 1 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 1 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 0 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\techo 0 >expect &&\n \t\tgit cat-file -p base:sub/file >>expect &&\n@@ -426,10 +444,14 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n \t\ttest_must_fail git merge -s recursive C^0 >out &&\n \t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 2 -eq $(git ls-files -u c | wc -l) &&\n-\t\ttest 3 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u c >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 3 out &&\n \n \t\ttest ! -f a &&\n \t\ttest ! -f b &&\n@@ -476,9 +498,12 @@ test_expect_success 'merge has correct working tree contents' '\n \n \t\ttest_must_fail git merge -s recursive B^0 &&\n \n-\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -u >out &&\n+\t\ttest_line_count = 3 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n \t\ttest $(git rev-parse :3:b) = $(git rev-parse A:a) &&\n@@ -527,8 +552,10 @@ test_expect_failure 'detect conflict with rename/rename(1to2)/add-source merge'\n \n \t\ttest_must_fail git merge -s recursive C^0 &&\n \n-\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 4 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse 3:a) = $(git rev-parse C:a) &&\n \t\ttest $(git rev-parse 1:a) = $(git rev-parse A:a) &&\n@@ -573,8 +600,10 @@ test_expect_failure 'rename/rename/add-source still tracks new a file' '\n \t\tgit checkout C^0 &&\n \t\tgit merge -s recursive B^0 &&\n \n-\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 1 out &&\n \n \t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a) &&\n \t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a)\n@@ -615,10 +644,14 @@ test_expect_success 'rename/rename/add-dest merge still knows about conflicting\n \t\tgit checkout C^0 &&\n \t\ttest_must_fail git merge -s recursive B^0 &&\n \n-\t\ttest 5 -eq $(git ls-files -s | wc -l) &&\n-\t\ttest 2 -eq $(git ls-files -u b | wc -l) &&\n-\t\ttest 2 -eq $(git ls-files -u c | wc -l) &&\n-\t\ttest 4 -eq $(git ls-files -o | wc -l) &&\n+\t\tgit ls-files -s >out &&\n+\t\ttest_line_count = 5 out &&\n+\t\tgit ls-files -u b >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -u c >out &&\n+\t\ttest_line_count = 2 out &&\n+\t\tgit ls-files -o >out &&\n+\t\ttest_line_count = 5 out &&\n \n \t\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n \t\ttest $(git rev-parse :2:b) = $(git rev-parse C:b) &&\n-- \n2.17.0.1.gda85003413\n\n"},{"id":"348410","messageId":"20180524070439.6367-5-newren@gmail.com","threadId":"48560","inReplyTo":"20180524070439.6367-1-newren@gmail.com","subject":"[PATCH 4/5] t6036, t6042: prefer test_cmp to sequences of test","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2018-05-24T07:04:38Z","receivedAt":"2018-05-24T07:05:02Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"Signed-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6036-recursive-corner-cases.sh    | 109 +++++++++++++++++----------\n t/t6042-merge-rename-corner-cases.sh |  94 ++++++++++++++---------\n 2 files changed, 130 insertions(+), 73 deletions(-)\n\ndiff --git a/t/t6036-recursive-corner-cases.sh b/t/t6036-recursive-corner-cases.sh\nindex b716155723..e5f167a06e 100755\n--- a/t/t6036-recursive-corner-cases.sh\n+++ b/t/t6036-recursive-corner-cases.sh\n@@ -72,11 +72,14 @@ test_expect_success 'merge simple rename+criss-cross with no modifications' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 3 out &&\n \n-\t\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n-\t\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n-\n-\t\ttest $(git rev-parse L2:three) = $(git hash-object three~HEAD) &&\n-\t\ttest $(git rev-parse R2:three) = $(git hash-object three~R2^0)\n+\t\tgit rev-parse >expect       \\\n+\t\t\tL2:three   R2:three \\\n+\t\t\tL2:three   R2:three &&\n+\t\tgit rev-parse   >actual     \\\n+\t\t\t:2:three   :3:three &&\n+\t\tgit hash-object >>actual    \\\n+\t\t\tthree~HEAD three~R2^0\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -145,11 +148,14 @@ test_expect_success 'merge criss-cross + rename merges with basic modification'\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 3 out &&\n \n-\t\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n-\t\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n-\n-\t\ttest $(git rev-parse L2:three) = $(git hash-object three~HEAD) &&\n-\t\ttest $(git rev-parse R2:three) = $(git hash-object three~R2^0)\n+\t\tgit rev-parse >expect       \\\n+\t\t\tL2:three   R2:three \\\n+\t\t\tL2:three   R2:three &&\n+\t\tgit rev-parse   >actual     \\\n+\t\t\t:2:three   :3:three &&\n+\t\tgit hash-object >>actual    \\\n+\t\t\tthree~HEAD three~R2^0\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -224,19 +230,23 @@ test_expect_success 'git detects differently handled merges conflict' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest $(git rev-parse :2:new_a) = $(git rev-parse D:new_a) &&\n-\t\ttest $(git rev-parse :3:new_a) = $(git rev-parse E:new_a) &&\n+\t\tgit rev-parse >expect       \\\n+\t\t\tD:new_a  E:new_a &&\n+\t\tgit rev-parse   >actual     \\\n+\t\t\t:2:new_a :3:new_a &&\n+\t\ttest_cmp expect actual\n \n-\t\tgit cat-file -p B:new_a >>merged &&\n-\t\tgit cat-file -p C:new_a >>merge-me &&\n+\t\tgit cat-file -p B:new_a >ours &&\n+\t\tgit cat-file -p C:new_a >theirs &&\n \t\t>empty &&\n \t\ttest_must_fail git merge-file \\\n \t\t\t-L \"Temporary merge branch 2\" \\\n \t\t\t-L \"\" \\\n \t\t\t-L \"Temporary merge branch 1\" \\\n-\t\t\tmerged empty merge-me &&\n-\t\tsed -e \"s/^\\([<=>]\\)/\\1\\1\\1/\" merged >merged-internal &&\n-\t\ttest $(git rev-parse :1:new_a) = $(git hash-object merged-internal)\n+\t\t\tours empty theirs &&\n+\t\tsed -e \"s/^\\([<=>]\\)/\\1\\1\\1/\" ours >expect &&\n+\t\tgit cat-file -p :1:new_a >actual &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -311,8 +321,11 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete' '\n \t\tgit ls-files -u >out &&\n \t\ttest_line_count = 2 out &&\n \n-\t\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n-\t\ttest $(git rev-parse :2:file) = $(git rev-parse B:file)\n+\t\tgit rev-parse >expect       \\\n+\t\t\tmaster:file  B:file &&\n+\t\tgit rev-parse   >actual      \\\n+\t\t\t:1:file      :2:file &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -330,8 +343,11 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev\n \t\tgit ls-files -u >out &&\n \t\ttest_line_count = 2 out &&\n \n-\t\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n-\t\ttest $(git rev-parse :3:file) = $(git rev-parse B:file)\n+\t\tgit rev-parse >expect       \\\n+\t\t\tmaster:file  B:file &&\n+\t\tgit rev-parse   >actual      \\\n+\t\t\t:1:file      :3:file &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -443,8 +459,11 @@ test_expect_success 'merge of D & E1 fails but has appropriate contents' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n-\t\ttest $(git rev-parse :2:a) = $(git rev-parse B:a)\n+\t\tgit rev-parse >expect    \\\n+\t\t\tA:ignore-me  B:a &&\n+\t\tgit rev-parse   >actual   \\\n+\t\t\t:0:ignore-me :2:a &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -463,8 +482,11 @@ test_expect_success 'merge of E1 & D fails but has appropriate contents' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n-\t\ttest $(git rev-parse :3:a) = $(git rev-parse B:a)\n+\t\tgit rev-parse >expect    \\\n+\t\t\tA:ignore-me  B:a &&\n+\t\tgit rev-parse   >actual   \\\n+\t\t\t:0:ignore-me :3:a &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -483,10 +505,11 @@ test_expect_success 'merge of D & E2 fails but has appropriate contents' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 2 out &&\n \n-\t\ttest $(git rev-parse :2:a) = $(git rev-parse B:a) &&\n-\t\ttest $(git rev-parse :3:a/file) = $(git rev-parse E2:a/file) &&\n-\t\ttest $(git rev-parse :1:a/file) = $(git rev-parse C:a/file) &&\n-\t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n+\t\tgit rev-parse >expect    \\\n+\t\t\tB:a   E2:a/file  c:a/file   A:ignore-me &&\n+\t\tgit rev-parse   >actual   \\\n+\t\t\t:2:a  :3:a/file  :1:a/file  :0:ignore-me &&\n+\t\ttest_cmp expect actual\n \n \t\ttest_path_is_file a~HEAD\n \t)\n@@ -507,10 +530,11 @@ test_expect_success 'merge of E2 & D fails but has appropriate contents' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 2 out &&\n \n-\t\ttest $(git rev-parse :3:a) = $(git rev-parse B:a) &&\n-\t\ttest $(git rev-parse :2:a/file) = $(git rev-parse E2:a/file) &&\n-\t\ttest $(git rev-parse :1:a/file) = $(git rev-parse C:a/file) &&\n-\t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n+\t\tgit rev-parse >expect    \\\n+\t\t\tB:a   E2:a/file  c:a/file   A:ignore-me &&\n+\t\tgit rev-parse   >actual   \\\n+\t\t\t:3:a  :2:a/file  :1:a/file  :0:ignore-me &&\n+\t\ttest_cmp expect actual\n \n \t\ttest_path_is_file a~D^0\n \t)\n@@ -688,9 +712,15 @@ test_expect_failure 'detect rename/rename/add-source for virtual merge-base' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n-\t\ttest $(git rev-parse HEAD:c) = $(git rev-parse A:a) &&\n-\t\ttest \"$(cat a)\" = \"$(printf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n\")\"\n+\t\tprintf \"1\\n2\\n3\\n4\\n5\\n6\\n7\\n8\\n\" >correct &&\n+\t\tgit rev-parse >expect \\\n+\t\t\tA:a   A:a     \\\n+\t\t\tcorrect       &&\n+\t\tgit rev-parse   >actual  \\\n+\t\t\t:0:b  :0:c       &&\n+\t\tgit hash-object >>actual \\\n+\t\t\ta                &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -765,8 +795,11 @@ test_expect_success 'virtual merge base handles rename/rename(1to2)/add-dest' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse A:a) &&\n-\t\ttest $(git rev-parse HEAD:c) = $(git rev-parse E:c)\n+\t\tgit rev-parse >expect \\\n+\t\t\tA:a   E:c     &&\n+\t\tgit rev-parse   >actual \\\n+\t\t\t:0:a  :0:c      &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \ndiff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6042-merge-rename-corner-cases.sh\nindex 90225b8bcd..1cbd946fc2 100755\n--- a/t/t6042-merge-rename-corner-cases.sh\n+++ b/t/t6042-merge-rename-corner-cases.sh\n@@ -80,8 +80,11 @@ test_expect_failure 'rename/modify/add-source conflict resolvable' '\n \n \t\tgit merge -s recursive C^0 &&\n \n-\t\ttest $(git rev-parse B:a) = $(git rev-parse b) &&\n-\t\ttest $(git rev-parse C:a) = $(git rev-parse a)\n+\t\tgit rev-parse >expect \\\n+\t\t\tB:a   C:a     &&\n+\t\tgit rev-parse >actual \\\n+\t\t\tb     c       &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -124,8 +127,11 @@ test_expect_failure 'conflict caused if rename not detected' '\n \t\ttest_line_count = 1 out &&\n \n \t\ttest_line_count = 6 c &&\n-\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse B:a) &&\n-\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:b)\n+\t\tgit rev-parse >expect \\\n+\t\t\tB:a   A:b     &&\n+\t\tgit rev-parse >actual \\\n+\t\t\t:0:a  :0:b    &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -216,8 +222,11 @@ test_expect_failure 'detect rename/add-source and preserve all data' '\n \t\ttest_path_is_file a &&\n \t\ttest_path_is_file b &&\n \n-\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n-\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a)\n+\t\tgit rev-parse >expect \\\n+\t\t\tA:a   C:a     &&\n+\t\tgit rev-parse >actual \\\n+\t\t\t:0:b  :0:a    &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -239,8 +248,11 @@ test_expect_failure 'detect rename/add-source and preserve all data, merge other\n \t\ttest_path_is_file a &&\n \t\ttest_path_is_file b &&\n \n-\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n-\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a)\n+\t\tgit rev-parse >expect \\\n+\t\t\tA:a   C:a     &&\n+\t\tgit rev-parse >actual \\\n+\t\t\t:0:b  :0:a    &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -336,9 +348,11 @@ test_expect_success 'rename/directory conflict + content merge conflict' '\n \t\t\tleft base right &&\n \t\ttest_cmp left newfile~HEAD &&\n \n-\t\ttest $(git rev-parse :1:newfile) = $(git rev-parse base:file) &&\n-\t\ttest $(git rev-parse :2:newfile) = $(git rev-parse left-conflict:newfile) &&\n-\t\ttest $(git rev-parse :3:newfile) = $(git rev-parse right:file) &&\n+\t\tgit rev-parse >expect                                 \\\n+\t\t\tbase:file   left-conflict:newfile  right:file &&\n+\t\tgit rev-parse >actual                                 \\\n+\t\t\t:1:newfile  :2:newfile             :3:newfile &&\n+\t\ttest_cmp expect actual\n \n \t\ttest_path_is_file newfile/realfile &&\n \t\ttest_path_is_file newfile~HEAD\n@@ -458,8 +472,11 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n \t\ttest_path_is_file c~HEAD &&\n \t\ttest_path_is_file c~C^0 &&\n \n-\t\ttest $(git hash-object c~HEAD) = $(git rev-parse C:a) &&\n-\t\ttest $(git hash-object c~C^0) = $(git rev-parse B:b)\n+\t\tgit rev-parse >expect   \\\n+\t\t\tC:a     B:b     &&\n+\t\tgit hash-object >actual \\\n+\t\t\tc~HEAD  c~C^0   &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -505,13 +522,15 @@ test_expect_success 'merge has correct working tree contents' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n-\t\ttest $(git rev-parse :3:b) = $(git rev-parse A:a) &&\n-\t\ttest $(git rev-parse :2:c) = $(git rev-parse A:a) &&\n-\n \t\ttest_path_is_missing a &&\n-\t\ttest $(git hash-object b) = $(git rev-parse A:a) &&\n-\t\ttest $(git hash-object c) = $(git rev-parse A:a)\n+\t\tgit rev-parse >expect   \\\n+\t\t\tA:a   A:a   A:a \\\n+\t\t\tA:a   A:a       &&\n+\t\tgit rev-parse >actual    \\\n+\t\t\t:1:a  :3:b  :2:c &&\n+\t\tgit hash-object >>actual \\\n+\t\t\tb     c          &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -557,10 +576,11 @@ test_expect_failure 'detect conflict with rename/rename(1to2)/add-source merge'\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest $(git rev-parse 3:a) = $(git rev-parse C:a) &&\n-\t\ttest $(git rev-parse 1:a) = $(git rev-parse A:a) &&\n-\t\ttest $(git rev-parse 2:b) = $(git rev-parse B:b) &&\n-\t\ttest $(git rev-parse 3:c) = $(git rev-parse C:c) &&\n+\t\tgit rev-parse >expect         \\\n+\t\t\tC:a   A:a   B:b   C:C &&\n+\t\tgit rev-parse >actual          \\\n+\t\t\t:3:a  :1:a  :2:b  :3:c &&\n+\t\ttest_cmp expect actual\n \n \t\ttest_path_is_file a &&\n \t\ttest_path_is_file b &&\n@@ -605,8 +625,11 @@ test_expect_failure 'rename/rename/add-source still tracks new a file' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a) &&\n-\t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a)\n+\t\tgit rev-parse >expect \\\n+\t\t\tC:a   A:a     &&\n+\t\tgit rev-parse >actual \\\n+\t\t\t:0:a  :0:b    &&\n+\t\ttest_cmp expect actual\n \t)\n '\n \n@@ -653,16 +676,17 @@ test_expect_success 'rename/rename/add-dest merge still knows about conflicting\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 5 out &&\n \n-\t\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n-\t\ttest $(git rev-parse :2:b) = $(git rev-parse C:b) &&\n-\t\ttest $(git rev-parse :3:b) = $(git rev-parse B:b) &&\n-\t\ttest $(git rev-parse :2:c) = $(git rev-parse C:c) &&\n-\t\ttest $(git rev-parse :3:c) = $(git rev-parse B:c) &&\n-\n-\t\ttest $(git hash-object c~HEAD) = $(git rev-parse C:c) &&\n-\t\ttest $(git hash-object c~B\\^0) = $(git rev-parse B:c) &&\n-\t\ttest $(git hash-object b~HEAD) = $(git rev-parse C:b) &&\n-\t\ttest $(git hash-object b~B\\^0) = $(git rev-parse B:b) &&\n+\t\tgit rev-parse >expect               \\\n+\t\t\tA:a   C:b   B:b   C:c   B:c &&\n+\t\tgit rev-parse >actual                \\\n+\t\t\t:1:a  :2:b  :3:b  :2:c  :3:c &&\n+\t\ttest_cmp expect actual\n+\n+\t\tgit rev-parse >expect               \\\n+\t\t\tC:c     B:c     C:b     B:b &&\n+\t\tgit hash-object >actual                \\\n+\t\t\tc~HEAD  c~B\\^0  b~HEAD  b~B\\^0 &&\n+\t\ttest_cmp expect actual\n \n \t\ttest_path_is_missing b &&\n \t\ttest_path_is_missing c\n-- \n2.17.0.1.gda85003413\n\n"},{"id":"348411","messageId":"20180524070439.6367-4-newren@gmail.com","threadId":"48560","inReplyTo":"20180524070439.6367-1-newren@gmail.com","subject":"[PATCH 3/5] t6036, t6042: prefer test_path_is_file, test_path_is_missing","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2018-05-24T07:04:37Z","receivedAt":"2018-05-24T07:05:03Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"Signed-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6036-recursive-corner-cases.sh    |  4 +--\n t/t6042-merge-rename-corner-cases.sh | 40 ++++++++++++++--------------\n 2 files changed, 22 insertions(+), 22 deletions(-)\n\ndiff --git a/t/t6036-recursive-corner-cases.sh b/t/t6036-recursive-corner-cases.sh\nindex 3e659cff28..b716155723 100755\n--- a/t/t6036-recursive-corner-cases.sh\n+++ b/t/t6036-recursive-corner-cases.sh\n@@ -488,7 +488,7 @@ test_expect_success 'merge of D & E2 fails but has appropriate contents' '\n \t\ttest $(git rev-parse :1:a/file) = $(git rev-parse C:a/file) &&\n \t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n \n-\t\ttest -f a~HEAD\n+\t\ttest_path_is_file a~HEAD\n \t)\n '\n \n@@ -512,7 +512,7 @@ test_expect_success 'merge of E2 & D fails but has appropriate contents' '\n \t\ttest $(git rev-parse :1:a/file) = $(git rev-parse C:a/file) &&\n \t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n \n-\t\ttest -f a~D^0\n+\t\ttest_path_is_file a~D^0\n \t)\n '\n \ndiff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6042-merge-rename-corner-cases.sh\nindex b76da8fcdf..90225b8bcd 100755\n--- a/t/t6042-merge-rename-corner-cases.sh\n+++ b/t/t6042-merge-rename-corner-cases.sh\n@@ -38,7 +38,7 @@ test_expect_success \"Does git preserve Gollum's precious artifact?\" '\n \t\ttest_must_fail git merge -s recursive rename-the-ring &&\n \n \t\t# Make sure git did not delete an untracked file\n-\t\ttest -f ring\n+\t\ttest_path_is_file ring\n \t)\n '\n \n@@ -213,8 +213,8 @@ test_expect_failure 'detect rename/add-source and preserve all data' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest -f a &&\n-\t\ttest -f b &&\n+\t\ttest_path_is_file a &&\n+\t\ttest_path_is_file b &&\n \n \t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n \t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a)\n@@ -236,8 +236,8 @@ test_expect_failure 'detect rename/add-source and preserve all data, merge other\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 1 out &&\n \n-\t\ttest -f a &&\n-\t\ttest -f b &&\n+\t\ttest_path_is_file a &&\n+\t\ttest_path_is_file b &&\n \n \t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n \t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a)\n@@ -302,8 +302,8 @@ test_expect_success 'rename/directory conflict + clean content merge' '\n \n \t\ttest $(git rev-parse :2:newfile) = $(git hash-object expect) &&\n \n-\t\ttest -f newfile/realfile &&\n-\t\ttest -f newfile~HEAD\n+\t\ttest_path_is_file newfile/realfile &&\n+\t\ttest_path_is_file newfile~HEAD\n \t)\n '\n \n@@ -340,8 +340,8 @@ test_expect_success 'rename/directory conflict + content merge conflict' '\n \t\ttest $(git rev-parse :2:newfile) = $(git rev-parse left-conflict:newfile) &&\n \t\ttest $(git rev-parse :3:newfile) = $(git rev-parse right:file) &&\n \n-\t\ttest -f newfile/realfile &&\n-\t\ttest -f newfile~HEAD\n+\t\ttest_path_is_file newfile/realfile &&\n+\t\ttest_path_is_file newfile~HEAD\n \t)\n '\n \n@@ -394,7 +394,7 @@ test_expect_success 'disappearing dir in rename/directory conflict handled' '\n \t\techo 7 >>expect &&\n \t\ttest_cmp expect sub &&\n \n-\t\ttest -f sub\n+\t\ttest_path_is_file sub\n \t)\n '\n \n@@ -453,10 +453,10 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n \t\tgit ls-files -o >out &&\n \t\ttest_line_count = 3 out &&\n \n-\t\ttest ! -f a &&\n-\t\ttest ! -f b &&\n-\t\ttest -f c~HEAD &&\n-\t\ttest -f c~C^0 &&\n+\t\ttest_path_is_missing a &&\n+\t\ttest_path_is_missing b &&\n+\t\ttest_path_is_file c~HEAD &&\n+\t\ttest_path_is_file c~C^0 &&\n \n \t\ttest $(git hash-object c~HEAD) = $(git rev-parse C:a) &&\n \t\ttest $(git hash-object c~C^0) = $(git rev-parse B:b)\n@@ -509,7 +509,7 @@ test_expect_success 'merge has correct working tree contents' '\n \t\ttest $(git rev-parse :3:b) = $(git rev-parse A:a) &&\n \t\ttest $(git rev-parse :2:c) = $(git rev-parse A:a) &&\n \n-\t\ttest ! -f a &&\n+\t\ttest_path_is_missing a &&\n \t\ttest $(git hash-object b) = $(git rev-parse A:a) &&\n \t\ttest $(git hash-object c) = $(git rev-parse A:a)\n \t)\n@@ -562,9 +562,9 @@ test_expect_failure 'detect conflict with rename/rename(1to2)/add-source merge'\n \t\ttest $(git rev-parse 2:b) = $(git rev-parse B:b) &&\n \t\ttest $(git rev-parse 3:c) = $(git rev-parse C:c) &&\n \n-\t\ttest -f a &&\n-\t\ttest -f b &&\n-\t\ttest -f c\n+\t\ttest_path_is_file a &&\n+\t\ttest_path_is_file b &&\n+\t\ttest_path_is_file c\n \t)\n '\n \n@@ -664,8 +664,8 @@ test_expect_success 'rename/rename/add-dest merge still knows about conflicting\n \t\ttest $(git hash-object b~HEAD) = $(git rev-parse C:b) &&\n \t\ttest $(git hash-object b~B\\^0) = $(git rev-parse B:b) &&\n \n-\t\ttest ! -f b &&\n-\t\ttest ! -f c\n+\t\ttest_path_is_missing b &&\n+\t\ttest_path_is_missing c\n \t)\n '\n \n-- \n2.17.0.1.gda85003413\n\n"},{"id":"348412","messageId":"20180524070439.6367-6-newren@gmail.com","threadId":"48560","inReplyTo":"20180524070439.6367-1-newren@gmail.com","subject":"[PATCH 5/5] t6036: prefer test_when_finished to manual cleanup in following test","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2018-05-24T07:04:39Z","receivedAt":"2018-05-24T07:05:17Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"Manually cleaning up from former tests in subsequent ones breaks the\nability to select which tests we want to run.  Use test_when_finished to\navoid this problem.\n\nSigned-off-by: Elijah Newren <newren@gmail.com>\n---\n t/t6036-recursive-corner-cases.sh | 22 ++++++++++++----------\n 1 file changed, 12 insertions(+), 10 deletions(-)\n\ndiff --git a/t/t6036-recursive-corner-cases.sh b/t/t6036-recursive-corner-cases.sh\nindex e5f167a06e..b5621303d6 100755\n--- a/t/t6036-recursive-corner-cases.sh\n+++ b/t/t6036-recursive-corner-cases.sh\n@@ -4,12 +4,6 @@ test_description='recursive merge corner cases involving criss-cross merges'\n \n . ./test-lib.sh\n \n-get_clean_checkout () {\n-\tgit reset --hard &&\n-\tgit clean -fdqx &&\n-\tgit checkout \"$1\"\n-}\n-\n #\n #  L1  L2\n #   o---o\n@@ -445,10 +439,12 @@ test_expect_success 'setup differently handled merges of directory/file conflict\n '\n \n test_expect_success 'merge of D & E1 fails but has appropriate contents' '\n+\ttest_when_finished \"git -C directory-file reset --hard\" &&\n+\ttest_when_finished \"git -C directory-file clean -fdqx\" &&\n \t(\n \t\tcd directory-file &&\n \n-\t\tget_clean_checkout D^0 &&\n+\t\tgit checkout D^0 &&\n \n \t\ttest_must_fail git merge -s recursive E1^0 &&\n \n@@ -468,10 +464,12 @@ test_expect_success 'merge of D & E1 fails but has appropriate contents' '\n '\n \n test_expect_success 'merge of E1 & D fails but has appropriate contents' '\n+\ttest_when_finished \"git -C directory-file reset --hard\" &&\n+\ttest_when_finished \"git -C directory-file clean -fdqx\" &&\n \t(\n \t\tcd directory-file &&\n \n-\t\tget_clean_checkout E1^0 &&\n+\t\tgit checkout E1^0 &&\n \n \t\ttest_must_fail git merge -s recursive D^0 &&\n \n@@ -491,10 +489,12 @@ test_expect_success 'merge of E1 & D fails but has appropriate contents' '\n '\n \n test_expect_success 'merge of D & E2 fails but has appropriate contents' '\n+\ttest_when_finished \"git -C directory-file reset --hard\" &&\n+\ttest_when_finished \"git -C directory-file clean -fdqx\" &&\n \t(\n \t\tcd directory-file &&\n \n-\t\tget_clean_checkout D^0 &&\n+\t\tgit checkout D^0 &&\n \n \t\ttest_must_fail git merge -s recursive E2^0 &&\n \n@@ -516,10 +516,12 @@ test_expect_success 'merge of D & E2 fails but has appropriate contents' '\n '\n \n test_expect_success 'merge of E2 & D fails but has appropriate contents' '\n+\ttest_when_finished \"git -C directory-file reset --hard\" &&\n+\ttest_when_finished \"git -C directory-file clean -fdqx\" &&\n \t(\n \t\tcd directory-file &&\n \n-\t\tget_clean_checkout E2^0 &&\n+\t\tgit checkout E2^0 &&\n \n \t\ttest_must_fail git merge -s recursive D^0 &&\n \n-- \n2.17.0.1.gda85003413\n\n"},{"id":"348415","messageId":"20180524100507.32305-1-szeder.dev@gmail.com","threadId":"48560","inReplyTo":"20180524070439.6367-3-newren@gmail.com","subject":"Re: [PATCH 2/5] t6036, t6042: use test_line_count instead of wc -l","fromName":"SZEDER Gábor","fromEmail":"szeder.dev@gmail.com","sentAt":"2018-05-24T10:05:07Z","receivedAt":"2018-05-24T10:11:31Z","isPatch":true,"sender":{"key":"szeder.dev@gmail.com","avatar":"https://avatars.githubusercontent.com/u/116324?v=4"},"body":"\n> Signed-off-by: Elijah Newren <newren@gmail.com>\n> ---\n>  t/t6036-recursive-corner-cases.sh    | 102 ++++++++++++++++++---------\n>  t/t6042-merge-rename-corner-cases.sh |  99 +++++++++++++++++---------\n>  2 files changed, 134 insertions(+), 67 deletions(-)\n> \n> diff --git a/t/t6036-recursive-corner-cases.sh b/t/t6036-recursive-corner-cases.sh\n> index cfe6a99771..3e659cff28 100755\n> --- a/t/t6036-recursive-corner-cases.sh\n> +++ b/t/t6036-recursive-corner-cases.sh\n> @@ -65,9 +65,12 @@ test_expect_success 'merge simple rename+criss-cross with no modifications' '\n>  \n>  \t\ttest_must_fail git merge -s recursive R2^0 &&\n>  \n> -\t\ttest 2 = $(git ls-files -s | wc -l) &&\n> -\t\ttest 2 = $(git ls-files -u | wc -l) &&\n> -\t\ttest 2 = $(git ls-files -o | wc -l) &&\n\nHere 'git ls-files -o' should have listed two untracked files ...\n\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 3 out &&\n\n... but now you expect it to list three.  I was about to point out the\ntypo, but then noticed that you expect it to list one more untracked\nfile than before in all subsequent tests...  now that can't be just a\ntypo, can it?\n\nPlease mention in the commit message that when using an intermediate\nfile to store the output, 'git ls-files -o' will list that file, too,\nthat's why the number of expected untracked files had to be adjusted;\nso future readers won't have to figure this out themselves.\n\nAn alternative to consider would be to add a .gitignore file in the\ninitial commit to ignore 'out', then the number of untracked files\ndon't have to be adjusted.\n\n\n[I have no further comments, but leave the rest of the patch below, so\nanyone can readily check the increased number of untracked files in\nsubsequent tests.]\n\n\n>  \t\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n>  \t\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n> @@ -135,9 +138,12 @@ test_expect_success 'merge criss-cross + rename merges with basic modification'\n>  \n>  \t\ttest_must_fail git merge -s recursive R2^0 &&\n>  \n> -\t\ttest 2 = $(git ls-files -s | wc -l) &&\n> -\t\ttest 2 = $(git ls-files -u | wc -l) &&\n> -\t\ttest 2 = $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 3 out &&\n>  \n>  \t\ttest $(git rev-parse :2:three) = $(git rev-parse L2:three) &&\n>  \t\ttest $(git rev-parse :3:three) = $(git rev-parse R2:three) &&\n> @@ -211,9 +217,12 @@ test_expect_success 'git detects differently handled merges conflict' '\n>  \n>  \t\ttest_must_fail git merge -s recursive E^0 &&\n>  \n> -\t\ttest 3 = $(git ls-files -s | wc -l) &&\n> -\t\ttest 3 = $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 = $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse :2:new_a) = $(git rev-parse D:new_a) &&\n>  \t\ttest $(git rev-parse :3:new_a) = $(git rev-parse E:new_a) &&\n> @@ -297,8 +306,10 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete' '\n>  \n>  \t\ttest_must_fail git merge -s recursive E^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 2 out &&\n>  \n>  \t\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n>  \t\ttest $(git rev-parse :2:file) = $(git rev-parse B:file)\n> @@ -314,8 +325,10 @@ test_expect_success 'git detects conflict merging criss-cross+modify/delete, rev\n>  \n>  \t\ttest_must_fail git merge -s recursive D^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 2 out &&\n>  \n>  \t\ttest $(git rev-parse :1:file) = $(git rev-parse master:file) &&\n>  \t\ttest $(git rev-parse :3:file) = $(git rev-parse B:file)\n> @@ -423,9 +436,12 @@ test_expect_success 'merge of D & E1 fails but has appropriate contents' '\n>  \n>  \t\ttest_must_fail git merge -s recursive E1^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 1 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n>  \t\ttest $(git rev-parse :2:a) = $(git rev-parse B:a)\n> @@ -440,9 +456,12 @@ test_expect_success 'merge of E1 & D fails but has appropriate contents' '\n>  \n>  \t\ttest_must_fail git merge -s recursive D^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 1 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse :0:ignore-me) = $(git rev-parse A:ignore-me) &&\n>  \t\ttest $(git rev-parse :3:a) = $(git rev-parse B:a)\n> @@ -457,9 +476,12 @@ test_expect_success 'merge of D & E2 fails but has appropriate contents' '\n>  \n>  \t\ttest_must_fail git merge -s recursive E2^0 &&\n>  \n> -\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 4 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 2 out &&\n>  \n>  \t\ttest $(git rev-parse :2:a) = $(git rev-parse B:a) &&\n>  \t\ttest $(git rev-parse :3:a/file) = $(git rev-parse E2:a/file) &&\n> @@ -478,9 +500,12 @@ test_expect_success 'merge of E2 & D fails but has appropriate contents' '\n>  \n>  \t\ttest_must_fail git merge -s recursive D^0 &&\n>  \n> -\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 4 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 2 out &&\n>  \n>  \t\ttest $(git rev-parse :3:a) = $(git rev-parse B:a) &&\n>  \t\ttest $(git rev-parse :2:a/file) = $(git rev-parse E2:a/file) &&\n> @@ -574,9 +599,12 @@ test_expect_success 'handle rename/rename(1to2)/modify followed by what looks li\n>  \n>  \t\tgit merge -s recursive E^0 &&\n>  \n> -\t\ttest 1 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 1 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 0 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse HEAD:newname) = $(git rev-parse E:newname)\n>  \t)\n> @@ -653,9 +681,12 @@ test_expect_failure 'detect rename/rename/add-source for virtual merge-base' '\n>  \n>  \t\tgit merge -s recursive E^0 &&\n>  \n> -\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 0 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a) &&\n>  \t\ttest $(git rev-parse HEAD:c) = $(git rev-parse A:a) &&\n> @@ -727,9 +758,12 @@ test_expect_success 'virtual merge base handles rename/rename(1to2)/add-dest' '\n>  \n>  \t\tgit merge -s recursive E^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 0 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse HEAD:a) = $(git rev-parse A:a) &&\n>  \t\ttest $(git rev-parse HEAD:c) = $(git rev-parse E:c)\n> diff --git a/t/t6042-merge-rename-corner-cases.sh b/t/t6042-merge-rename-corner-cases.sh\n> index bec0192c3b..b76da8fcdf 100755\n> --- a/t/t6042-merge-rename-corner-cases.sh\n> +++ b/t/t6042-merge-rename-corner-cases.sh\n> @@ -116,9 +116,12 @@ test_expect_failure 'conflict caused if rename not detected' '\n>  \t\tgit checkout -q C^0 &&\n>  \t\tgit merge -s recursive B^0 &&\n>  \n> -\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 0 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest_line_count = 6 c &&\n>  \t\ttest $(git rev-parse HEAD:a) = $(git rev-parse B:a) &&\n> @@ -203,9 +206,12 @@ test_expect_failure 'detect rename/add-source and preserve all data' '\n>  \n>  \t\tgit merge -s recursive C^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest -f a &&\n>  \t\ttest -f b &&\n> @@ -223,9 +229,12 @@ test_expect_failure 'detect rename/add-source and preserve all data, merge other\n>  \n>  \t\tgit merge -s recursive B^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest -f a &&\n>  \t\ttest -f b &&\n> @@ -279,9 +288,12 @@ test_expect_success 'rename/directory conflict + clean content merge' '\n>  \n>  \t\ttest_must_fail git merge -s recursive right^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 1 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 1 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 2 out &&\n>  \n>  \t\techo 0 >expect &&\n>  \t\tgit cat-file -p base:file >>expect &&\n> @@ -307,9 +319,12 @@ test_expect_success 'rename/directory conflict + content merge conflict' '\n>  \n>  \t\ttest_must_fail git merge -s recursive right^0 &&\n>  \n> -\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 1 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 4 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 2 out &&\n>  \n>  \t\tgit cat-file -p left-conflict:newfile >left &&\n>  \t\tgit cat-file -p base:file    >base &&\n> @@ -367,9 +382,12 @@ test_expect_success 'disappearing dir in rename/directory conflict handled' '\n>  \n>  \t\tgit merge -s recursive right^0 &&\n>  \n> -\t\ttest 1 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 1 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 0 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\techo 0 >expect &&\n>  \t\tgit cat-file -p base:sub/file >>expect &&\n> @@ -426,10 +444,14 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n>  \t\ttest_must_fail git merge -s recursive C^0 >out &&\n>  \t\ttest_i18ngrep \"CONFLICT (rename/rename)\" out &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 2 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 2 -eq $(git ls-files -u c | wc -l) &&\n> -\t\ttest 3 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u c >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 3 out &&\n>  \n>  \t\ttest ! -f a &&\n>  \t\ttest ! -f b &&\n> @@ -476,9 +498,12 @@ test_expect_success 'merge has correct working tree contents' '\n>  \n>  \t\ttest_must_fail git merge -s recursive B^0 &&\n>  \n> -\t\ttest 3 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 3 -eq $(git ls-files -u | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -u >out &&\n> +\t\ttest_line_count = 3 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n>  \t\ttest $(git rev-parse :3:b) = $(git rev-parse A:a) &&\n> @@ -527,8 +552,10 @@ test_expect_failure 'detect conflict with rename/rename(1to2)/add-source merge'\n>  \n>  \t\ttest_must_fail git merge -s recursive C^0 &&\n>  \n> -\t\ttest 4 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 4 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse 3:a) = $(git rev-parse C:a) &&\n>  \t\ttest $(git rev-parse 1:a) = $(git rev-parse A:a) &&\n> @@ -573,8 +600,10 @@ test_expect_failure 'rename/rename/add-source still tracks new a file' '\n>  \t\tgit checkout C^0 &&\n>  \t\tgit merge -s recursive B^0 &&\n>  \n> -\t\ttest 2 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 0 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 1 out &&\n>  \n>  \t\ttest $(git rev-parse HEAD:a) = $(git rev-parse C:a) &&\n>  \t\ttest $(git rev-parse HEAD:b) = $(git rev-parse A:a)\n> @@ -615,10 +644,14 @@ test_expect_success 'rename/rename/add-dest merge still knows about conflicting\n>  \t\tgit checkout C^0 &&\n>  \t\ttest_must_fail git merge -s recursive B^0 &&\n>  \n> -\t\ttest 5 -eq $(git ls-files -s | wc -l) &&\n> -\t\ttest 2 -eq $(git ls-files -u b | wc -l) &&\n> -\t\ttest 2 -eq $(git ls-files -u c | wc -l) &&\n> -\t\ttest 4 -eq $(git ls-files -o | wc -l) &&\n> +\t\tgit ls-files -s >out &&\n> +\t\ttest_line_count = 5 out &&\n> +\t\tgit ls-files -u b >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -u c >out &&\n> +\t\ttest_line_count = 2 out &&\n> +\t\tgit ls-files -o >out &&\n> +\t\ttest_line_count = 5 out &&\n>  \n>  \t\ttest $(git rev-parse :1:a) = $(git rev-parse A:a) &&\n>  \t\ttest $(git rev-parse :2:b) = $(git rev-parse C:b) &&\n> -- \n> 2.17.0.1.gda85003413\n> \n> \n"},{"id":"348418","messageId":"CAM0VKjmTVTA8JV=_6EVDGi1mD3VJXSJL7GxQJ0G2F5SaH-HWDQ@mail.gmail.com","threadId":"48560","inReplyTo":"20180524100507.32305-1-szeder.dev@gmail.com","subject":"Re: [PATCH 2/5] t6036, t6042: use test_line_count instead of wc -l","fromName":"SZEDER Gábor","fromEmail":"szeder.dev@gmail.com","sentAt":"2018-05-24T10:36:06Z","receivedAt":"2018-05-24T10:36:15Z","isPatch":true,"sender":{"key":"szeder.dev@gmail.com","avatar":"https://avatars.githubusercontent.com/u/116324?v=4"},"body":"On Thu, May 24, 2018 at 12:05 PM, SZEDER Gábor <szeder.dev@gmail.com> wrote:\n>\n>> Signed-off-by: Elijah Newren <newren@gmail.com>\n>> ---\n>>  t/t6036-recursive-corner-cases.sh    | 102 ++++++++++++++++++---------\n>>  t/t6042-merge-rename-corner-cases.sh |  99 +++++++++++++++++---------\n>>  2 files changed, 134 insertions(+), 67 deletions(-)\n>>\n>> diff --git a/t/t6036-recursive-corner-cases.sh b/t/t6036-recursive-corner-cases.sh\n>> index cfe6a99771..3e659cff28 100755\n>> --- a/t/t6036-recursive-corner-cases.sh\n>> +++ b/t/t6036-recursive-corner-cases.sh\n>> @@ -65,9 +65,12 @@ test_expect_success 'merge simple rename+criss-cross with no modifications' '\n>>\n>>               test_must_fail git merge -s recursive R2^0 &&\n>>\n>> -             test 2 = $(git ls-files -s | wc -l) &&\n>> -             test 2 = $(git ls-files -u | wc -l) &&\n>> -             test 2 = $(git ls-files -o | wc -l) &&\n>\n> Here 'git ls-files -o' should have listed two untracked files ...\n>\n>> +             git ls-files -s >out &&\n>> +             test_line_count = 2 out &&\n>> +             git ls-files -u >out &&\n>> +             test_line_count = 2 out &&\n>> +             git ls-files -o >out &&\n>> +             test_line_count = 3 out &&\n>\n> ... but now you expect it to list three.  I was about to point out the\n> typo, but then noticed that you expect it to list one more untracked\n> file than before in all subsequent tests...\n\nHrm, not all, actually, because there is this one exception:\n\n>> @@ -426,10 +444,14 @@ test_expect_success 'handle rename/rename (2to1) conflict correctly' '\n>>               test_must_fail git merge -s recursive C^0 >out &&\n\nNote that the file 'out' is created here ...\n\n>>               test_i18ngrep \"CONFLICT (rename/rename)\" out &&\n>>\n>> -             test 2 -eq $(git ls-files -s | wc -l) &&\n>> -             test 2 -eq $(git ls-files -u | wc -l) &&\n>> -             test 2 -eq $(git ls-files -u c | wc -l) &&\n>> -             test 3 -eq $(git ls-files -o | wc -l) &&\n\n... so this  'git ls-files -o' already lists it as well, ...\n\n>> +             git ls-files -s >out &&\n>> +             test_line_count = 2 out &&\n>> +             git ls-files -u >out &&\n>> +             test_line_count = 2 out &&\n>> +             git ls-files -u c >out &&\n>> +             test_line_count = 2 out &&\n>> +             git ls-files -o >out &&\n>> +             test_line_count = 3 out &&\n\n... therefore the number of untracked files here remains unchanged.\n\n>>\n>>               test ! -f a &&\n>>               test ! -f b &&\n"},{"id":"348459","messageId":"CABPp-BGS27ScX7R7GUv6oEHdynjWOzgeoYvS-759wh936-APWA@mail.gmail.com","threadId":"48560","inReplyTo":"20180524100507.32305-1-szeder.dev@gmail.com","subject":"Re: [PATCH 2/5] t6036, t6042: use test_line_count instead of wc -l","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2018-05-24T17:03:09Z","receivedAt":"2018-05-24T17:03:15Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"On Thu, May 24, 2018 at 3:05 AM, SZEDER Gábor <szeder.dev@gmail.com> wrote:\n>> --- a/t/t6036-recursive-corner-cases.sh\n>> +++ b/t/t6036-recursive-corner-cases.sh\n>> @@ -65,9 +65,12 @@ test_expect_success 'merge simple rename+criss-cross with no modifications' '\n>>\n>>               test_must_fail git merge -s recursive R2^0 &&\n>>\n>> -             test 2 = $(git ls-files -s | wc -l) &&\n>> -             test 2 = $(git ls-files -u | wc -l) &&\n>> -             test 2 = $(git ls-files -o | wc -l) &&\n>\n> Here 'git ls-files -o' should have listed two untracked files ...\n>\n>> +             git ls-files -s >out &&\n>> +             test_line_count = 2 out &&\n>> +             git ls-files -u >out &&\n>> +             test_line_count = 2 out &&\n>> +             git ls-files -o >out &&\n>> +             test_line_count = 3 out &&\n>\n> ... but now you expect it to list three.  I was about to point out the\n> typo, but then noticed that you expect it to list one more untracked\n> file than before in all subsequent tests...  now that can't be just a\n> typo, can it?\n>\n> Please mention in the commit message that when using an intermediate\n> file to store the output, 'git ls-files -o' will list that file, too,\n> that's why the number of expected untracked files had to be adjusted;\n> so future readers won't have to figure this out themselves.\n\nHow does adding the following to the commit message sound?\n\n    Changing to use test_line_count means using an intermediate file to store\n    the output, which means that 'git ls-files -o' will have an additional\n    file to list, which means that the number of lines expected in some tests\n    will therefore change as well (unless the same intermediate file was used\n    to capture the output of a previous command).\n\nI'll include that in my next roll of the series after waiting for any\nother fixups folks point out.  Sorry for the trouble.\n\nAs always, thanks for taking a look!\n"},{"id":"348505","messageId":"xmqqy3g8pm8g.fsf@gitster-ct.c.googlers.com","threadId":"48560","inReplyTo":"20180524100507.32305-1-szeder.dev@gmail.com","subject":"Re: [PATCH 2/5] t6036, t6042: use test_line_count instead of wc -l","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2018-05-25T01:17:35Z","receivedAt":"2018-05-25T01:23:44Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"SZEDER Gábor <szeder.dev@gmail.com> writes:\n\n>> -\t\ttest 2 = $(git ls-files -s | wc -l) &&\n>> -\t\ttest 2 = $(git ls-files -u | wc -l) &&\n>> -\t\ttest 2 = $(git ls-files -o | wc -l) &&\n>\n> Here 'git ls-files -o' should have listed two untracked files ...\n>\n>> +\t\tgit ls-files -s >out &&\n>> +\t\ttest_line_count = 2 out &&\n>> +\t\tgit ls-files -u >out &&\n>> +\t\ttest_line_count = 2 out &&\n>> +\t\tgit ls-files -o >out &&\n>> +\t\ttest_line_count = 3 out &&\n>\n> ... but now you expect it to list three.  I was about to point out the\n> typo, but then noticed that you expect it to list one more untracked\n> file than before in all subsequent tests...  now that can't be just a\n> typo, can it?\n>\n> Please mention in the commit message that when using an intermediate\n> file to store the output, 'git ls-files -o' will list that file, too,\n> that's why the number of expected untracked files had to be adjusted;\n> so future readers won't have to figure this out themselves.\n\nI'd expect that a reader of the commit who cares enough to bother to\nwonder by looking at the patch and seeing that 2 became 3 would know\nwhy already.  And a reader of the resulting file would not know that\nthe 3 used to be 2, and won't be helped by \"we used to count to 2,\nnow we have 'out' also counted\" that much, especially in the commit\nlog message.  What would help the latter would be to name which\nthree paths we expect to see in the comment (or test against the\nexact list of paths, instead of using test_line_count).\n\n> An alternative to consider would be to add a .gitignore file in the\n> initial commit to ignore 'out', then the number of untracked files\n> don't have to be adjusted.\n\nI think that is a preferred solution that we've used in ls-files and\nstatus tests successfully.\n"},{"id":"348572","messageId":"CABPp-BEcTKaPPUOVqTRUAW+LBBySCK0dgx1J66hYB30yMasK_Q@mail.gmail.com","threadId":"48560","inReplyTo":"xmqqy3g8pm8g.fsf@gitster-ct.c.googlers.com","subject":"Re: [PATCH 2/5] t6036, t6042: use test_line_count instead of wc -l","fromName":"Elijah Newren","fromEmail":"newren@gmail.com","sentAt":"2018-05-26T00:44:24Z","receivedAt":"2018-05-26T00:44:29Z","isPatch":true,"sender":{"key":"newren@gmail.com","avatar":"https://avatars.githubusercontent.com/u/5455730?v=4"},"body":"On Thu, May 24, 2018 at 6:17 PM, Junio C Hamano <gitster@pobox.com> wrote:\n> SZEDER Gábor <szeder.dev@gmail.com> writes:\n>\n>>> -            test 2 = $(git ls-files -s | wc -l) &&\n>>> -            test 2 = $(git ls-files -u | wc -l) &&\n>>> -            test 2 = $(git ls-files -o | wc -l) &&\n>>\n>> Here 'git ls-files -o' should have listed two untracked files ...\n>>\n>>> +            git ls-files -s >out &&\n>>> +            test_line_count = 2 out &&\n>>> +            git ls-files -u >out &&\n>>> +            test_line_count = 2 out &&\n>>> +            git ls-files -o >out &&\n>>> +            test_line_count = 3 out &&\n>>\n>> ... but now you expect it to list three.  I was about to point out the\n>> typo, but then noticed that you expect it to list one more untracked\n>> file than before in all subsequent tests...  now that can't be just a\n>> typo, can it?\n>>\n>> Please mention in the commit message that when using an intermediate\n>> file to store the output, 'git ls-files -o' will list that file, too,\n>> that's why the number of expected untracked files had to be adjusted;\n>> so future readers won't have to figure this out themselves.\n>\n> I'd expect that a reader of the commit who cares enough to bother to\n> wonder by looking at the patch and seeing that 2 became 3 would know\n> why already.  And a reader of the resulting file would not know that\n> the 3 used to be 2, and won't be helped by \"we used to count to 2,\n> now we have 'out' also counted\" that much, especially in the commit\n> log message.  What would help the latter would be to name which\n> three paths we expect to see in the comment (or test against the\n> exact list of paths, instead of using test_line_count).\n>\n>> An alternative to consider would be to add a .gitignore file in the\n>> initial commit to ignore 'out', then the number of untracked files\n>> don't have to be adjusted.\n>\n> I think that is a preferred solution that we've used in ls-files and\n> status tests successfully.\n\n...except that if we add a .gitignore to each initial commit (we use\ntest_create_repo for nearly every test to keep them separable meaning\nwe'd have to do this many times), then four lines above we have to\nadjust the number of expected tracked files.  And, for it to work,\nwe'd have to add an --exclude-standard flag to ls-files -o.\n\nI can make that change if you both want it, but it seems like it's\nactually making it harder to follow the changes rather than easier.\n"}]}