t / t7500-commit.shon commit builtin-commit: use reduce_heads() only when appropriate (cf10f9f)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Steven Grimm
   4#
   5
   6test_description='git commit
   7
   8Tests for selected commit options.'
   9
  10. ./test-lib.sh
  11
  12commit_msg_is () {
  13        test "`git log --pretty=format:%s%b -1`" = "$1"
  14}
  15
  16# A sanity check to see if commit is working at all.
  17test_expect_success 'a basic commit in an empty tree should succeed' '
  18        echo content > foo &&
  19        git add foo &&
  20        git commit -m "initial commit"
  21'
  22
  23test_expect_success 'nonexistent template file should return error' '
  24        echo changes >> foo &&
  25        git add foo &&
  26        test_must_fail git commit --template "$PWD"/notexist
  27'
  28
  29test_expect_success 'nonexistent template file in config should return error' '
  30        git config commit.template "$PWD"/notexist &&
  31        test_must_fail git commit &&
  32        git config --unset commit.template
  33'
  34
  35# From now on we'll use a template file that exists.
  36TEMPLATE="$PWD"/template
  37
  38test_expect_success 'unedited template should not commit' '
  39        echo "template line" > "$TEMPLATE" &&
  40        test_must_fail git commit --template "$TEMPLATE"
  41'
  42
  43test_expect_success 'unedited template with comments should not commit' '
  44        echo "# comment in template" >> "$TEMPLATE" &&
  45        test_must_fail git commit --template "$TEMPLATE"
  46'
  47
  48test_expect_success 'a Signed-off-by line by itself should not commit' '
  49        (
  50                test_set_editor "$TEST_DIRECTORY"/t7500/add-signed-off &&
  51                test_must_fail git commit --template "$TEMPLATE"
  52        )
  53'
  54
  55test_expect_success 'adding comments to a template should not commit' '
  56        (
  57                test_set_editor "$TEST_DIRECTORY"/t7500/add-comments &&
  58                test_must_fail git commit --template "$TEMPLATE"
  59        )
  60'
  61
  62test_expect_success 'adding real content to a template should commit' '
  63        (
  64                test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
  65                git commit --template "$TEMPLATE"
  66        ) &&
  67        commit_msg_is "template linecommit message"
  68'
  69
  70test_expect_success '-t option should be short for --template' '
  71        echo "short template" > "$TEMPLATE" &&
  72        echo "new content" >> foo &&
  73        git add foo &&
  74        (
  75                test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
  76                git commit -t "$TEMPLATE"
  77        ) &&
  78        commit_msg_is "short templatecommit message"
  79'
  80
  81test_expect_success 'config-specified template should commit' '
  82        echo "new template" > "$TEMPLATE" &&
  83        git config commit.template "$TEMPLATE" &&
  84        echo "more content" >> foo &&
  85        git add foo &&
  86        (
  87                test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
  88                git commit
  89        ) &&
  90        git config --unset commit.template &&
  91        commit_msg_is "new templatecommit message"
  92'
  93
  94test_expect_success 'explicit commit message should override template' '
  95        echo "still more content" >> foo &&
  96        git add foo &&
  97        GIT_EDITOR="$TEST_DIRECTORY"/t7500/add-content git commit --template "$TEMPLATE" \
  98                -m "command line msg" &&
  99        commit_msg_is "command line msg"
 100'
 101
 102test_expect_success 'commit message from file should override template' '
 103        echo "content galore" >> foo &&
 104        git add foo &&
 105        echo "standard input msg" |
 106        (
 107                test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
 108                git commit --template "$TEMPLATE" --file -
 109        ) &&
 110        commit_msg_is "standard input msg"
 111'
 112
 113test_expect_success 'using alternate GIT_INDEX_FILE (1)' '
 114
 115        cp .git/index saved-index &&
 116        (
 117                echo some new content >file &&
 118                GIT_INDEX_FILE=.git/another_index &&
 119                export GIT_INDEX_FILE &&
 120                git add file &&
 121                git commit -m "commit using another index" &&
 122                git diff-index --exit-code HEAD &&
 123                git diff-files --exit-code
 124        ) &&
 125        cmp .git/index saved-index >/dev/null
 126
 127'
 128
 129test_expect_success 'using alternate GIT_INDEX_FILE (2)' '
 130
 131        cp .git/index saved-index &&
 132        (
 133                rm -f .git/no-such-index &&
 134                GIT_INDEX_FILE=.git/no-such-index &&
 135                export GIT_INDEX_FILE &&
 136                git commit -m "commit using nonexistent index" &&
 137                test -z "$(git ls-files)" &&
 138                test -z "$(git ls-tree HEAD)"
 139
 140        ) &&
 141        cmp .git/index saved-index >/dev/null
 142'
 143
 144cat > expect << EOF
 145zort
 146
 147Signed-off-by: C O Mitter <committer@example.com>
 148EOF
 149
 150test_expect_success '--signoff' '
 151        echo "yet another content *narf*" >> foo &&
 152        echo "zort" | (
 153                test_set_editor "$TEST_DIRECTORY"/t7500/add-content &&
 154                git commit -s -F - foo
 155        ) &&
 156        git cat-file commit HEAD | sed "1,/^$/d" > output &&
 157        test_cmp expect output
 158'
 159
 160test_expect_success 'commit message from file (1)' '
 161        mkdir subdir &&
 162        echo "Log in top directory" >log &&
 163        echo "Log in sub directory" >subdir/log &&
 164        (
 165                cd subdir &&
 166                git commit --allow-empty -F log
 167        ) &&
 168        commit_msg_is "Log in sub directory"
 169'
 170
 171test_expect_success 'commit message from file (2)' '
 172        rm -f log &&
 173        echo "Log in sub directory" >subdir/log &&
 174        (
 175                cd subdir &&
 176                git commit --allow-empty -F log
 177        ) &&
 178        commit_msg_is "Log in sub directory"
 179'
 180
 181test_expect_success 'commit message from stdin' '
 182        (
 183                cd subdir &&
 184                echo "Log with foo word" | git commit --allow-empty -F -
 185        ) &&
 186        commit_msg_is "Log with foo word"
 187'
 188
 189test_done