t / t3400-rebase.shon commit Merge branch 'ic/maint-rebase-i-abort' (9cb16a9)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Amos Waterland
   4#
   5
   6test_description='git rebase assorted tests
   7
   8This test runs git rebase and checks that the author information is not lost
   9among other things.
  10'
  11. ./test-lib.sh
  12
  13GIT_AUTHOR_EMAIL=bogus_email_address
  14export GIT_AUTHOR_EMAIL
  15
  16test_expect_success \
  17    'prepare repository with topic branches' \
  18    'git config core.logAllRefUpdates true &&
  19     echo First > A &&
  20     git update-index --add A &&
  21     git commit -m "Add A." &&
  22     git checkout -b my-topic-branch &&
  23     echo Second > B &&
  24     git update-index --add B &&
  25     git commit -m "Add B." &&
  26     git checkout -f master &&
  27     echo Third >> A &&
  28     git update-index A &&
  29     git commit -m "Modify A." &&
  30     git checkout -b side my-topic-branch &&
  31     echo Side >> C &&
  32     git add C &&
  33     git commit -m "Add C" &&
  34     git checkout -b nonlinear my-topic-branch &&
  35     echo Edit >> B &&
  36     git add B &&
  37     git commit -m "Modify B" &&
  38     git merge side &&
  39     git checkout -b upstream-merged-nonlinear &&
  40     git merge master &&
  41     git checkout -f my-topic-branch &&
  42     git tag topic
  43'
  44
  45test_expect_success 'rebase on dirty worktree' '
  46     echo dirty >> A &&
  47     test_must_fail git rebase master'
  48
  49test_expect_success 'rebase on dirty cache' '
  50     git add A &&
  51     test_must_fail git rebase master'
  52
  53test_expect_success 'rebase against master' '
  54     git reset --hard HEAD &&
  55     git rebase master'
  56
  57test_expect_success 'rebase against master twice' '
  58     git rebase master >out &&
  59     grep "Current branch my-topic-branch is up to date" out
  60'
  61
  62test_expect_success 'rebase against master twice with --force' '
  63     git rebase --force-rebase master >out &&
  64     grep "Current branch my-topic-branch is up to date, rebase forced" out
  65'
  66
  67test_expect_success 'rebase against master twice from another branch' '
  68     git checkout my-topic-branch^ &&
  69     git rebase master my-topic-branch >out &&
  70     grep "Current branch my-topic-branch is up to date" out
  71'
  72
  73test_expect_success 'rebase fast-forward to master' '
  74     git checkout my-topic-branch^ &&
  75     git rebase my-topic-branch >out &&
  76     grep "Fast-forwarded HEAD to my-topic-branch" out
  77'
  78
  79test_expect_success \
  80    'the rebase operation should not have destroyed author information' \
  81    '! (git log | grep "Author:" | grep "<>")'
  82
  83test_expect_success 'HEAD was detached during rebase' '
  84     test $(git rev-parse HEAD@{1}) != $(git rev-parse my-topic-branch@{1})
  85'
  86
  87test_expect_success 'rebase after merge master' '
  88     git reset --hard topic &&
  89     git merge master &&
  90     git rebase master &&
  91     ! (git show | grep "^Merge:")
  92'
  93
  94test_expect_success 'rebase of history with merges is linearized' '
  95     git checkout nonlinear &&
  96     test 4 = $(git rev-list master.. | wc -l) &&
  97     git rebase master &&
  98     test 3 = $(git rev-list master.. | wc -l)
  99'
 100
 101test_expect_success \
 102    'rebase of history with merges after upstream merge is linearized' '
 103     git checkout upstream-merged-nonlinear &&
 104     test 5 = $(git rev-list master.. | wc -l) &&
 105     git rebase master &&
 106     test 3 = $(git rev-list master.. | wc -l)
 107'
 108
 109test_expect_success 'rebase a single mode change' '
 110     git checkout master &&
 111     echo 1 > X &&
 112     git add X &&
 113     test_tick &&
 114     git commit -m prepare &&
 115     git checkout -b modechange HEAD^ &&
 116     echo 1 > X &&
 117     git add X &&
 118     test_chmod +x A &&
 119     test_tick &&
 120     git commit -m modechange &&
 121     GIT_TRACE=1 git rebase master
 122'
 123
 124test_expect_success 'Show verbose error when HEAD could not be detached' '
 125     : > B &&
 126     test_must_fail git rebase topic 2> output.err > output.out &&
 127     grep "Untracked working tree file .B. would be overwritten" output.err
 128'
 129rm -f B
 130
 131test_expect_success 'dump usage when upstream arg is missing' '
 132     git checkout -b usage topic &&
 133     test_must_fail git rebase 2>error1 &&
 134     grep "[Uu]sage" error1 &&
 135     test_must_fail git rebase --abort 2>error2 &&
 136     grep "No rebase in progress" error2 &&
 137     test_must_fail git rebase --onto master 2>error3 &&
 138     grep "[Uu]sage" error3 &&
 139     ! grep "can.t shift" error3
 140'
 141
 142test_expect_success 'rebase -q is quiet' '
 143     git checkout -b quiet topic &&
 144     git rebase -q master > output.out 2>&1 &&
 145     test ! -s output.out
 146'
 147
 148test_expect_success 'Rebase a commit that sprinkles CRs in' '
 149        (
 150                echo "One"
 151                echo "TwoQ"
 152                echo "Three"
 153                echo "FQur"
 154                echo "Five"
 155        ) | q_to_cr >CR &&
 156        git add CR &&
 157        test_tick &&
 158        git commit -a -m "A file with a line with CR" &&
 159        git tag file-with-cr &&
 160        git checkout HEAD^0 &&
 161        git rebase --onto HEAD^^ HEAD^ &&
 162        git diff --exit-code file-with-cr:CR HEAD:CR
 163'
 164
 165test_expect_success 'rebase can copy notes' '
 166        git config notes.rewrite.rebase true &&
 167        git config notes.rewriteRef "refs/notes/*" &&
 168        test_commit n1 &&
 169        test_commit n2 &&
 170        test_commit n3 &&
 171        git notes add -m"a note" n3 &&
 172        git rebase --onto n1 n2 &&
 173        test "a note" = "$(git notes show HEAD)"
 174'
 175
 176test_expect_success 'rebase -m can copy notes' '
 177        git reset --hard n3 &&
 178        git rebase -m --onto n1 n2 &&
 179        test "a note" = "$(git notes show HEAD)"
 180'
 181
 182test_done