t / t3501-revert-cherry-pick.shon commit Merge branch 'ab/grep-preparatory-cleanup' into sb/submodule-blanket-recursive (234b10d)
   1#!/bin/sh
   2
   3test_description='test cherry-pick and revert with renames
   4
   5  --
   6   + rename2: renames oops to opos
   7  +  rename1: renames oops to spoo
   8  +  added:   adds extra line to oops
   9  ++ initial: has lines in oops
  10
  11'
  12
  13. ./test-lib.sh
  14
  15test_expect_success setup '
  16
  17        for l in a b c d e f g h i j k l m n o
  18        do
  19                echo $l$l$l$l$l$l$l$l$l
  20        done >oops &&
  21
  22        test_tick &&
  23        git add oops &&
  24        git commit -m initial &&
  25        git tag initial &&
  26
  27        test_tick &&
  28        echo "Add extra line at the end" >>oops &&
  29        git commit -a -m added &&
  30        git tag added &&
  31
  32        test_tick &&
  33        git mv oops spoo &&
  34        git commit -m rename1 &&
  35        git tag rename1 &&
  36
  37        test_tick &&
  38        git checkout -b side initial &&
  39        git mv oops opos &&
  40        git commit -m rename2 &&
  41        git tag rename2
  42'
  43
  44test_expect_success 'cherry-pick --nonsense' '
  45
  46        pos=$(git rev-parse HEAD) &&
  47        git diff --exit-code HEAD &&
  48        test_must_fail git cherry-pick --nonsense 2>msg &&
  49        git diff --exit-code HEAD "$pos" &&
  50        test_i18ngrep '[Uu]sage:' msg
  51'
  52
  53test_expect_success 'revert --nonsense' '
  54
  55        pos=$(git rev-parse HEAD) &&
  56        git diff --exit-code HEAD &&
  57        test_must_fail git revert --nonsense 2>msg &&
  58        git diff --exit-code HEAD "$pos" &&
  59        test_i18ngrep '[Uu]sage:' msg
  60'
  61
  62test_expect_success 'cherry-pick after renaming branch' '
  63
  64        git checkout rename2 &&
  65        git cherry-pick added &&
  66        test $(git rev-parse HEAD^) = $(git rev-parse rename2) &&
  67        test -f opos &&
  68        grep "Add extra line at the end" opos &&
  69        git reflog -1 | grep cherry-pick
  70
  71'
  72
  73test_expect_success 'revert after renaming branch' '
  74
  75        git checkout rename1 &&
  76        git revert added &&
  77        test $(git rev-parse HEAD^) = $(git rev-parse rename1) &&
  78        test -f spoo &&
  79        ! grep "Add extra line at the end" spoo &&
  80        git reflog -1 | grep revert
  81
  82'
  83
  84test_expect_success 'cherry-pick on stat-dirty working tree' '
  85        git clone . copy &&
  86        (
  87                cd copy &&
  88                git checkout initial &&
  89                test-chmtime +40 oops &&
  90                git cherry-pick added
  91        )
  92'
  93
  94test_expect_success 'revert forbidden on dirty working tree' '
  95
  96        echo content >extra_file &&
  97        git add extra_file &&
  98        test_must_fail git revert HEAD 2>errors &&
  99        test_i18ngrep "your local changes would be overwritten by " errors
 100
 101'
 102
 103test_expect_success 'cherry-pick on unborn branch' '
 104        git checkout --orphan unborn &&
 105        git rm --cached -r . &&
 106        rm -rf * &&
 107        git cherry-pick initial &&
 108        git diff --quiet initial &&
 109        ! test_cmp_rev initial HEAD
 110'
 111
 112test_expect_success 'cherry-pick "-" to pick from previous branch' '
 113        git checkout unborn &&
 114        test_commit to-pick actual content &&
 115        git checkout master &&
 116        git cherry-pick - &&
 117        echo content >expect &&
 118        test_cmp expect actual
 119'
 120
 121test_expect_success 'cherry-pick "-" is meaningless without checkout' '
 122        test_create_repo afresh &&
 123        (
 124                cd afresh &&
 125                test_commit one &&
 126                test_commit two &&
 127                test_commit three &&
 128                test_must_fail git cherry-pick -
 129        )
 130'
 131
 132test_expect_success 'cherry-pick "-" works with arguments' '
 133        git checkout -b side-branch &&
 134        test_commit change actual change &&
 135        git checkout master &&
 136        git cherry-pick -s - &&
 137        echo "Signed-off-by: C O Mitter <committer@example.com>" >expect &&
 138        git cat-file commit HEAD | grep ^Signed-off-by: >signoff &&
 139        test_cmp expect signoff &&
 140        echo change >expect &&
 141        test_cmp expect actual
 142'
 143
 144test_expect_success 'cherry-pick works with dirty renamed file' '
 145        test_commit to-rename &&
 146        git checkout -b unrelated &&
 147        test_commit unrelated &&
 148        git checkout @{-1} &&
 149        git mv to-rename.t renamed &&
 150        test_tick &&
 151        git commit -m renamed &&
 152        echo modified >renamed &&
 153        git cherry-pick refs/heads/unrelated
 154'
 155
 156test_done