t / t3420-rebase-autostash.shon commit revision: new rev^-n shorthand for rev^n..rev (8779351)
   1#!/bin/sh
   2#
   3# Copyright (c) 2013 Ramkumar Ramachandra
   4#
   5
   6test_description='git rebase --autostash tests'
   7. ./test-lib.sh
   8
   9test_expect_success setup '
  10        echo hello-world >file0 &&
  11        git add . &&
  12        test_tick &&
  13        git commit -m "initial commit" &&
  14        git checkout -b feature-branch &&
  15        echo another-hello >file1 &&
  16        echo goodbye >file2 &&
  17        git add . &&
  18        test_tick &&
  19        git commit -m "second commit" &&
  20        echo final-goodbye >file3 &&
  21        git add . &&
  22        test_tick &&
  23        git commit -m "third commit" &&
  24        git checkout -b unrelated-onto-branch master &&
  25        echo unrelated >file4 &&
  26        git add . &&
  27        test_tick &&
  28        git commit -m "unrelated commit" &&
  29        git checkout -b related-onto-branch master &&
  30        echo conflicting-change >file2 &&
  31        git add . &&
  32        test_tick &&
  33        git commit -m "related commit"
  34'
  35
  36testrebase() {
  37        type=$1
  38        dotest=$2
  39
  40        test_expect_success "rebase$type: dirty worktree, --no-autostash" '
  41                test_config rebase.autostash true &&
  42                git reset --hard &&
  43                git checkout -b rebased-feature-branch feature-branch &&
  44                test_when_finished git branch -D rebased-feature-branch &&
  45                test_when_finished git checkout feature-branch &&
  46                echo dirty >>file3 &&
  47                test_must_fail git rebase$type --no-autostash unrelated-onto-branch
  48        '
  49
  50        test_expect_success "rebase$type: dirty worktree, non-conflicting rebase" '
  51                test_config rebase.autostash true &&
  52                git reset --hard &&
  53                git checkout -b rebased-feature-branch feature-branch &&
  54                test_when_finished git branch -D rebased-feature-branch &&
  55                echo dirty >>file3 &&
  56                git rebase$type unrelated-onto-branch &&
  57                grep unrelated file4 &&
  58                grep dirty file3 &&
  59                git checkout feature-branch
  60        '
  61
  62        test_expect_success "rebase$type: dirty index, non-conflicting rebase" '
  63                test_config rebase.autostash true &&
  64                git reset --hard &&
  65                git checkout -b rebased-feature-branch feature-branch &&
  66                test_when_finished git branch -D rebased-feature-branch &&
  67                echo dirty >>file3 &&
  68                git add file3 &&
  69                git rebase$type unrelated-onto-branch &&
  70                grep unrelated file4 &&
  71                grep dirty file3 &&
  72                git checkout feature-branch
  73        '
  74
  75        test_expect_success "rebase$type: conflicting rebase" '
  76                test_config rebase.autostash true &&
  77                git reset --hard &&
  78                git checkout -b rebased-feature-branch feature-branch &&
  79                test_when_finished git branch -D rebased-feature-branch &&
  80                echo dirty >>file3 &&
  81                test_must_fail git rebase$type related-onto-branch &&
  82                test_path_is_file $dotest/autostash &&
  83                ! grep dirty file3 &&
  84                rm -rf $dotest &&
  85                git reset --hard &&
  86                git checkout feature-branch
  87        '
  88
  89        test_expect_success "rebase$type: --continue" '
  90                test_config rebase.autostash true &&
  91                git reset --hard &&
  92                git checkout -b rebased-feature-branch feature-branch &&
  93                test_when_finished git branch -D rebased-feature-branch &&
  94                echo dirty >>file3 &&
  95                test_must_fail git rebase$type related-onto-branch &&
  96                test_path_is_file $dotest/autostash &&
  97                ! grep dirty file3 &&
  98                echo "conflicting-plus-goodbye" >file2 &&
  99                git add file2 &&
 100                git rebase --continue &&
 101                test_path_is_missing $dotest/autostash &&
 102                grep dirty file3 &&
 103                git checkout feature-branch
 104        '
 105
 106        test_expect_success "rebase$type: --skip" '
 107                test_config rebase.autostash true &&
 108                git reset --hard &&
 109                git checkout -b rebased-feature-branch feature-branch &&
 110                test_when_finished git branch -D rebased-feature-branch &&
 111                echo dirty >>file3 &&
 112                test_must_fail git rebase$type related-onto-branch &&
 113                test_path_is_file $dotest/autostash &&
 114                ! grep dirty file3 &&
 115                git rebase --skip &&
 116                test_path_is_missing $dotest/autostash &&
 117                grep dirty file3 &&
 118                git checkout feature-branch
 119        '
 120
 121        test_expect_success "rebase$type: --abort" '
 122                test_config rebase.autostash true &&
 123                git reset --hard &&
 124                git checkout -b rebased-feature-branch feature-branch &&
 125                test_when_finished git branch -D rebased-feature-branch &&
 126                echo dirty >>file3 &&
 127                test_must_fail git rebase$type related-onto-branch &&
 128                test_path_is_file $dotest/autostash &&
 129                ! grep dirty file3 &&
 130                git rebase --abort &&
 131                test_path_is_missing $dotest/autostash &&
 132                grep dirty file3 &&
 133                git checkout feature-branch
 134        '
 135
 136        test_expect_success "rebase$type: non-conflicting rebase, conflicting stash" '
 137                test_config rebase.autostash true &&
 138                git reset --hard &&
 139                git checkout -b rebased-feature-branch feature-branch &&
 140                test_when_finished git branch -D rebased-feature-branch &&
 141                echo dirty >file4 &&
 142                git add file4 &&
 143                git rebase$type unrelated-onto-branch &&
 144                test_path_is_missing $dotest &&
 145                git reset --hard &&
 146                grep unrelated file4 &&
 147                ! grep dirty file4 &&
 148                git checkout feature-branch &&
 149                git stash pop &&
 150                grep dirty file4
 151        '
 152}
 153
 154test_expect_success "rebase: fast-forward rebase" '
 155        test_config rebase.autostash true &&
 156        git reset --hard &&
 157        git checkout -b behind-feature-branch feature-branch~1 &&
 158        test_when_finished git branch -D behind-feature-branch &&
 159        echo dirty >>file1 &&
 160        git rebase feature-branch &&
 161        grep dirty file1 &&
 162        git checkout feature-branch
 163'
 164
 165test_expect_success "rebase: noop rebase" '
 166        test_config rebase.autostash true &&
 167        git reset --hard &&
 168        git checkout -b same-feature-branch feature-branch &&
 169        test_when_finished git branch -D same-feature-branch &&
 170        echo dirty >>file1 &&
 171        git rebase feature-branch &&
 172        grep dirty file1 &&
 173        git checkout feature-branch
 174'
 175
 176testrebase "" .git/rebase-apply
 177testrebase " --merge" .git/rebase-merge
 178testrebase " --interactive" .git/rebase-merge
 179
 180test_expect_success 'abort rebase -i with --autostash' '
 181        test_when_finished "git reset --hard" &&
 182        echo uncommitted-content >file0 &&
 183        (
 184                write_script abort-editor.sh <<-\EOF &&
 185                        echo >"$1"
 186                EOF
 187                test_set_editor "$(pwd)/abort-editor.sh" &&
 188                test_must_fail git rebase -i --autostash HEAD^ &&
 189                rm -f abort-editor.sh
 190        ) &&
 191        echo uncommitted-content >expected &&
 192        test_cmp expected file0
 193'
 194
 195test_expect_success 'restore autostash on editor failure' '
 196        test_when_finished "git reset --hard" &&
 197        echo uncommitted-content >file0 &&
 198        (
 199                test_set_editor "false" &&
 200                test_must_fail git rebase -i --autostash HEAD^
 201        ) &&
 202        echo uncommitted-content >expected &&
 203        test_cmp expected file0
 204'
 205
 206test_expect_success 'autostash is saved on editor failure with conflict' '
 207        test_when_finished "git reset --hard" &&
 208        echo uncommitted-content >file0 &&
 209        (
 210                write_script abort-editor.sh <<-\EOF &&
 211                        echo conflicting-content >file0
 212                        exit 1
 213                EOF
 214                test_set_editor "$(pwd)/abort-editor.sh" &&
 215                test_must_fail git rebase -i --autostash HEAD^ &&
 216                rm -f abort-editor.sh
 217        ) &&
 218        echo conflicting-content >expected &&
 219        test_cmp expected file0 &&
 220        git checkout file0 &&
 221        git stash pop &&
 222        echo uncommitted-content >expected &&
 223        test_cmp expected file0
 224'
 225
 226test_done