#!/bin/sh global test_description := ''Test cherry-pick with directory/file conflicts'' source ./test-lib.sh test_expect_success 'Initialize repository' ' mkdir a && >a/f && git add a && git commit -m a ' test_expect_success 'Setup rename across paths each below D/F conflicts' ' mkdir b && test_ln_s_add ../a b/a && git commit -m b && git checkout -b branch && rm b/a && git mv a b/a && test_ln_s_add b/a a && git commit -m swap && >f1 && git add f1 && git commit -m f1 ' test_expect_success 'Cherry-pick succeeds with rename across D/F conflicts' ' git reset --hard && git checkout master^0 && git cherry-pick branch ' test_expect_success 'Setup rename with file on one side matching directory name on other' ' git checkout --orphan nick-testcase && git rm -rf . && >empty && git add empty && git commit -m "Empty file" && git checkout -b simple && mv empty file && mkdir empty && mv file empty && git add empty/file && git commit -m "Empty file under empty dir" && echo content >newfile && git add newfile && git commit -m "New file" ' test_expect_success 'Cherry-pick succeeds with was_a_dir/file -> was_a_dir (resolve)' ' git reset --hard && git checkout -q nick-testcase^0 && git cherry-pick --strategy=resolve simple ' test_expect_success 'Cherry-pick succeeds with was_a_dir/file -> was_a_dir (recursive)' ' git reset --hard && git checkout -q nick-testcase^0 && git cherry-pick --strategy=recursive simple ' test_expect_success 'Setup rename with file on one side matching different dirname on other' ' git reset --hard && git checkout --orphan mergeme && git rm -rf . && mkdir sub && mkdir othersub && echo content > sub/file && echo foo > othersub/whatever && git add -A && git commit -m "Common commit" && git rm -rf othersub && git mv sub/file othersub && git commit -m "Commit to merge" && git checkout -b newhead mergeme~1 && >independent-change && git add independent-change && git commit -m "Completely unrelated change" ' test_expect_success 'Cherry-pick with rename to different D/F conflict succeeds (resolve)' ' git reset --hard && git checkout -q newhead^0 && git cherry-pick --strategy=resolve mergeme ' test_expect_success 'Cherry-pick with rename to different D/F conflict succeeds (recursive)' ' git reset --hard && git checkout -q newhead^0 && git cherry-pick --strategy=recursive mergeme ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"Test cherry-pick with directory/file conflicts">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <"Initialize repository">)} {(SQ <"\n"> <"\tmkdir a &&\n"> <"\t>a/f &&\n"> <"\tgit add a &&\n"> <"\tgit commit -m a\n">)} ) (C {(test_expect_success)} {(SQ <"Setup rename across paths each below D/F conflicts">)} { (SQ <"\n"> <"\tmkdir b &&\n"> <"\ttest_ln_s_add ../a b/a &&\n"> <"\tgit commit -m b &&\n"> <"\n"> <"\tgit checkout -b branch &&\n"> <"\trm b/a &&\n"> <"\tgit mv a b/a &&\n"> <"\ttest_ln_s_add b/a a &&\n"> <"\tgit commit -m swap &&\n"> <"\n"> <"\t>f1 &&\n"> <"\tgit add f1 &&\n"> <"\tgit commit -m f1\n"> ) } ) (C {(test_expect_success)} {(SQ <"Cherry-pick succeeds with rename across D/F conflicts">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout master^0 &&\n"> <"\tgit cherry-pick branch\n"> ) } ) (C {(test_expect_success)} {(SQ <"Setup rename with file on one side matching directory name on other">)} { (SQ <"\n"> <"\tgit checkout --orphan nick-testcase &&\n"> <"\tgit rm -rf . &&\n"> <"\n"> <"\t>empty &&\n"> <"\tgit add empty &&\n"> <"\tgit commit -m \"Empty file\" &&\n"> <"\n"> <"\tgit checkout -b simple &&\n"> <"\tmv empty file &&\n"> <"\tmkdir empty &&\n"> <"\tmv file empty &&\n"> <"\tgit add empty/file &&\n"> <"\tgit commit -m \"Empty file under empty dir\" &&\n"> <"\n"> <"\techo content >newfile &&\n"> <"\tgit add newfile &&\n"> <"\tgit commit -m \"New file\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"Cherry-pick succeeds with was_a_dir/file -> was_a_dir (resolve)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -q nick-testcase^0 &&\n"> <"\tgit cherry-pick --strategy=resolve simple\n"> ) } ) (C {(test_expect_success)} {(SQ <"Cherry-pick succeeds with was_a_dir/file -> was_a_dir (recursive)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -q nick-testcase^0 &&\n"> <"\tgit cherry-pick --strategy=recursive simple\n"> ) } ) (C {(test_expect_success)} {(SQ <"Setup rename with file on one side matching different dirname on other">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout --orphan mergeme &&\n"> <"\tgit rm -rf . &&\n"> <"\n"> <"\tmkdir sub &&\n"> <"\tmkdir othersub &&\n"> <"\techo content > sub/file &&\n"> <"\techo foo > othersub/whatever &&\n"> <"\tgit add -A &&\n"> <"\tgit commit -m \"Common commit\" &&\n"> <"\n"> <"\tgit rm -rf othersub &&\n"> <"\tgit mv sub/file othersub &&\n"> <"\tgit commit -m \"Commit to merge\" &&\n"> <"\n"> <"\tgit checkout -b newhead mergeme~1 &&\n"> <"\t>independent-change &&\n"> <"\tgit add independent-change &&\n"> <"\tgit commit -m \"Completely unrelated change\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"Cherry-pick with rename to different D/F conflict succeeds (resolve)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -q newhead^0 &&\n"> <"\tgit cherry-pick --strategy=resolve mergeme\n"> ) } ) (C {(test_expect_success)} {(SQ <"Cherry-pick with rename to different D/F conflict succeeds (recursive)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -q newhead^0 &&\n"> <"\tgit cherry-pick --strategy=recursive mergeme\n"> ) } ) (C {(test_done)}) ] )