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 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332
|
#!/bin/sh
#
# Copyright (c) 2007 Steven Grimm
#
test_description='git commit
Tests for selected commit options.'
. ./test-lib.sh
commit_msg_is () {
expect=commit_msg_is.expect
actual=commit_msg_is.actual
printf "%s" "$(git log --pretty=format:%s%b -1)" >"$actual" &&
printf "%s" "$1" >"$expect" &&
test_i18ncmp "$expect" "$actual"
}
# A sanity check to see if commit is working at all.
test_expect_success 'a basic commit in an empty tree should succeed' '
echo content > foo &&
git add foo &&
git commit -m "initial commit"
'
test_expect_success 'nonexistent template file should return error' '
echo changes >> foo &&
git add foo &&
(
GIT_EDITOR="echo hello >\"\$1\"" &&
export GIT_EDITOR &&
test_must_fail git commit --template "$PWD"/notexist
)
'
test_expect_success 'nonexistent template file in config should return error' '
test_config commit.template "$PWD"/notexist &&
(
GIT_EDITOR="echo hello >\"\$1\"" &&
export GIT_EDITOR &&
test_must_fail git commit
)
'
# From now on we'll use a template file that exists.
TEMPLATE="$PWD"/template
test_expect_success 'unedited template should not commit' '
echo "template line" > "$TEMPLATE" &&
test_must_fail git commit --template "$TEMPLATE"
'
test_expect_success 'unedited template with comments should not commit' '
echo "# comment in template" >> "$TEMPLATE" &&
test_must_fail git commit --template "$TEMPLATE"
'
test_expect_success 'a Signed-off-by line by itself should not commit' '
(
test_set_editor "$TEST_DIRECTORY"/t7500/add-signed-off &&
test_must_fail git commit --template "$TEMPLATE"
)
'
test_expect_success 'adding comments to a template should not commit' '
(
test_set_editor "$TEST_DIRECTORY"/t7500/add-comments &&
test_must_fail git commit --template "$TEMPLATE"
)
'
test_expect_success 'adding real content to a template should commit' '
(
test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
git commit --template "$TEMPLATE"
) &&
commit_msg_is "template linecommit message"
'
test_expect_success '-t option should be short for --template' '
echo "short template" > "$TEMPLATE" &&
echo "new content" >> foo &&
git add foo &&
(
test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
git commit -t "$TEMPLATE"
) &&
commit_msg_is "short templatecommit message"
'
test_expect_success 'config-specified template should commit' '
echo "new template" > "$TEMPLATE" &&
test_config commit.template "$TEMPLATE" &&
echo "more content" >> foo &&
git add foo &&
(
test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
git commit
) &&
commit_msg_is "new templatecommit message"
'
test_expect_success 'explicit commit message should override template' '
echo "still more content" >> foo &&
git add foo &&
GIT_EDITOR="$TEST_DIRECTORY"/t7500/add-content git commit --template "$TEMPLATE" \
-m "command line msg" &&
commit_msg_is "command line msg"
'
test_expect_success 'commit message from file should override template' '
echo "content galore" >> foo &&
git add foo &&
echo "standard input msg" |
(
test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
git commit --template "$TEMPLATE" --file -
) &&
commit_msg_is "standard input msg"
'
cat >"$TEMPLATE" <<\EOF
### template
EOF
test_expect_success 'commit message from template with whitespace issue' '
echo "content galore" >>foo &&
git add foo &&
GIT_EDITOR="$TEST_DIRECTORY"/t7500/add-whitespaced-content git commit \
--template "$TEMPLATE" &&
commit_msg_is "commit message"
'
test_expect_success 'using alternate GIT_INDEX_FILE (1)' '
cp .git/index saved-index &&
(
echo some new content >file &&
GIT_INDEX_FILE=.git/another_index &&
export GIT_INDEX_FILE &&
git add file &&
git commit -m "commit using another index" &&
git diff-index --exit-code HEAD &&
git diff-files --exit-code
) &&
cmp .git/index saved-index >/dev/null
'
test_expect_success 'using alternate GIT_INDEX_FILE (2)' '
cp .git/index saved-index &&
(
rm -f .git/no-such-index &&
GIT_INDEX_FILE=.git/no-such-index &&
export GIT_INDEX_FILE &&
git commit -m "commit using nonexistent index" &&
test -z "$(git ls-files)" &&
test -z "$(git ls-tree HEAD)"
) &&
cmp .git/index saved-index >/dev/null
'
cat > expect << EOF
zort
Signed-off-by: C O Mitter <committer@example.com>
EOF
test_expect_success '--signoff' '
echo "yet another content *narf*" >> foo &&
echo "zort" | git commit -s -F - foo &&
git cat-file commit HEAD | sed "1,/^\$/d" > output &&
test_cmp expect output
'
test_expect_success 'commit message from file (1)' '
mkdir subdir &&
echo "Log in top directory" >log &&
echo "Log in sub directory" >subdir/log &&
(
cd subdir &&
git commit --allow-empty -F log
) &&
commit_msg_is "Log in sub directory"
'
test_expect_success 'commit message from file (2)' '
rm -f log &&
echo "Log in sub directory" >subdir/log &&
(
cd subdir &&
git commit --allow-empty -F log
) &&
commit_msg_is "Log in sub directory"
'
test_expect_success 'commit message from stdin' '
(
cd subdir &&
echo "Log with foo word" | git commit --allow-empty -F -
) &&
commit_msg_is "Log with foo word"
'
test_expect_success 'commit -F overrides -t' '
(
cd subdir &&
echo "-F log" > f.log &&
echo "-t template" > t.template &&
git commit --allow-empty -F f.log -t t.template
) &&
commit_msg_is "-F log"
'
test_expect_success 'Commit without message is allowed with --allow-empty-message' '
echo "more content" >>foo &&
git add foo &&
>empty &&
git commit --allow-empty-message <empty &&
commit_msg_is "" &&
git tag empty-message-commit
'
test_expect_success 'Commit without message is no-no without --allow-empty-message' '
echo "more content" >>foo &&
git add foo &&
>empty &&
test_must_fail git commit <empty
'
test_expect_success 'Commit a message with --allow-empty-message' '
echo "even more content" >>foo &&
git add foo &&
git commit --allow-empty-message -m"hello there" &&
commit_msg_is "hello there"
'
test_expect_success 'commit -C empty respects --allow-empty-message' '
echo more >>foo &&
git add foo &&
test_must_fail git commit -C empty-message-commit &&
git commit -C empty-message-commit --allow-empty-message &&
commit_msg_is ""
'
commit_for_rebase_autosquash_setup () {
echo "first content line" >>foo &&
git add foo &&
cat >log <<EOF &&
target message subject line
target message body line 1
target message body line 2
EOF
git commit -F log &&
echo "second content line" >>foo &&
git add foo &&
git commit -m "intermediate commit" &&
echo "third content line" >>foo &&
git add foo
}
test_expect_success 'commit --fixup provides correct one-line commit message' '
commit_for_rebase_autosquash_setup &&
git commit --fixup HEAD~1 &&
commit_msg_is "fixup! target message subject line"
'
test_expect_success 'commit --squash works with -F' '
commit_for_rebase_autosquash_setup &&
echo "log message from file" >msgfile &&
git commit --squash HEAD~1 -F msgfile &&
commit_msg_is "squash! target message subject linelog message from file"
'
test_expect_success 'commit --squash works with -m' '
commit_for_rebase_autosquash_setup &&
git commit --squash HEAD~1 -m "foo bar\nbaz" &&
commit_msg_is "squash! target message subject linefoo bar\nbaz"
'
test_expect_success 'commit --squash works with -C' '
commit_for_rebase_autosquash_setup &&
git commit --squash HEAD~1 -C HEAD &&
commit_msg_is "squash! target message subject lineintermediate commit"
'
test_expect_success 'commit --squash works with -c' '
commit_for_rebase_autosquash_setup &&
test_set_editor "$TEST_DIRECTORY"/t7500/edit-content &&
git commit --squash HEAD~1 -c HEAD &&
commit_msg_is "squash! target message subject lineedited commit"
'
test_expect_success 'commit --squash works with -C for same commit' '
commit_for_rebase_autosquash_setup &&
git commit --squash HEAD -C HEAD &&
commit_msg_is "squash! intermediate commit"
'
test_expect_success 'commit --squash works with -c for same commit' '
commit_for_rebase_autosquash_setup &&
test_set_editor "$TEST_DIRECTORY"/t7500/edit-content &&
git commit --squash HEAD -c HEAD &&
commit_msg_is "squash! edited commit"
'
test_expect_success 'commit --squash works with editor' '
commit_for_rebase_autosquash_setup &&
test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
git commit --squash HEAD~1 &&
commit_msg_is "squash! target message subject linecommit message"
'
test_expect_success 'invalid message options when using --fixup' '
echo changes >>foo &&
echo "message" >log &&
git add foo &&
test_must_fail git commit --fixup HEAD~1 --squash HEAD~2 &&
test_must_fail git commit --fixup HEAD~1 -C HEAD~2 &&
test_must_fail git commit --fixup HEAD~1 -c HEAD~2 &&
test_must_fail git commit --fixup HEAD~1 -m "cmdline message" &&
test_must_fail git commit --fixup HEAD~1 -F log
'
test_done
|