(CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(DQ ("recursive merge corner cases w/ renames but not criss-crosses"))} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <"setup rename/delete + untracked file">)} { (SQ <"\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"> ) } ) (C {(test_expect_success)} {(DQ ("Does git preserve Gollum's precious artifact?"))} { (SQ <"\n"> <"\ttest_must_fail git merge -s recursive rename-the-ring &&\n"> <"\n"> <"\t# Make sure git did not delete an untracked file\n"> <"\ttest -f ring\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup rename/modify/add-source conflict">)} { (SQ <"\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"> ) } ) (C {(test_expect_failure)} {(SQ <"rename/modify/add-source conflict resolvable">)} { (SQ <"\n"> <"\tgit checkout B^0 &&\n"> <"\n"> <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"setup resolvable conflict missed if rename missed">)} { (SQ <"\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"> ) } ) (C {(test_expect_failure)} {(SQ <"conflict caused if rename not detected">)} { (SQ <"\n"> <"\tgit checkout -q C^0 &&\n"> <"\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"> <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"setup conflict resolved wrong if rename missed">)} { (SQ <"\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"> ) } ) (C {(test_expect_failure)} {(SQ <"missed conflict if rename not detected">)} {(SQ <"\n"> <"\tgit checkout -q E^0 &&\n"> <"\ttest_must_fail git merge -s recursive D^0\n">)} ) (C {(test_expect_success)} {(SQ <"setup undetected rename/add-source causes data loss">)} { (SQ <"\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"> ) } ) (C {(test_expect_failure)} {(SQ <"detect rename/add-source and preserve all data">)} { (SQ <"\n"> <"\tgit checkout B^0 &&\n"> <"\n"> <"\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"> <"\n"> <"\ttest -f a &&\n"> <"\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"> ) } ) (C {(test_expect_failure)} {(SQ <"detect rename/add-source and preserve all data, merge other way">)} { (SQ <"\n"> <"\tgit checkout C^0 &&\n"> <"\n"> <"\tgit merge -s recursive B^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"> <"\n"> <"\ttest -f a &&\n"> <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"setup content merge + rename/directory conflict">)} { (SQ <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"rename/directory conflict + clean content merge">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit reset --hard &&\n"> <"\tgit clean -fdqx &&\n"> <"\n"> <"\tgit checkout left-clean^0 &&\n"> <"\n"> <"\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"> <"\n"> <"\techo 0 >expect &&\n"> <"\tgit cat-file -p base:file >>expect &&\n"> <"\techo 7 >>expect &&\n"> <"\ttest_cmp expect newfile~HEAD &&\n"> <"\n"> <"\ttest $(git rev-parse :2:newfile) = $(git hash-object expect) &&\n"> <"\n"> <"\ttest -f newfile/realfile &&\n"> <"\ttest -f newfile~HEAD\n"> ) } ) (C {(test_expect_success)} {(SQ <"rename/directory conflict + content merge conflict">)} { (SQ <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"setup content merge + rename/directory conflict w/ disappearing dir">)} { (SQ <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"disappearing dir in rename/directory conflict handled">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit clean -fdqx &&\n"> <"\n"> <"\tgit checkout left^0 &&\n"> <"\n"> <"\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"> <"\n"> <"\techo 0 >expect &&\n"> <"\tgit cat-file -p base:sub/file >>expect &&\n"> <"\techo 7 >>expect &&\n"> <"\ttest_cmp expect sub &&\n"> <"\n"> <"\ttest -f sub\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup rename/rename (2to1) + modify/modify">)} { (SQ <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"handle rename/rename (2to1) conflict correctly">)} { (SQ <"\n"> <"\tgit checkout B^0 &&\n"> <"\n"> <"\ttest_must_fail git merge -s recursive C^0 >out &&\n"> <"\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"> <"\n"> <"\ttest ! -f a &&\n"> <"\ttest ! -f b &&\n"> <"\ttest -f c~HEAD &&\n"> <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"setup simple rename/rename (1to2) conflict">)} { (SQ <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"merge has correct working tree contents">)} { (SQ <"\n"> <"\tgit checkout C^0 &&\n"> <"\n"> <"\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"> <"\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"> <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"setup rename/rename(1to2)/add-source conflict">)} { (SQ <"\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"> ) } ) (C {(test_expect_failure)} {(SQ <"detect conflict with rename/rename(1to2)/add-source merge">)} { (SQ <"\n"> <"\tgit checkout B^0 &&\n"> <"\n"> <"\ttest_must_fail git merge -s recursive C^0 &&\n"> <"\n"> <"\ttest 4 -eq $(git ls-files -s | wc -l) &&\n"> <"\ttest 0 -eq $(git ls-files -o | wc -l) &&\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"> <"\n"> <"\ttest -f a &&\n"> <"\ttest -f b &&\n"> <"\ttest -f c\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup rename/rename(1to2)/add-source resolvable conflict">)} { (SQ <"\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"> ) } ) (C {(test_expect_failure)} {(SQ <"rename/rename/add-source still tracks new a file">)} { (SQ <"\n"> <"\tgit checkout C^0 &&\n"> <"\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"> <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"setup rename/rename(1to2)/add-dest conflict">)} { (SQ <"\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"> ) } ) (C {(test_expect_success)} {(SQ <"rename/rename/add-dest merge still knows about conflicting file versions">)} { (SQ <"\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"> ) } ) (C {(test_done)}) ] )