1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
#!/bin/sh
test_description='merging when a directory was replaced with a symlink'
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
. ./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 main &&
git rm --cached a/b &&
git commit -m "untracked symlink remains" &&
test_must_fail git checkout start^0 &&
git clean -fd # Do not leave the untracked symlink in the way
'
test_expect_success 'a/b-2/c/d is kept when clobbering symlink b' '
git checkout HEAD^0 &&
git reset --hard main &&
git rm --cached a/b &&
git commit -m "untracked symlink remains" &&
git checkout -f start^0 &&
test_path_is_file a/b-2/c/d &&
git clean -fd # Do not leave the untracked symlink in the way
'
test_expect_success 'checkout should not have deleted a/b-2/c/d' '
git checkout HEAD^0 &&
git reset --hard main &&
git checkout start^0 &&
test_path_is_file a/b-2/c/d
'
test_expect_success 'setup for merge test' '
git reset --hard &&
test_path_is_file 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 main &&
test_path_is_file 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 main &&
test_path_is_file 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 main^0 &&
git merge -s resolve baseline^0 &&
test_path_is_file 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 main^0 &&
git merge -s recursive baseline^0 &&
test_path_is_file 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 main &&
test_path_is_file a/b/c/e &&
test_path_is_file 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 main &&
test_path_is_file a/b/c/e &&
test_path_is_file 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 main
'
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 main
'
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_path_is_file 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_path_is_file 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_path_is_file a/b/c/d
'
test_expect_success SYMLINKS 'a/b-2 was resolved as symlink' '
test -h a/b-2
'
test_done
|