t / t3415-rebase-autosquash.shon commit Merge branch 'jn/fast-import-fix' (ed8298d)
   1#!/bin/sh
   2
   3test_description='auto squash'
   4
   5. ./test-lib.sh
   6
   7test_expect_success setup '
   8        echo 0 >file0 &&
   9        git add . &&
  10        test_tick &&
  11        git commit -m "initial commit" &&
  12        echo 0 >file1 &&
  13        echo 2 >file2 &&
  14        git add . &&
  15        test_tick &&
  16        git commit -m "first commit" &&
  17        echo 3 >file3 &&
  18        git add . &&
  19        test_tick &&
  20        git commit -m "second commit" &&
  21        git tag base
  22'
  23
  24test_auto_fixup() {
  25        git reset --hard base &&
  26        echo 1 >file1 &&
  27        git add -u &&
  28        test_tick &&
  29        git commit -m "fixup! first" &&
  30
  31        git tag $1 &&
  32        test_tick &&
  33        git rebase $2 -i HEAD^^^ &&
  34        git log --oneline >actual &&
  35        test 3 = $(wc -l <actual) &&
  36        git diff --exit-code $1 &&
  37        test 1 = "$(git cat-file blob HEAD^:file1)" &&
  38        test 1 = $(git cat-file commit HEAD^ | grep first | wc -l)
  39}
  40
  41test_expect_success 'auto fixup (option)' '
  42        test_auto_fixup final-fixup-option --autosquash
  43'
  44
  45test_expect_success 'auto fixup (config)' '
  46        git config rebase.autosquash true &&
  47        test_auto_fixup final-fixup-config-true &&
  48        test_must_fail test_auto_fixup fixup-config-true-no --no-autosquash &&
  49        git config rebase.autosquash false &&
  50        test_must_fail test_auto_fixup final-fixup-config-false
  51'
  52
  53test_auto_squash() {
  54        git reset --hard base &&
  55        echo 1 >file1 &&
  56        git add -u &&
  57        test_tick &&
  58        git commit -m "squash! first" &&
  59
  60        git tag $1 &&
  61        test_tick &&
  62        git rebase $2 -i HEAD^^^ &&
  63        git log --oneline >actual &&
  64        test 3 = $(wc -l <actual) &&
  65        git diff --exit-code $1 &&
  66        test 1 = "$(git cat-file blob HEAD^:file1)" &&
  67        test 2 = $(git cat-file commit HEAD^ | grep first | wc -l)
  68}
  69
  70test_expect_success 'auto squash (option)' '
  71        test_auto_squash final-squash --autosquash
  72'
  73
  74test_expect_success 'auto squash (config)' '
  75        git config rebase.autosquash true &&
  76        test_auto_squash final-squash-config-true &&
  77        test_must_fail test_auto_squash squash-config-true-no --no-autosquash &&
  78        git config rebase.autosquash false &&
  79        test_must_fail test_auto_squash final-squash-config-false
  80'
  81
  82test_expect_success 'misspelled auto squash' '
  83        git reset --hard base &&
  84        echo 1 >file1 &&
  85        git add -u &&
  86        test_tick &&
  87        git commit -m "squash! forst" &&
  88        git tag final-missquash &&
  89        test_tick &&
  90        git rebase --autosquash -i HEAD^^^ &&
  91        git log --oneline >actual &&
  92        test 4 = $(wc -l <actual) &&
  93        git diff --exit-code final-missquash &&
  94        test 0 = $(git rev-list final-missquash...HEAD | wc -l)
  95'
  96
  97test_expect_success 'auto squash that matches 2 commits' '
  98        git reset --hard base &&
  99        echo 4 >file4 &&
 100        git add file4 &&
 101        test_tick &&
 102        git commit -m "first new commit" &&
 103        echo 1 >file1 &&
 104        git add -u &&
 105        test_tick &&
 106        git commit -m "squash! first" &&
 107        git tag final-multisquash &&
 108        test_tick &&
 109        git rebase --autosquash -i HEAD~4 &&
 110        git log --oneline >actual &&
 111        test 4 = $(wc -l <actual) &&
 112        git diff --exit-code final-multisquash &&
 113        test 1 = "$(git cat-file blob HEAD^^:file1)" &&
 114        test 2 = $(git cat-file commit HEAD^^ | grep first | wc -l) &&
 115        test 1 = $(git cat-file commit HEAD | grep first | wc -l)
 116'
 117
 118test_expect_success 'auto squash that matches a commit after the squash' '
 119        git reset --hard base &&
 120        echo 1 >file1 &&
 121        git add -u &&
 122        test_tick &&
 123        git commit -m "squash! third" &&
 124        echo 4 >file4 &&
 125        git add file4 &&
 126        test_tick &&
 127        git commit -m "third commit" &&
 128        git tag final-presquash &&
 129        test_tick &&
 130        git rebase --autosquash -i HEAD~4 &&
 131        git log --oneline >actual &&
 132        test 5 = $(wc -l <actual) &&
 133        git diff --exit-code final-presquash &&
 134        test 0 = "$(git cat-file blob HEAD^^:file1)" &&
 135        test 1 = "$(git cat-file blob HEAD^:file1)" &&
 136        test 1 = $(git cat-file commit HEAD | grep third | wc -l) &&
 137        test 1 = $(git cat-file commit HEAD^ | grep third | wc -l)
 138'
 139test_expect_success 'auto squash that matches a sha1' '
 140        git reset --hard base &&
 141        echo 1 >file1 &&
 142        git add -u &&
 143        test_tick &&
 144        git commit -m "squash! $(git rev-parse --short HEAD^)" &&
 145        git tag final-shasquash &&
 146        test_tick &&
 147        git rebase --autosquash -i HEAD^^^ &&
 148        git log --oneline >actual &&
 149        test 3 = $(wc -l <actual) &&
 150        git diff --exit-code final-shasquash &&
 151        test 1 = "$(git cat-file blob HEAD^:file1)" &&
 152        test 1 = $(git cat-file commit HEAD^ | grep squash | wc -l)
 153'
 154
 155test_expect_success 'auto squash that matches longer sha1' '
 156        git reset --hard base &&
 157        echo 1 >file1 &&
 158        git add -u &&
 159        test_tick &&
 160        git commit -m "squash! $(git rev-parse --short=11 HEAD^)" &&
 161        git tag final-longshasquash &&
 162        test_tick &&
 163        git rebase --autosquash -i HEAD^^^ &&
 164        git log --oneline >actual &&
 165        test 3 = $(wc -l <actual) &&
 166        git diff --exit-code final-longshasquash &&
 167        test 1 = "$(git cat-file blob HEAD^:file1)" &&
 168        test 1 = $(git cat-file commit HEAD^ | grep squash | wc -l)
 169'
 170
 171test_done