t / t3511-cherry-pick-x.shon commit merge: detect delete/modechange conflict (72fac66)
   1#!/bin/sh
   2
   3test_description='Test cherry-pick -x and -s'
   4
   5. ./test-lib.sh
   6
   7pristine_detach () {
   8        git cherry-pick --quit &&
   9        git checkout -f "$1^0" &&
  10        git read-tree -u --reset HEAD &&
  11        git clean -d -f -f -q -x
  12}
  13
  14mesg_one_line='base: commit message'
  15
  16mesg_no_footer="$mesg_one_line
  17
  18OneWordBodyThatsNotA-S-o-B"
  19
  20mesg_with_footer="$mesg_no_footer
  21
  22Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
  23Signed-off-by: A.U. Thor <author@example.com>
  24Signed-off-by: B.U. Thor <buthor@example.com>"
  25
  26mesg_broken_footer="$mesg_no_footer
  27
  28The signed-off-by string should begin with the words Signed-off-by followed
  29by a colon and space, and then the signers name and email address. e.g.
  30Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
  31
  32mesg_with_footer_sob="$mesg_with_footer
  33Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
  34
  35mesg_with_cherry_footer="$mesg_with_footer_sob
  36(cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709)
  37Tested-by: C.U. Thor <cuthor@example.com>"
  38
  39
  40test_expect_success setup '
  41        git config advice.detachedhead false &&
  42        echo unrelated >unrelated &&
  43        git add unrelated &&
  44        test_commit initial foo a &&
  45        test_commit "$mesg_one_line" foo b mesg-one-line &&
  46        git reset --hard initial &&
  47        test_commit "$mesg_no_footer" foo b mesg-no-footer &&
  48        git reset --hard initial &&
  49        test_commit "$mesg_broken_footer" foo b mesg-broken-footer &&
  50        git reset --hard initial &&
  51        test_commit "$mesg_with_footer" foo b mesg-with-footer &&
  52        git reset --hard initial &&
  53        test_commit "$mesg_with_footer_sob" foo b mesg-with-footer-sob &&
  54        git reset --hard initial &&
  55        test_commit "$mesg_with_cherry_footer" foo b mesg-with-cherry-footer &&
  56        pristine_detach initial &&
  57        test_commit conflicting unrelated
  58'
  59
  60test_expect_success 'cherry-pick -x inserts blank line after one line subject' '
  61        pristine_detach initial &&
  62        sha1=`git rev-parse mesg-one-line^0` &&
  63        git cherry-pick -x mesg-one-line &&
  64        cat <<-EOF >expect &&
  65                $mesg_one_line
  66
  67                (cherry picked from commit $sha1)
  68        EOF
  69        git log -1 --pretty=format:%B >actual &&
  70        test_cmp expect actual
  71'
  72
  73test_expect_success 'cherry-pick -s inserts blank line after one line subject' '
  74        pristine_detach initial &&
  75        git cherry-pick -s mesg-one-line &&
  76        cat <<-EOF >expect &&
  77                $mesg_one_line
  78
  79                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
  80        EOF
  81        git log -1 --pretty=format:%B >actual &&
  82        test_cmp expect actual
  83'
  84
  85test_expect_success 'cherry-pick -s inserts blank line after non-conforming footer' '
  86        pristine_detach initial &&
  87        git cherry-pick -s mesg-broken-footer &&
  88        cat <<-EOF >expect &&
  89                $mesg_broken_footer
  90
  91                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
  92        EOF
  93        git log -1 --pretty=format:%B >actual &&
  94        test_cmp expect actual
  95'
  96
  97test_expect_success 'cherry-pick -x inserts blank line when conforming footer not found' '
  98        pristine_detach initial &&
  99        sha1=`git rev-parse mesg-no-footer^0` &&
 100        git cherry-pick -x mesg-no-footer &&
 101        cat <<-EOF >expect &&
 102                $mesg_no_footer
 103
 104                (cherry picked from commit $sha1)
 105        EOF
 106        git log -1 --pretty=format:%B >actual &&
 107        test_cmp expect actual
 108'
 109
 110test_expect_success 'cherry-pick -s inserts blank line when conforming footer not found' '
 111        pristine_detach initial &&
 112        git cherry-pick -s mesg-no-footer &&
 113        cat <<-EOF >expect &&
 114                $mesg_no_footer
 115
 116                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
 117        EOF
 118        git log -1 --pretty=format:%B >actual &&
 119        test_cmp expect actual
 120'
 121
 122test_expect_success 'cherry-pick -x -s inserts blank line when conforming footer not found' '
 123        pristine_detach initial &&
 124        sha1=`git rev-parse mesg-no-footer^0` &&
 125        git cherry-pick -x -s mesg-no-footer &&
 126        cat <<-EOF >expect &&
 127                $mesg_no_footer
 128
 129                (cherry picked from commit $sha1)
 130                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
 131        EOF
 132        git log -1 --pretty=format:%B >actual &&
 133        test_cmp expect actual
 134'
 135
 136test_expect_success 'cherry-pick -s adds sob when last sob doesnt match committer' '
 137        pristine_detach initial &&
 138        git cherry-pick -s mesg-with-footer &&
 139        cat <<-EOF >expect &&
 140                $mesg_with_footer
 141                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
 142        EOF
 143        git log -1 --pretty=format:%B >actual &&
 144        test_cmp expect actual
 145'
 146
 147test_expect_success 'cherry-pick -x -s adds sob when last sob doesnt match committer' '
 148        pristine_detach initial &&
 149        sha1=`git rev-parse mesg-with-footer^0` &&
 150        git cherry-pick -x -s mesg-with-footer &&
 151        cat <<-EOF >expect &&
 152                $mesg_with_footer
 153                (cherry picked from commit $sha1)
 154                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
 155        EOF
 156        git log -1 --pretty=format:%B >actual &&
 157        test_cmp expect actual
 158'
 159
 160test_expect_success 'cherry-pick -s refrains from adding duplicate trailing sob' '
 161        pristine_detach initial &&
 162        git cherry-pick -s mesg-with-footer-sob &&
 163        cat <<-EOF >expect &&
 164                $mesg_with_footer_sob
 165        EOF
 166        git log -1 --pretty=format:%B >actual &&
 167        test_cmp expect actual
 168'
 169
 170test_expect_success 'cherry-pick -x -s adds sob even when trailing sob exists for committer' '
 171        pristine_detach initial &&
 172        sha1=`git rev-parse mesg-with-footer-sob^0` &&
 173        git cherry-pick -x -s mesg-with-footer-sob &&
 174        cat <<-EOF >expect &&
 175                $mesg_with_footer_sob
 176                (cherry picked from commit $sha1)
 177                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
 178        EOF
 179        git log -1 --pretty=format:%B >actual &&
 180        test_cmp expect actual
 181'
 182
 183test_expect_success 'cherry-pick -x treats "(cherry picked from..." line as part of footer' '
 184        pristine_detach initial &&
 185        sha1=`git rev-parse mesg-with-cherry-footer^0` &&
 186        git cherry-pick -x mesg-with-cherry-footer &&
 187        cat <<-EOF >expect &&
 188                $mesg_with_cherry_footer
 189                (cherry picked from commit $sha1)
 190        EOF
 191        git log -1 --pretty=format:%B >actual &&
 192        test_cmp expect actual
 193'
 194
 195test_expect_success 'cherry-pick -s treats "(cherry picked from..." line as part of footer' '
 196        pristine_detach initial &&
 197        git cherry-pick -s mesg-with-cherry-footer &&
 198        cat <<-EOF >expect &&
 199                $mesg_with_cherry_footer
 200                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
 201        EOF
 202        git log -1 --pretty=format:%B >actual &&
 203        test_cmp expect actual
 204'
 205
 206test_expect_success 'cherry-pick -x -s treats "(cherry picked from..." line as part of footer' '
 207        pristine_detach initial &&
 208        sha1=`git rev-parse mesg-with-cherry-footer^0` &&
 209        git cherry-pick -x -s mesg-with-cherry-footer &&
 210        cat <<-EOF >expect &&
 211                $mesg_with_cherry_footer
 212                (cherry picked from commit $sha1)
 213                Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>
 214        EOF
 215        git log -1 --pretty=format:%B >actual &&
 216        test_cmp expect actual
 217'
 218
 219test_done