t / t7501-commit.shon commit Add support for -p/--patch to git-commit (b4bd466)
   1#!/bin/sh
   2#
   3# Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
   4#
   5
   6# FIXME: Test the various index usages, -i and -o, test reflog,
   7# signoff
   8
   9test_description='git commit'
  10. ./test-lib.sh
  11
  12test_tick
  13
  14test_expect_success \
  15        "initial status" \
  16        "echo 'bongo bongo' >file &&
  17         git add file"
  18
  19test_expect_success C_LOCALE_OUTPUT \
  20        "Constructing initial commit" \
  21        "git status | grep 'Initial commit'"
  22
  23test_expect_success \
  24        "fail initial amend" \
  25        "test_must_fail git commit --amend"
  26
  27test_expect_success \
  28        "initial commit" \
  29        "git commit -m initial"
  30
  31test_expect_success \
  32        "invalid options 1" \
  33        "test_must_fail git commit -m foo -m bar -F file"
  34
  35test_expect_success \
  36        "invalid options 2" \
  37        "test_must_fail git commit -C HEAD -m illegal"
  38
  39test_expect_success \
  40        "using paths with -a" \
  41        "echo King of the bongo >file &&
  42        test_must_fail git commit -m foo -a file"
  43
  44test_expect_success PERL 'can use paths with --interactive' '
  45        echo bong-o-bong >file &&
  46        # 2: update, 1:st path, that is all, 7: quit
  47        ( echo 2; echo 1; echo; echo 7 ) |
  48        git commit -m foo --interactive file &&
  49        git reset --hard HEAD^
  50'
  51
  52test_expect_success \
  53        "using invalid commit with -C" \
  54        "test_must_fail git commit -C bogus"
  55
  56test_expect_success \
  57        "testing nothing to commit" \
  58        "test_must_fail git commit -m initial"
  59
  60test_expect_success \
  61        "next commit" \
  62        "echo 'bongo bongo bongo' >file \
  63         git commit -m next -a"
  64
  65test_expect_success \
  66        "commit message from non-existing file" \
  67        "echo 'more bongo: bongo bongo bongo bongo' >file && \
  68         test_must_fail git commit -F gah -a"
  69
  70# Empty except stray tabs and spaces on a few lines.
  71sed -e 's/@$//' >msg <<EOF
  72                @
  73
  74  @
  75Signed-off-by: hula
  76EOF
  77test_expect_success \
  78        "empty commit message" \
  79        "test_must_fail git commit -F msg -a"
  80
  81test_expect_success \
  82        "commit message from file" \
  83        "echo 'this is the commit message, coming from a file' >msg && \
  84         git commit -F msg -a"
  85
  86cat >editor <<\EOF
  87#!/bin/sh
  88sed -e "s/a file/an amend commit/g" < "$1" > "$1-"
  89mv "$1-" "$1"
  90EOF
  91chmod 755 editor
  92
  93test_expect_success \
  94        "amend commit" \
  95        "EDITOR=./editor git commit --amend"
  96
  97test_expect_success \
  98        "passing -m and -F" \
  99        "echo 'enough with the bongos' >file && \
 100         test_must_fail git commit -F msg -m amending ."
 101
 102test_expect_success \
 103        "using message from other commit" \
 104        "git commit -C HEAD^ ."
 105
 106cat >editor <<\EOF
 107#!/bin/sh
 108sed -e "s/amend/older/g"  < "$1" > "$1-"
 109mv "$1-" "$1"
 110EOF
 111chmod 755 editor
 112
 113test_expect_success \
 114        "editing message from other commit" \
 115        "echo 'hula hula' >file && \
 116         EDITOR=./editor git commit -c HEAD^ -a"
 117
 118test_expect_success \
 119        "message from stdin" \
 120        "echo 'silly new contents' >file && \
 121         echo commit message from stdin | git commit -F - -a"
 122
 123test_expect_success \
 124        "overriding author from command line" \
 125        "echo 'gak' >file && \
 126         git commit -m 'author' --author 'Rubber Duck <rduck@convoy.org>' -a >output 2>&1"
 127
 128test_expect_success \
 129        "commit --author output mentions author" \
 130        "grep Rubber.Duck output"
 131
 132test_expect_success PERL \
 133        "interactive add" \
 134        "echo 7 | git commit --interactive | grep 'What now'"
 135
 136test_expect_success \
 137        "showing committed revisions" \
 138        "git rev-list HEAD >current"
 139
 140cat >editor <<\EOF
 141#!/bin/sh
 142sed -e "s/good/bad/g" < "$1" > "$1-"
 143mv "$1-" "$1"
 144EOF
 145chmod 755 editor
 146
 147cat >msg <<EOF
 148A good commit message.
 149EOF
 150
 151test_expect_success \
 152        'editor not invoked if -F is given' '
 153         echo "moo" >file &&
 154         EDITOR=./editor git commit -a -F msg &&
 155         git show -s --pretty=format:"%s" | grep -q good &&
 156         echo "quack" >file &&
 157         echo "Another good message." | EDITOR=./editor git commit -a -F - &&
 158         git show -s --pretty=format:"%s" | grep -q good
 159         '
 160# We could just check the head sha1, but checking each commit makes it
 161# easier to isolate bugs.
 162
 163cat >expected <<\EOF
 16472c0dc9855b0c9dadcbfd5a31cab072e0cb774ca
 1659b88fc14ce6b32e3d9ee021531a54f18a5cf38a2
 1663536bbb352c3a1ef9a420f5b4242d48578b92aa7
 167d381ac431806e53f3dd7ac2f1ae0534f36d738b9
 1684fd44095ad6334f3ef72e4c5ec8ddf108174b54a
 169402702b49136e7587daa9280e91e4bb7cb2179f7
 170EOF
 171
 172test_expect_success \
 173    'validate git rev-list output.' \
 174    'test_cmp expected current'
 175
 176test_expect_success 'partial commit that involves removal (1)' '
 177
 178        git rm --cached file &&
 179        mv file elif &&
 180        git add elif &&
 181        git commit -m "Partial: add elif" elif &&
 182        git diff-tree --name-status HEAD^ HEAD >current &&
 183        echo "A elif" >expected &&
 184        test_cmp expected current
 185
 186'
 187
 188test_expect_success 'partial commit that involves removal (2)' '
 189
 190        git commit -m "Partial: remove file" file &&
 191        git diff-tree --name-status HEAD^ HEAD >current &&
 192        echo "D file" >expected &&
 193        test_cmp expected current
 194
 195'
 196
 197test_expect_success 'partial commit that involves removal (3)' '
 198
 199        git rm --cached elif &&
 200        echo elif >elif &&
 201        git commit -m "Partial: modify elif" elif &&
 202        git diff-tree --name-status HEAD^ HEAD >current &&
 203        echo "M elif" >expected &&
 204        test_cmp expected current
 205
 206'
 207
 208author="The Real Author <someguy@his.email.org>"
 209test_expect_success 'amend commit to fix author' '
 210
 211        oldtick=$GIT_AUTHOR_DATE &&
 212        test_tick &&
 213        git reset --hard &&
 214        git cat-file -p HEAD |
 215        sed -e "s/author.*/author $author $oldtick/" \
 216                -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
 217                expected &&
 218        git commit --amend --author="$author" &&
 219        git cat-file -p HEAD > current &&
 220        test_cmp expected current
 221
 222'
 223
 224test_expect_success 'amend commit to fix date' '
 225
 226        test_tick &&
 227        newtick=$GIT_AUTHOR_DATE &&
 228        git reset --hard &&
 229        git cat-file -p HEAD |
 230        sed -e "s/author.*/author $author $newtick/" \
 231                -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
 232                expected &&
 233        git commit --amend --date="$newtick" &&
 234        git cat-file -p HEAD > current &&
 235        test_cmp expected current
 236
 237'
 238
 239test_expect_success 'commit complains about bogus date' '
 240        test_must_fail git commit --amend --date=10.11.2010
 241'
 242
 243test_expect_success 'sign off (1)' '
 244
 245        echo 1 >positive &&
 246        git add positive &&
 247        git commit -s -m "thank you" &&
 248        git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
 249        (
 250                echo thank you
 251                echo
 252                git var GIT_COMMITTER_IDENT |
 253                sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
 254        ) >expected &&
 255        test_cmp expected actual
 256
 257'
 258
 259test_expect_success 'sign off (2)' '
 260
 261        echo 2 >positive &&
 262        git add positive &&
 263        existing="Signed-off-by: Watch This <watchthis@example.com>" &&
 264        git commit -s -m "thank you
 265
 266$existing" &&
 267        git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
 268        (
 269                echo thank you
 270                echo
 271                echo $existing
 272                git var GIT_COMMITTER_IDENT |
 273                sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
 274        ) >expected &&
 275        test_cmp expected actual
 276
 277'
 278
 279test_expect_success 'signoff gap' '
 280
 281        echo 3 >positive &&
 282        git add positive &&
 283        alt="Alt-RFC-822-Header: Value" &&
 284        git commit -s -m "welcome
 285
 286$alt" &&
 287        git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
 288        (
 289                echo welcome
 290                echo
 291                echo $alt
 292                git var GIT_COMMITTER_IDENT |
 293                sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
 294        ) >expected &&
 295        test_cmp expected actual
 296'
 297
 298test_expect_success 'signoff gap 2' '
 299
 300        echo 4 >positive &&
 301        git add positive &&
 302        alt="fixed: 34" &&
 303        git commit -s -m "welcome
 304
 305We have now
 306$alt" &&
 307        git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
 308        (
 309                echo welcome
 310                echo
 311                echo We have now
 312                echo $alt
 313                echo
 314                git var GIT_COMMITTER_IDENT |
 315                sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
 316        ) >expected &&
 317        test_cmp expected actual
 318'
 319
 320test_expect_success 'multiple -m' '
 321
 322        >negative &&
 323        git add negative &&
 324        git commit -m "one" -m "two" -m "three" &&
 325        git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
 326        (
 327                echo one
 328                echo
 329                echo two
 330                echo
 331                echo three
 332        ) >expected &&
 333        test_cmp expected actual
 334
 335'
 336
 337author="The Real Author <someguy@his.email.org>"
 338test_expect_success 'amend commit to fix author' '
 339
 340        oldtick=$GIT_AUTHOR_DATE &&
 341        test_tick &&
 342        git reset --hard &&
 343        git cat-file -p HEAD |
 344        sed -e "s/author.*/author $author $oldtick/" \
 345                -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
 346                expected &&
 347        git commit --amend --author="$author" &&
 348        git cat-file -p HEAD > current &&
 349        test_cmp expected current
 350
 351'
 352
 353test_expect_success 'git commit <file> with dirty index' '
 354        echo tacocat > elif &&
 355        echo tehlulz > chz &&
 356        git add chz &&
 357        git commit elif -m "tacocat is a palindrome" &&
 358        git show --stat | grep elif &&
 359        git diff --cached | grep chz
 360'
 361
 362test_expect_success 'same tree (single parent)' '
 363
 364        git reset --hard
 365
 366        if git commit -m empty
 367        then
 368                echo oops -- should have complained
 369                false
 370        else
 371                : happy
 372        fi
 373
 374'
 375
 376test_expect_success 'same tree (single parent) --allow-empty' '
 377
 378        git commit --allow-empty -m "forced empty" &&
 379        git cat-file commit HEAD | grep forced
 380
 381'
 382
 383test_expect_success 'same tree (merge and amend merge)' '
 384
 385        git checkout -b side HEAD^ &&
 386        echo zero >zero &&
 387        git add zero &&
 388        git commit -m "add zero" &&
 389        git checkout master &&
 390
 391        git merge -s ours side -m "empty ok" &&
 392        git diff HEAD^ HEAD >actual &&
 393        : >expected &&
 394        test_cmp expected actual &&
 395
 396        git commit --amend -m "empty really ok" &&
 397        git diff HEAD^ HEAD >actual &&
 398        : >expected &&
 399        test_cmp expected actual
 400
 401'
 402
 403test_expect_success 'amend using the message from another commit' '
 404
 405        git reset --hard &&
 406        test_tick &&
 407        git commit --allow-empty -m "old commit" &&
 408        old=$(git rev-parse --verify HEAD) &&
 409        test_tick &&
 410        git commit --allow-empty -m "new commit" &&
 411        new=$(git rev-parse --verify HEAD) &&
 412        test_tick &&
 413        git commit --allow-empty --amend -C "$old" &&
 414        git show --pretty="format:%ad %s" "$old" >expected &&
 415        git show --pretty="format:%ad %s" HEAD >actual &&
 416        test_cmp expected actual
 417
 418'
 419
 420test_expect_success 'amend using the message from a commit named with tag' '
 421
 422        git reset --hard &&
 423        test_tick &&
 424        git commit --allow-empty -m "old commit" &&
 425        old=$(git rev-parse --verify HEAD) &&
 426        git tag -a -m "tag on old" tagged-old HEAD &&
 427        test_tick &&
 428        git commit --allow-empty -m "new commit" &&
 429        new=$(git rev-parse --verify HEAD) &&
 430        test_tick &&
 431        git commit --allow-empty --amend -C tagged-old &&
 432        git show --pretty="format:%ad %s" "$old" >expected &&
 433        git show --pretty="format:%ad %s" HEAD >actual &&
 434        test_cmp expected actual
 435
 436'
 437
 438test_expect_success 'amend can copy notes' '
 439
 440        git config notes.rewrite.amend true &&
 441        git config notes.rewriteRef "refs/notes/*" &&
 442        test_commit foo &&
 443        git notes add -m"a note" &&
 444        test_tick &&
 445        git commit --amend -m"new foo" &&
 446        test "$(git notes show)" = "a note"
 447
 448'
 449
 450test_done