Merge git://ozlabs.org/~paulus/gitk
[gitweb.git] / t / t7502-commit.sh
index 3f9fb55a48494f0096d9fd464dcf93009e523156..b1c76483866f55b4429fc76e7035e65984e7b4c2 100755 (executable)
@@ -4,6 +4,15 @@ test_description='git commit porcelain-ish'
 
 . ./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
+}
+
 # Arguments: [<prefix] [<commit message>] [<commit options>]
 check_summary_oneline() {
        test_tick &&
@@ -168,7 +177,7 @@ test_expect_success 'verbose respects diff config' '
        git config --unset color.diff
 '
 
-test_expect_success 'cleanup commit messages (verbatim,-t)' '
+test_expect_success 'cleanup commit messages (verbatim option,-t)' '
 
        echo >>negative &&
        { echo;echo "# text";echo; } >expect &&
@@ -178,7 +187,7 @@ test_expect_success 'cleanup commit messages (verbatim,-t)' '
 
 '
 
-test_expect_success 'cleanup commit messages (verbatim,-F)' '
+test_expect_success 'cleanup commit messages (verbatim option,-F)' '
 
        echo >>negative &&
        git commit --cleanup=verbatim -F expect -a &&
@@ -187,7 +196,7 @@ test_expect_success 'cleanup commit messages (verbatim,-F)' '
 
 '
 
-test_expect_success 'cleanup commit messages (verbatim,-m)' '
+test_expect_success 'cleanup commit messages (verbatim option,-m)' '
 
        echo >>negative &&
        git commit --cleanup=verbatim -m "$(cat expect)" -a &&
@@ -196,7 +205,7 @@ test_expect_success 'cleanup commit messages (verbatim,-m)' '
 
 '
 
-test_expect_success 'cleanup commit messages (whitespace,-F)' '
+test_expect_success 'cleanup commit messages (whitespace option,-F)' '
 
        echo >>negative &&
        { echo;echo "# text";echo; } >text &&
@@ -207,7 +216,7 @@ test_expect_success 'cleanup commit messages (whitespace,-F)' '
 
 '
 
-test_expect_success 'cleanup commit messages (strip,-F)' '
+test_expect_success 'cleanup commit messages (strip option,-F)' '
 
        echo >>negative &&
        { echo;echo "# text";echo sample;echo; } >text &&
@@ -218,7 +227,7 @@ test_expect_success 'cleanup commit messages (strip,-F)' '
 
 '
 
-test_expect_success 'cleanup commit messages (strip,-F,-e)' '
+test_expect_success 'cleanup commit messages (strip option,-F,-e)' '
 
        echo >>negative &&
        { echo;echo sample;echo; } >text &&
@@ -231,39 +240,90 @@ echo "sample
 # Please enter the commit message for your changes. Lines starting
 # with '#' will be ignored, and an empty message aborts the commit." >expect
 
-test_expect_success 'cleanup commit messages (strip,-F,-e): output' '
+test_expect_success 'cleanup commit messages (strip option,-F,-e): output' '
        test_i18ncmp expect actual
 '
 
-echo "#
-# Author:    $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>
-#" >> expect
+test_expect_success 'cleanup commit message (fail on invalid cleanup mode option)' '
+       test_must_fail git commit --cleanup=non-existent
+'
 
-test_expect_success 'author different from committer' '
-       echo >>negative &&
-       test_might_fail git commit -e -m "sample" &&
-       head -n 7 .git/COMMIT_EDITMSG >actual &&
-       test_i18ncmp expect actual
+test_expect_success 'cleanup commit message (fail on invalid cleanup mode configuration)' '
+       test_must_fail git -c commit.cleanup=non-existent commit
 '
 
-mv expect expect.tmp
-sed '$d' < expect.tmp > expect
-rm -f expect.tmp
-echo "# Committer:
-#" >> expect
+test_expect_success 'cleanup commit message (no config and no option uses default)' '
+       echo content >>file &&
+       git add file &&
+       test_set_editor "$TEST_DIRECTORY"/t7500/add-content-and-comment &&
+       git commit --no-status &&
+       commit_msg_is "commit message"
+'
 
-test_expect_success 'committer is automatic' '
+test_expect_success 'cleanup commit message (option overrides default)' '
+       echo content >>file &&
+       git add file &&
+       test_set_editor "$TEST_DIRECTORY"/t7500/add-content-and-comment &&
+       git commit --cleanup=whitespace --no-status &&
+       commit_msg_is "commit message # comment"
+'
+
+test_expect_success 'cleanup commit message (config overrides default)' '
+       echo content >>file &&
+       git add file &&
+       test_set_editor "$TEST_DIRECTORY"/t7500/add-content-and-comment &&
+       git -c commit.cleanup=whitespace commit --no-status &&
+       commit_msg_is "commit message # comment"
+'
+
+test_expect_success 'cleanup commit message (option overrides config)' '
+       echo content >>file &&
+       git add file &&
+       test_set_editor "$TEST_DIRECTORY"/t7500/add-content-and-comment &&
+       git -c commit.cleanup=whitespace commit --cleanup=default &&
+       commit_msg_is "commit message"
+'
+
+test_expect_success 'cleanup commit message (default, -m)' '
+       echo content >>file &&
+       git add file &&
+       git commit -m "message #comment " &&
+       commit_msg_is "message #comment"
+'
+
+test_expect_success 'cleanup commit message (whitespace option, -m)' '
+       echo content >>file &&
+       git add file &&
+       git commit --cleanup=whitespace --no-status -m "message #comment " &&
+       commit_msg_is "message #comment"
+'
+
+test_expect_success 'cleanup commit message (whitespace config, -m)' '
+       echo content >>file &&
+       git add file &&
+       git -c commit.cleanup=whitespace commit --no-status -m "message #comment " &&
+       commit_msg_is "message #comment"
+'
+
+test_expect_success 'message shows author when it is not equal to committer' '
+       echo >>negative &&
+       git commit -e -m "sample" -a &&
+       test_i18ngrep \
+         "^# Author: *A U Thor <author@example.com>\$" \
+         .git/COMMIT_EDITMSG
+'
+
+test_expect_success AUTOIDENT 'message shows committer when it is automatic' '
 
        echo >>negative &&
        (
                sane_unset GIT_COMMITTER_EMAIL &&
                sane_unset GIT_COMMITTER_NAME &&
-               # must fail because there is no change
-               test_must_fail git commit -e -m "sample"
+               git commit -e -m "sample" -a
        ) &&
-       head -n 8 .git/COMMIT_EDITMSG | \
-       sed "s/^# Committer: .*/# Committer:/" >actual
-       test_i18ncmp expect actual
+       # the ident is calculated from the system, so we cannot
+       # check the actual value, only that it is there
+       test_i18ngrep "^# Committer: " .git/COMMIT_EDITMSG
 '
 
 write_script .git/FAKE_EDITOR <<EOF
@@ -271,6 +331,21 @@ echo editor started > "$(pwd)/.git/result"
 exit 0
 EOF
 
+test_expect_success !AUTOIDENT 'do not fire editor when committer is bogus' '
+       >.git/result
+       >expect &&
+
+       echo >>negative &&
+       (
+               sane_unset GIT_COMMITTER_EMAIL &&
+               sane_unset GIT_COMMITTER_NAME &&
+               GIT_EDITOR="\"$(pwd)/.git/FAKE_EDITOR\"" &&
+               export GIT_EDITOR &&
+               test_must_fail git commit -e -m sample -a
+       ) &&
+       test_cmp expect .git/result
+'
+
 test_expect_success 'do not fire editor in the presence of conflicts' '
 
        git clean -f &&