t / t3418-rebase-continue.shon commit Merge branch 'jk/fast-import-history-bugfix' (991fd97)
   1#!/bin/sh
   2
   3test_description='git rebase --continue tests'
   4
   5. ./test-lib.sh
   6
   7. "$TEST_DIRECTORY"/lib-rebase.sh
   8
   9set_fake_editor
  10
  11test_expect_success 'setup' '
  12        test_commit "commit-new-file-F1" F1 1 &&
  13        test_commit "commit-new-file-F2" F2 2 &&
  14
  15        git checkout -b topic HEAD^ &&
  16        test_commit "commit-new-file-F2-on-topic-branch" F2 22 &&
  17
  18        git checkout master
  19'
  20
  21test_expect_success 'interactive rebase --continue works with touched file' '
  22        rm -fr .git/rebase-* &&
  23        git reset --hard &&
  24        git checkout master &&
  25
  26        FAKE_LINES="edit 1" git rebase -i HEAD^ &&
  27        test-tool chmtime =-60 F1 &&
  28        git rebase --continue
  29'
  30
  31test_expect_success 'non-interactive rebase --continue works with touched file' '
  32        rm -fr .git/rebase-* &&
  33        git reset --hard &&
  34        git checkout master &&
  35
  36        test_must_fail git rebase --onto master master topic &&
  37        echo "Resolved" >F2 &&
  38        git add F2 &&
  39        test-tool chmtime =-60 F1 &&
  40        git rebase --continue
  41'
  42
  43test_expect_success 'rebase --continue can not be used with other options' '
  44        test_must_fail git rebase -v --continue &&
  45        test_must_fail git rebase --continue -v
  46'
  47
  48test_expect_success 'rebase --continue remembers merge strategy and options' '
  49        rm -fr .git/rebase-* &&
  50        git reset --hard commit-new-file-F2-on-topic-branch &&
  51        test_commit "commit-new-file-F3-on-topic-branch" F3 32 &&
  52        test_when_finished "rm -fr test-bin funny.was.run" &&
  53        mkdir test-bin &&
  54        cat >test-bin/git-merge-funny <<-EOF &&
  55        #!$SHELL_PATH
  56        case "\$1" in --opt) ;; *) exit 2 ;; esac
  57        shift &&
  58        >funny.was.run &&
  59        exec git merge-recursive "\$@"
  60        EOF
  61        chmod +x test-bin/git-merge-funny &&
  62        (
  63                PATH=./test-bin:$PATH &&
  64                test_must_fail git rebase -s funny -Xopt master topic
  65        ) &&
  66        test -f funny.was.run &&
  67        rm funny.was.run &&
  68        echo "Resolved" >F2 &&
  69        git add F2 &&
  70        (
  71                PATH=./test-bin:$PATH &&
  72                git rebase --continue
  73        ) &&
  74        test -f funny.was.run
  75'
  76
  77test_expect_success 'rebase -i --continue handles merge strategy and options' '
  78        rm -fr .git/rebase-* &&
  79        git reset --hard commit-new-file-F2-on-topic-branch &&
  80        test_commit "commit-new-file-F3-on-topic-branch-for-dash-i" F3 32 &&
  81        test_when_finished "rm -fr test-bin funny.was.run funny.args" &&
  82        mkdir test-bin &&
  83        cat >test-bin/git-merge-funny <<-EOF &&
  84        #!$SHELL_PATH
  85        echo "\$@" >>funny.args
  86        case "\$1" in --opt) ;; *) exit 2 ;; esac
  87        case "\$2" in --foo) ;; *) exit 2 ;; esac
  88        case "\$4" in --) ;; *) exit 2 ;; esac
  89        shift 2 &&
  90        >funny.was.run &&
  91        exec git merge-recursive "\$@"
  92        EOF
  93        chmod +x test-bin/git-merge-funny &&
  94        (
  95                PATH=./test-bin:$PATH &&
  96                test_must_fail git rebase -i -s funny -Xopt -Xfoo master topic
  97        ) &&
  98        test -f funny.was.run &&
  99        rm funny.was.run &&
 100        echo "Resolved" >F2 &&
 101        git add F2 &&
 102        (
 103                PATH=./test-bin:$PATH &&
 104                git rebase --continue
 105        ) &&
 106        test -f funny.was.run
 107'
 108
 109test_expect_success REBASE_P 'rebase passes merge strategy options correctly' '
 110        rm -fr .git/rebase-* &&
 111        git reset --hard commit-new-file-F3-on-topic-branch &&
 112        test_commit theirs-to-merge &&
 113        git reset --hard HEAD^ &&
 114        test_commit some-commit &&
 115        test_tick &&
 116        git merge --no-ff theirs-to-merge &&
 117        FAKE_LINES="1 edit 2 3" git rebase -i -f -p -m \
 118                -s recursive --strategy-option=theirs HEAD~2 &&
 119        test_commit force-change &&
 120        git rebase --continue
 121'
 122
 123test_expect_success 'rebase -r passes merge strategy options correctly' '
 124        rm -fr .git/rebase-* &&
 125        git reset --hard commit-new-file-F3-on-topic-branch &&
 126        test_commit merge-theirs &&
 127        git reset --hard HEAD^ &&
 128        test_commit some-other-commit &&
 129        test_tick &&
 130        git merge --no-ff merge-theirs &&
 131        FAKE_LINES="1 3 edit 4 5 7 8 9" git rebase -i -f -r -m \
 132                -s recursive --strategy-option=theirs HEAD~2 &&
 133        test_commit force-change-ours &&
 134        git rebase --continue
 135'
 136
 137test_expect_success '--skip after failed fixup cleans commit message' '
 138        test_when_finished "test_might_fail git rebase --abort" &&
 139        git checkout -b with-conflicting-fixup &&
 140        test_commit wants-fixup &&
 141        test_commit "fixup! wants-fixup" wants-fixup.t 1 wants-fixup-1 &&
 142        test_commit "fixup! wants-fixup" wants-fixup.t 2 wants-fixup-2 &&
 143        test_commit "fixup! wants-fixup" wants-fixup.t 3 wants-fixup-3 &&
 144        test_must_fail env FAKE_LINES="1 fixup 2 squash 4" \
 145                git rebase -i HEAD~4 &&
 146
 147        : now there is a conflict, and comments in the commit message &&
 148        git show HEAD >out &&
 149        grep "fixup! wants-fixup" out &&
 150
 151        : skip and continue &&
 152        echo "cp \"\$1\" .git/copy.txt" | write_script copy-editor.sh &&
 153        (test_set_editor "$PWD/copy-editor.sh" && git rebase --skip) &&
 154
 155        : the user should not have had to edit the commit message &&
 156        test_path_is_missing .git/copy.txt &&
 157
 158        : now the comments in the commit message should have been cleaned up &&
 159        git show HEAD >out &&
 160        ! grep "fixup! wants-fixup" out &&
 161
 162        : now, let us ensure that "squash" is handled correctly &&
 163        git reset --hard wants-fixup-3 &&
 164        test_must_fail env FAKE_LINES="1 squash 4 squash 2 squash 4" \
 165                git rebase -i HEAD~4 &&
 166
 167        : the first squash failed, but there are two more in the chain &&
 168        (test_set_editor "$PWD/copy-editor.sh" &&
 169         test_must_fail git rebase --skip) &&
 170
 171        : not the final squash, no need to edit the commit message &&
 172        test_path_is_missing .git/copy.txt &&
 173
 174        : The first squash was skipped, therefore: &&
 175        git show HEAD >out &&
 176        test_i18ngrep "# This is a combination of 2 commits" out &&
 177        test_i18ngrep "# This is the commit message #2:" out &&
 178
 179        (test_set_editor "$PWD/copy-editor.sh" && git rebase --skip) &&
 180        git show HEAD >out &&
 181        test_i18ngrep ! "# This is a combination" out &&
 182
 183        : Final squash failed, but there was still a squash &&
 184        test_i18ngrep "# This is a combination of 2 commits" .git/copy.txt &&
 185        test_i18ngrep "# This is the commit message #2:" .git/copy.txt
 186'
 187
 188test_expect_success 'setup rerere database' '
 189        rm -fr .git/rebase-* &&
 190        git reset --hard commit-new-file-F3-on-topic-branch &&
 191        git checkout master &&
 192        test_commit "commit-new-file-F3" F3 3 &&
 193        test_config rerere.enabled true &&
 194        git update-ref refs/heads/topic commit-new-file-F3-on-topic-branch &&
 195        test_must_fail git rebase -m master topic &&
 196        echo "Resolved" >F2 &&
 197        cp F2 expected-F2 &&
 198        git add F2 &&
 199        test_must_fail git rebase --continue &&
 200        echo "Resolved" >F3 &&
 201        cp F3 expected-F3 &&
 202        git add F3 &&
 203        git rebase --continue &&
 204        git reset --hard topic@{1}
 205'
 206
 207prepare () {
 208        rm -fr .git/rebase-* &&
 209        git reset --hard commit-new-file-F3-on-topic-branch &&
 210        git checkout master &&
 211        test_config rerere.enabled true
 212}
 213
 214test_rerere_autoupdate () {
 215        action=$1 &&
 216        test_expect_success "rebase $action --continue remembers --rerere-autoupdate" '
 217                prepare &&
 218                test_must_fail git rebase $action --rerere-autoupdate master topic &&
 219                test_cmp expected-F2 F2 &&
 220                git diff-files --quiet &&
 221                test_must_fail git rebase --continue &&
 222                test_cmp expected-F3 F3 &&
 223                git diff-files --quiet &&
 224                git rebase --continue
 225        '
 226
 227        test_expect_success "rebase $action --continue honors rerere.autoUpdate" '
 228                prepare &&
 229                test_config rerere.autoupdate true &&
 230                test_must_fail git rebase $action master topic &&
 231                test_cmp expected-F2 F2 &&
 232                git diff-files --quiet &&
 233                test_must_fail git rebase --continue &&
 234                test_cmp expected-F3 F3 &&
 235                git diff-files --quiet &&
 236                git rebase --continue
 237        '
 238
 239        test_expect_success "rebase $action --continue remembers --no-rerere-autoupdate" '
 240                prepare &&
 241                test_config rerere.autoupdate true &&
 242                test_must_fail git rebase $action --no-rerere-autoupdate master topic &&
 243                test_cmp expected-F2 F2 &&
 244                test_must_fail git diff-files --quiet &&
 245                git add F2 &&
 246                test_must_fail git rebase --continue &&
 247                test_cmp expected-F3 F3 &&
 248                test_must_fail git diff-files --quiet &&
 249                git add F3 &&
 250                git rebase --continue
 251        '
 252}
 253
 254test_rerere_autoupdate
 255test_rerere_autoupdate -m
 256GIT_SEQUENCE_EDITOR=: && export GIT_SEQUENCE_EDITOR
 257test_rerere_autoupdate -i
 258test_have_prereq !REBASE_P || test_rerere_autoupdate --preserve-merges
 259unset GIT_SEQUENCE_EDITOR
 260
 261test_expect_success 'the todo command "break" works' '
 262        rm -f execed &&
 263        FAKE_LINES="break b exec_>execed" git rebase -i HEAD &&
 264        test_path_is_missing execed &&
 265        git rebase --continue &&
 266        test_path_is_missing execed &&
 267        git rebase --continue &&
 268        test_path_is_file execed
 269'
 270
 271test_expect_success '--reschedule-failed-exec' '
 272        test_when_finished "git rebase --abort" &&
 273        test_must_fail git rebase -x false --reschedule-failed-exec HEAD^ &&
 274        grep "^exec false" .git/rebase-merge/git-rebase-todo &&
 275        git rebase --abort &&
 276        test_must_fail git -c rebase.rescheduleFailedExec=true \
 277                rebase -x false HEAD^ 2>err &&
 278        grep "^exec false" .git/rebase-merge/git-rebase-todo &&
 279        test_i18ngrep "has been rescheduled" err
 280'
 281
 282test_expect_success 'rebase.reschedulefailedexec only affects `rebase -i`' '
 283        test_config rebase.reschedulefailedexec true &&
 284        test_must_fail git rebase -x false HEAD^ &&
 285        grep "^exec false" .git/rebase-merge/git-rebase-todo &&
 286        git rebase --abort &&
 287        git rebase HEAD^
 288'
 289
 290test_done