#!/bin/sh global test_description := ''merging when a directory was replaced with a symlink'' source ./test-lib.sh test_expect_success 'create a commit where dir a/b changed to symlink' ' mkdir -p a/b/c a/b-2/c && > a/b/c/d && > a/b-2/c/d && > a/x && git add -A && git commit -m base && git tag start && rm -rf a/b && git add -A && test_ln_s_add b-2 a/b && git commit -m "dir to symlink" ' test_expect_success 'checkout does not clobber untracked symlink' ' git checkout HEAD^0 && git reset --hard master && git rm --cached a/b && git commit -m "untracked symlink remains" && test_must_fail git checkout start^0 ' test_expect_success 'a/b-2/c/d is kept when clobbering symlink b' ' git checkout HEAD^0 && git reset --hard master && git rm --cached a/b && git commit -m "untracked symlink remains" && git checkout -f start^0 && test -f a/b-2/c/d ' test_expect_success 'checkout should not have deleted a/b-2/c/d' ' git checkout HEAD^0 && git reset --hard master && git checkout start^0 && test -f a/b-2/c/d ' test_expect_success 'setup for merge test' ' git reset --hard && test -f a/b-2/c/d && echo x > a/x && git add a/x && git commit -m x && git tag baseline ' test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (resolve)' ' git reset --hard && git checkout baseline^0 && git merge -s resolve master && test -f a/b-2/c/d ' test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test -h a/b ' test_expect_success 'Handle D/F conflict, do not lose a/b-2/c/d in merge (recursive)' ' git reset --hard && git checkout baseline^0 && git merge -s recursive master && test -f a/b-2/c/d ' test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test -h a/b ' test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (resolve)' ' git reset --hard && git checkout master^0 && git merge -s resolve baseline^0 && test -f a/b-2/c/d ' test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test -h a/b ' test_expect_success 'Handle F/D conflict, do not lose a/b-2/c/d in merge (recursive)' ' git reset --hard && git checkout master^0 && git merge -s recursive baseline^0 && test -f a/b-2/c/d ' test_expect_success SYMLINKS 'a/b was resolved as symlink' ' test -h a/b ' test_expect_failure 'do not lose untracked in merge (resolve)' ' git reset --hard && git checkout baseline^0 && >a/b/c/e && test_must_fail git merge -s resolve master && test -f a/b/c/e && test -f a/b-2/c/d ' test_expect_success 'do not lose untracked in merge (recursive)' ' git reset --hard && git checkout baseline^0 && >a/b/c/e && test_must_fail git merge -s recursive master && test -f a/b/c/e && test -f a/b-2/c/d ' test_expect_success 'do not lose modifications in merge (resolve)' ' git reset --hard && git checkout baseline^0 && echo more content >>a/b/c/d && test_must_fail git merge -s resolve master ' test_expect_success 'do not lose modifications in merge (recursive)' ' git reset --hard && git checkout baseline^0 && echo more content >>a/b/c/d && test_must_fail git merge -s recursive master ' test_expect_success 'setup a merge where dir a/b-2 changed to symlink' ' git reset --hard && git checkout start^0 && rm -rf a/b-2 && git add -A && test_ln_s_add b a/b-2 && git commit -m "dir a/b-2 to symlink" && git tag test2 ' test_expect_success 'merge should not have D/F conflicts (resolve)' ' git reset --hard && git checkout baseline^0 && git merge -s resolve test2 && test -f a/b/c/d ' test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' ' test -h a/b-2 ' test_expect_success 'merge should not have D/F conflicts (recursive)' ' git reset --hard && git checkout baseline^0 && git merge -s recursive test2 && test -f a/b/c/d ' test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' ' test -h a/b-2 ' test_expect_success 'merge should not have F/D conflicts (recursive)' ' git reset --hard && git checkout -b foo test2 && git merge -s recursive baseline^0 && test -f a/b/c/d ' test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' ' test -h a/b-2 ' test_done (CommandList children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:test_description) op: Equal rhs: {(SQ <"merging when a directory was replaced with a symlink">)} spids: [4] ) ] spids: [4] ) (C {(.)} {(./test-lib.sh)}) (C {(test_expect_success)} {(SQ <"create a commit where dir a/b changed to symlink">)} { (SQ <"\n"> <"\tmkdir -p a/b/c a/b-2/c &&\n"> <"\t> a/b/c/d &&\n"> <"\t> a/b-2/c/d &&\n"> <"\t> a/x &&\n"> <"\tgit add -A &&\n"> <"\tgit commit -m base &&\n"> <"\tgit tag start &&\n"> <"\trm -rf a/b &&\n"> <"\tgit add -A &&\n"> <"\ttest_ln_s_add b-2 a/b &&\n"> <"\tgit commit -m \"dir to symlink\"\n"> ) } ) (C {(test_expect_success)} {(SQ <"checkout does not clobber untracked symlink">)} { (SQ <"\n"> <"\tgit checkout HEAD^0 &&\n"> <"\tgit reset --hard master &&\n"> <"\tgit rm --cached a/b &&\n"> <"\tgit commit -m \"untracked symlink remains\" &&\n"> <"\ttest_must_fail git checkout start^0\n"> ) } ) (C {(test_expect_success)} {(SQ <"a/b-2/c/d is kept when clobbering symlink b">)} { (SQ <"\n"> <"\tgit checkout HEAD^0 &&\n"> <"\tgit reset --hard master &&\n"> <"\tgit rm --cached a/b &&\n"> <"\tgit commit -m \"untracked symlink remains\" &&\n"> <"\tgit checkout -f start^0 &&\n"> <"\ttest -f a/b-2/c/d\n"> ) } ) (C {(test_expect_success)} {(SQ <"checkout should not have deleted a/b-2/c/d">)} { (SQ <"\n"> <"\tgit checkout HEAD^0 &&\n"> <"\tgit reset --hard master &&\n"> <"\t git checkout start^0 &&\n"> <"\t test -f a/b-2/c/d\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup for merge test">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\ttest -f a/b-2/c/d &&\n"> <"\techo x > a/x &&\n"> <"\tgit add a/x &&\n"> <"\tgit commit -m x &&\n"> <"\tgit tag baseline\n"> ) } ) (C {(test_expect_success)} {(SQ <"Handle D/F conflict, do not lose a/b-2/c/d in merge (resolve)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout baseline^0 &&\n"> <"\tgit merge -s resolve master &&\n"> <"\ttest -f a/b-2/c/d\n"> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <"a/b was resolved as symlink">)} {(SQ <"\n"> <"\ttest -h a/b\n">)} ) (C {(test_expect_success)} {(SQ <"Handle D/F conflict, do not lose a/b-2/c/d in merge (recursive)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout baseline^0 &&\n"> <"\tgit merge -s recursive master &&\n"> <"\ttest -f a/b-2/c/d\n"> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <"a/b was resolved as symlink">)} {(SQ <"\n"> <"\ttest -h a/b\n">)} ) (C {(test_expect_success)} {(SQ <"Handle F/D conflict, do not lose a/b-2/c/d in merge (resolve)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout master^0 &&\n"> <"\tgit merge -s resolve baseline^0 &&\n"> <"\ttest -f a/b-2/c/d\n"> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <"a/b was resolved as symlink">)} {(SQ <"\n"> <"\ttest -h a/b\n">)} ) (C {(test_expect_success)} {(SQ <"Handle F/D conflict, do not lose a/b-2/c/d in merge (recursive)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout master^0 &&\n"> <"\tgit merge -s recursive baseline^0 &&\n"> <"\ttest -f a/b-2/c/d\n"> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <"a/b was resolved as symlink">)} {(SQ <"\n"> <"\ttest -h a/b\n">)} ) (C {(test_expect_failure)} {(SQ <"do not lose untracked in merge (resolve)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout baseline^0 &&\n"> <"\t>a/b/c/e &&\n"> <"\ttest_must_fail git merge -s resolve master &&\n"> <"\ttest -f a/b/c/e &&\n"> <"\ttest -f a/b-2/c/d\n"> ) } ) (C {(test_expect_success)} {(SQ <"do not lose untracked in merge (recursive)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout baseline^0 &&\n"> <"\t>a/b/c/e &&\n"> <"\ttest_must_fail git merge -s recursive master &&\n"> <"\ttest -f a/b/c/e &&\n"> <"\ttest -f a/b-2/c/d\n"> ) } ) (C {(test_expect_success)} {(SQ <"do not lose modifications in merge (resolve)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout baseline^0 &&\n"> <"\techo more content >>a/b/c/d &&\n"> <"\ttest_must_fail git merge -s resolve master\n"> ) } ) (C {(test_expect_success)} {(SQ <"do not lose modifications in merge (recursive)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout baseline^0 &&\n"> <"\techo more content >>a/b/c/d &&\n"> <"\ttest_must_fail git merge -s recursive master\n"> ) } ) (C {(test_expect_success)} {(SQ <"setup a merge where dir a/b-2 changed to symlink">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout start^0 &&\n"> <"\trm -rf a/b-2 &&\n"> <"\tgit add -A &&\n"> <"\ttest_ln_s_add b a/b-2 &&\n"> <"\tgit commit -m \"dir a/b-2 to symlink\" &&\n"> <"\tgit tag test2\n"> ) } ) (C {(test_expect_success)} {(SQ <"merge should not have D/F conflicts (resolve)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout baseline^0 &&\n"> <"\tgit merge -s resolve test2 &&\n"> <"\ttest -f a/b/c/d\n"> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <"a/b-2 was resolved as symlink">)} {(SQ <"\n"> <"\ttest -h a/b-2\n">)} ) (C {(test_expect_success)} {(SQ <"merge should not have D/F conflicts (recursive)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout baseline^0 &&\n"> <"\tgit merge -s recursive test2 &&\n"> <"\ttest -f a/b/c/d\n"> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <"a/b-2 was resolved as symlink">)} {(SQ <"\n"> <"\ttest -h a/b-2\n">)} ) (C {(test_expect_success)} {(SQ <"merge should not have F/D conflicts (recursive)">)} { (SQ <"\n"> <"\tgit reset --hard &&\n"> <"\tgit checkout -b foo test2 &&\n"> <"\tgit merge -s recursive baseline^0 &&\n"> <"\ttest -f a/b/c/d\n"> ) } ) (C {(test_expect_success)} {(SYMLINKS)} {(SQ <"a/b-2 was resolved as symlink">)} {(SQ <"\n"> <"\ttest -h a/b-2\n">)} ) (C {(test_done)}) ] )