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 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
|
#!/bin/sh
test_description='am --abort'
. ./test-lib.sh
test_expect_success setup '
test_write_lines a b c d e f g >file-1 &&
cp file-1 file-2 &&
test_tick &&
git add file-1 file-2 &&
git commit -m initial &&
git tag initial &&
git format-patch --stdout --root initial >initial.patch &&
for i in 2 3 4 5 6
do
echo $i >>file-1 &&
echo $i >otherfile-$i &&
git add otherfile-$i &&
test_tick &&
git commit -a -m $i || return 1
done &&
git branch changes &&
git format-patch --no-numbered initial &&
git checkout -b conflicting initial &&
echo different >>file-1 &&
echo whatever >new-file &&
git add file-1 new-file &&
git commit -m different &&
git checkout -b side initial &&
echo local change >file-2-expect
'
for with3 in '' ' -3'
do
test_expect_success "am$with3 stops at a patch that does not apply" '
git reset --hard initial &&
cp file-2-expect file-2 &&
test_must_fail git am$with3 000[1245]-*.patch &&
git log --pretty=tformat:%s >actual &&
test_write_lines 3 2 initial >expect &&
test_cmp expect actual
'
test_expect_success "am$with3 --skip continue after failed am$with3" '
test_must_fail git am$with3 --skip >output &&
test_grep "^Applying: 6$" output &&
test_cmp file-2-expect file-2 &&
test ! -f .git/MERGE_RR
'
test_expect_success "am --abort goes back after failed am$with3" '
git am --abort &&
git rev-parse HEAD >actual &&
git rev-parse initial >expect &&
test_cmp expect actual &&
test_cmp file-2-expect file-2 &&
git diff-index --exit-code --cached HEAD &&
test ! -f .git/MERGE_RR
'
done
test_expect_success 'am -3 --skip removes otherfile-4' '
git reset --hard initial &&
test_must_fail git am -3 0003-*.patch &&
test 3 -eq $(git ls-files -u | wc -l) &&
test 4 = "$(cat otherfile-4)" &&
git am --skip &&
test_cmp_rev initial HEAD &&
test -z "$(git ls-files -u)" &&
test_path_is_missing otherfile-4
'
test_expect_success 'am -3 --abort removes otherfile-4' '
git reset --hard initial &&
test_must_fail git am -3 0003-*.patch &&
test 3 -eq $(git ls-files -u | wc -l) &&
test 4 = "$(cat otherfile-4)" &&
git am --abort &&
test_cmp_rev initial HEAD &&
test -z "$(git ls-files -u)" &&
test_path_is_missing otherfile-4
'
test_expect_success 'am --abort will keep the local commits intact' '
test_must_fail git am 0004-*.patch &&
test_commit unrelated &&
git rev-parse HEAD >expect &&
git am --abort &&
git rev-parse HEAD >actual &&
test_cmp expect actual
'
test_expect_success 'am --abort will keep dirty index intact' '
git reset --hard initial &&
echo dirtyfile >dirtyfile &&
cp dirtyfile dirtyfile.expected &&
git add dirtyfile &&
test_must_fail git am 0001-*.patch &&
test_cmp_rev initial HEAD &&
test_path_is_file dirtyfile &&
test_cmp dirtyfile.expected dirtyfile &&
git am --abort &&
test_cmp_rev initial HEAD &&
test_path_is_file dirtyfile &&
test_cmp dirtyfile.expected dirtyfile
'
test_expect_success 'am -3 stops on conflict on unborn branch' '
git checkout -f --orphan orphan &&
git reset &&
rm -f file-1 otherfile-4 &&
test_must_fail git am -3 0003-*.patch &&
test 2 -eq $(git ls-files -u | wc -l) &&
test 4 = "$(cat otherfile-4)"
'
test_expect_success 'am -3 --skip clears index on unborn branch' '
test_path_is_dir .git/rebase-apply &&
echo tmpfile >tmpfile &&
git add tmpfile &&
git am --skip &&
test -z "$(git ls-files)" &&
test_path_is_missing otherfile-4 &&
test_path_is_missing tmpfile
'
test_expect_success 'am -3 --abort removes otherfile-4 on unborn branch' '
git checkout -f --orphan orphan &&
git reset &&
rm -f otherfile-4 file-1 &&
test_must_fail git am -3 0003-*.patch &&
test 2 -eq $(git ls-files -u | wc -l) &&
test 4 = "$(cat otherfile-4)" &&
git am --abort &&
test -z "$(git ls-files -u)" &&
test_path_is_missing otherfile-4
'
test_expect_success 'am -3 --abort on unborn branch removes applied commits' '
git checkout -f --orphan orphan &&
git reset &&
rm -f otherfile-4 otherfile-2 file-1 file-2 &&
test_must_fail git am -3 initial.patch 0003-*.patch &&
test 3 -eq $(git ls-files -u | wc -l) &&
test 4 = "$(cat otherfile-4)" &&
git am --abort &&
test -z "$(git ls-files -u)" &&
test_path_is_missing otherfile-4 &&
test_path_is_missing file-1 &&
test_path_is_missing file-2 &&
test 0 -eq $(git log --oneline 2>/dev/null | wc -l) &&
test refs/heads/orphan = "$(git symbolic-ref HEAD)"
'
test_expect_success 'am --abort on unborn branch will keep local commits intact' '
git checkout -f --orphan orphan &&
git reset &&
test_must_fail git am 0004-*.patch &&
test_commit unrelated2 &&
git rev-parse HEAD >expect &&
git am --abort &&
git rev-parse HEAD >actual &&
test_cmp expect actual
'
test_expect_success 'am --skip leaves index stat info alone' '
git checkout -f --orphan skip-stat-info &&
git reset &&
test_commit skip-should-be-untouched &&
test-tool chmtime =0 skip-should-be-untouched.t &&
git update-index --refresh &&
git diff-files --exit-code --quiet &&
test_must_fail git am 0001-*.patch &&
git am --skip &&
git diff-files --exit-code --quiet
'
test_expect_success 'am --abort leaves index stat info alone' '
git checkout -f --orphan abort-stat-info &&
git reset &&
test_commit abort-should-be-untouched &&
test-tool chmtime =0 abort-should-be-untouched.t &&
git update-index --refresh &&
git diff-files --exit-code --quiet &&
test_must_fail git am 0001-*.patch &&
git am --abort &&
git diff-files --exit-code --quiet
'
test_expect_success 'git am --abort return failed exit status when it fails' '
test_when_finished "rm -rf file-2/ && git reset --hard && git am --abort" &&
git checkout changes &&
git format-patch -1 --stdout conflicting >changes.mbox &&
test_must_fail git am --3way changes.mbox &&
git rm file-2 &&
mkdir file-2 &&
echo precious >file-2/somefile &&
test_must_fail git am --abort &&
test_path_is_dir file-2/
'
test_expect_success 'git am --abort cleans relevant files' '
git checkout changes &&
git format-patch -1 --stdout conflicting >changes.mbox &&
test_must_fail git am --3way changes.mbox &&
test_path_is_file new-file &&
echo further changes >>file-1 &&
echo change other file >>file-2 &&
# Abort, and expect the files touched by am to be reverted
git am --abort &&
test_path_is_missing new-file &&
# Files not involved in am operation are left modified
git diff --name-only changes >actual &&
test_write_lines file-2 >expect &&
test_cmp expect actual
'
test_done
|