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