|
| 1 | +#!/bin/sh |
| 2 | + |
| 3 | +test_description='git am running' |
| 4 | + |
| 5 | +. ./test-lib.sh |
| 6 | + |
| 7 | +cat >msg <<EOF |
| 8 | +second |
| 9 | +
|
| 10 | +Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy |
| 11 | +eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam |
| 12 | +voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita |
| 13 | +kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem |
| 14 | +ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod |
| 15 | +tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At |
| 16 | +vero eos et accusam et justo duo dolores et ea rebum. |
| 17 | +
|
| 18 | + Duis autem vel eum iriure dolor in hendrerit in vulputate velit |
| 19 | + esse molestie consequat, vel illum dolore eu feugiat nulla facilisis |
| 20 | + at vero eros et accumsan et iusto odio dignissim qui blandit |
| 21 | + praesent luptatum zzril delenit augue duis dolore te feugait nulla |
| 22 | + facilisi. |
| 23 | +
|
| 24 | +
|
| 25 | +Lorem ipsum dolor sit amet, |
| 26 | +consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut |
| 27 | +laoreet dolore magna aliquam erat volutpat. |
| 28 | +
|
| 29 | + git |
| 30 | + --- |
| 31 | + +++ |
| 32 | +
|
| 33 | +Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit |
| 34 | +lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure |
| 35 | +dolor in hendrerit in vulputate velit esse molestie consequat, vel illum |
| 36 | +dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio |
| 37 | +dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te |
| 38 | +feugait nulla facilisi. |
| 39 | +EOF |
| 40 | + |
| 41 | +cat >failmail <<EOF |
| 42 | +From foo@example.com Fri May 23 10:43:49 2008 |
| 43 | +From: foo@example.com |
| 44 | +To: bar@example.com |
| 45 | +Subject: Re: [RFC/PATCH] git-foo.sh |
| 46 | +Date: Fri, 23 May 2008 05:23:42 +0200 |
| 47 | +
|
| 48 | +Sometimes we have to find out that there's nothing left. |
| 49 | +
|
| 50 | +EOF |
| 51 | + |
| 52 | +cat >pine <<EOF |
| 53 | +From MAILER-DAEMON Fri May 23 10:43:49 2008 |
| 54 | +Date: 23 May 2008 05:23:42 +0200 |
| 55 | +From: Mail System Internal Data <MAILER-DAEMON@example.com> |
| 56 | +Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA |
| 57 | +Message-ID: <foo-0001@example.com> |
| 58 | +
|
| 59 | +This text is part of the internal format of your mail folder, and is not |
| 60 | +a real message. It is created automatically by the mail system software. |
| 61 | +If deleted, important folder data will be lost, and it will be re-created |
| 62 | +with the data reset to initial values. |
| 63 | +
|
| 64 | +EOF |
| 65 | + |
| 66 | +echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected |
| 67 | + |
| 68 | +test_expect_success setup ' |
| 69 | + echo hello >file && |
| 70 | + git add file && |
| 71 | + test_tick && |
| 72 | + git commit -m first && |
| 73 | + git tag first && |
| 74 | + echo world >>file && |
| 75 | + git add file && |
| 76 | + test_tick && |
| 77 | + git commit -s -F msg && |
| 78 | + git tag second && |
| 79 | + git format-patch --stdout first >patch1 && |
| 80 | + sed -n -e "3,\$p" msg >file && |
| 81 | + git add file && |
| 82 | + test_tick && |
| 83 | + git commit -m third && |
| 84 | + git format-patch --stdout first >patch2 && |
| 85 | + git checkout -b lorem && |
| 86 | + sed -n -e "11,\$p" msg >file && |
| 87 | + head -n 9 msg >>file && |
| 88 | + test_tick && |
| 89 | + git commit -a -m "moved stuff" && |
| 90 | + echo goodbye >another && |
| 91 | + git add another && |
| 92 | + test_tick && |
| 93 | + git commit -m "added another file" && |
| 94 | + git format-patch --stdout master >lorem-move.patch |
| 95 | +' |
| 96 | + |
| 97 | +# reset time |
| 98 | +unset test_tick |
| 99 | +test_tick |
| 100 | + |
| 101 | +test_expect_success 'am applies patch correctly' ' |
| 102 | + git checkout first && |
| 103 | + test_tick && |
| 104 | + git am <patch1 && |
| 105 | + ! test -d .dotest && |
| 106 | + test -z "$(git diff second)" && |
| 107 | + test "$(git rev-parse second)" = "$(git rev-parse HEAD)" && |
| 108 | + test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)" |
| 109 | +' |
| 110 | + |
| 111 | +GIT_AUTHOR_NAME="Another Thor" |
| 112 | +GIT_AUTHOR_EMAIL="a.thor@example.com" |
| 113 | +GIT_COMMITTER_NAME="Co M Miter" |
| 114 | +GIT_COMMITTER_EMAIL="c.miter@example.com" |
| 115 | +export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL |
| 116 | + |
| 117 | +compare () { |
| 118 | + test "$(git cat-file commit "$2" | grep "^$1 ")" = \ |
| 119 | + "$(git cat-file commit "$3" | grep "^$1 ")" |
| 120 | +} |
| 121 | + |
| 122 | +test_expect_success 'am changes committer and keeps author' ' |
| 123 | + test_tick && |
| 124 | + git checkout first && |
| 125 | + git am patch2 && |
| 126 | + ! test -d .dotest && |
| 127 | + test "$(git rev-parse master^^)" = "$(git rev-parse HEAD^^)" && |
| 128 | + test -z "$(git diff master..HEAD)" && |
| 129 | + test -z "$(git diff master^..HEAD^)" && |
| 130 | + compare author master HEAD && |
| 131 | + compare author master^ HEAD^ && |
| 132 | + test "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" = \ |
| 133 | + "$(git log -1 --pretty=format:"%cn <%ce>" HEAD)" |
| 134 | +' |
| 135 | + |
| 136 | +test_expect_success 'am --signoff adds Signed-off-by: line' ' |
| 137 | + git checkout -b master2 first && |
| 138 | + git am --signoff <patch2 && |
| 139 | + echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >>expected && |
| 140 | + git cat-file commit HEAD^ | grep "Signed-off-by:" >actual && |
| 141 | + test_cmp actual expected && |
| 142 | + echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected && |
| 143 | + git cat-file commit HEAD | grep "Signed-off-by:" >actual && |
| 144 | + test_cmp actual expected |
| 145 | +' |
| 146 | + |
| 147 | +test_expect_success 'am stays in branch' ' |
| 148 | + test "refs/heads/master2" = "$(git symbolic-ref HEAD)" |
| 149 | +' |
| 150 | + |
| 151 | +test_expect_success 'am --signoff does not add Signed-off-by: line if already there' ' |
| 152 | + git format-patch --stdout HEAD^ >patch3 && |
| 153 | + sed -e "/^Subject/ s,\[PATCH,Re: Re: Re: & 1/5 v2," patch3 >patch4 |
| 154 | + git checkout HEAD^ && |
| 155 | + git am --signoff patch4 && |
| 156 | + test "$(git cat-file commit HEAD | grep -c "^Signed-off-by:")" -eq 1 |
| 157 | +' |
| 158 | + |
| 159 | +test_expect_success 'am without --keep removes Re: and [PATCH] stuff' ' |
| 160 | + test "$(git rev-parse HEAD)" = "$(git rev-parse master2)" |
| 161 | +' |
| 162 | + |
| 163 | +test_expect_success 'am --keep really keeps the subject' ' |
| 164 | + git checkout HEAD^ && |
| 165 | + git am --keep patch4 && |
| 166 | + ! test -d .dotest && |
| 167 | + git-cat-file commit HEAD | |
| 168 | + grep -q -F "Re: Re: Re: [PATCH 1/5 v2] third" |
| 169 | +' |
| 170 | + |
| 171 | +test_expect_success 'am -3 falls back to 3-way merge' ' |
| 172 | + git checkout -b lorem2 master2 && |
| 173 | + sed -n -e "3,\$p" msg >file && |
| 174 | + head -n 9 msg >>file && |
| 175 | + git add file && |
| 176 | + test_tick && |
| 177 | + git commit -m "copied stuff" && |
| 178 | + git am -3 lorem-move.patch && |
| 179 | + ! test -d .dotest && |
| 180 | + test -z "$(git diff lorem)" |
| 181 | +' |
| 182 | + |
| 183 | +test_expect_success 'am pauses on conflict' ' |
| 184 | + git checkout lorem2^^ && |
| 185 | + ! git am lorem-move.patch && |
| 186 | + test -d .dotest |
| 187 | +' |
| 188 | + |
| 189 | +test_expect_success 'am --skip works' ' |
| 190 | + git am --skip && |
| 191 | + ! test -d .dotest && |
| 192 | + test -z "$(git diff lorem2^^ -- file)" && |
| 193 | + test goodbye = "$(cat another)" |
| 194 | +' |
| 195 | + |
| 196 | +test_expect_success 'am --resolved works' ' |
| 197 | + git checkout lorem2^^ && |
| 198 | + ! git am lorem-move.patch && |
| 199 | + test -d .dotest && |
| 200 | + echo resolved >>file && |
| 201 | + git add file && |
| 202 | + git am --resolved && |
| 203 | + ! test -d .dotest && |
| 204 | + test goodbye = "$(cat another)" |
| 205 | +' |
| 206 | + |
| 207 | +test_expect_success 'am takes patches from a Pine mailbox' ' |
| 208 | + git checkout first && |
| 209 | + cat pine patch1 | git am && |
| 210 | + ! test -d .dotest && |
| 211 | + test -z "$(git diff master^..HEAD)" |
| 212 | +' |
| 213 | + |
| 214 | +test_expect_success 'am fails on mail without patch' ' |
| 215 | + ! git am <failmail && |
| 216 | + rm -r .dotest/ |
| 217 | +' |
| 218 | + |
| 219 | +test_expect_success 'am fails on empty patch' ' |
| 220 | + echo "---" >>failmail && |
| 221 | + ! git am <failmail && |
| 222 | + git am --skip && |
| 223 | + ! test -d .dotest |
| 224 | +' |
| 225 | + |
| 226 | +test_expect_success 'am works from stdin in subdirectory' ' |
| 227 | + rm -fr subdir && |
| 228 | + git checkout first && |
| 229 | + ( |
| 230 | + mkdir -p subdir && |
| 231 | + cd subdir && |
| 232 | + git am <../patch1 |
| 233 | + ) && |
| 234 | + test -z "$(git diff second)" |
| 235 | +' |
| 236 | + |
| 237 | +test_expect_success 'am works from file (relative path given) in subdirectory' ' |
| 238 | + rm -fr subdir && |
| 239 | + git checkout first && |
| 240 | + ( |
| 241 | + mkdir -p subdir && |
| 242 | + cd subdir && |
| 243 | + git am ../patch1 |
| 244 | + ) && |
| 245 | + test -z "$(git diff second)" |
| 246 | +' |
| 247 | + |
| 248 | +test_expect_success 'am works from file (absolute path given) in subdirectory' ' |
| 249 | + rm -fr subdir && |
| 250 | + git checkout first && |
| 251 | + P=$(pwd) && |
| 252 | + ( |
| 253 | + mkdir -p subdir && |
| 254 | + cd subdir && |
| 255 | + git am "$P/patch1" |
| 256 | + ) && |
| 257 | + test -z "$(git diff second)" |
| 258 | +' |
| 259 | + |
| 260 | +test_done |
0 commit comments