t / t4014-format-patch.shon commit interpret_nth_last_branch(): avoid traversing the reflog twice (c2883e6)
   1#!/bin/sh
   2#
   3# Copyright (c) 2006 Junio C Hamano
   4#
   5
   6test_description='Format-patch skipping already incorporated patches'
   7
   8. ./test-lib.sh
   9
  10test_expect_success setup '
  11
  12        for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i"; done >file &&
  13        cat file >elif &&
  14        git add file elif &&
  15        git commit -m Initial &&
  16        git checkout -b side &&
  17
  18        for i in 1 2 5 6 A B C 7 8 9 10; do echo "$i"; done >file &&
  19        chmod +x elif &&
  20        git update-index file elif &&
  21        git update-index --chmod=+x elif &&
  22        git commit -m "Side changes #1" &&
  23
  24        for i in D E F; do echo "$i"; done >>file &&
  25        git update-index file &&
  26        git commit -m "Side changes #2" &&
  27        git tag C2 &&
  28
  29        for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >file &&
  30        git update-index file &&
  31        git commit -m "Side changes #3 with \\n backslash-n in it." &&
  32
  33        git checkout master &&
  34        git diff-tree -p C2 | git apply --index &&
  35        git commit -m "Master accepts moral equivalent of #2"
  36
  37'
  38
  39test_expect_success "format-patch --ignore-if-in-upstream" '
  40
  41        git format-patch --stdout master..side >patch0 &&
  42        cnt=`grep "^From " patch0 | wc -l` &&
  43        test $cnt = 3
  44
  45'
  46
  47test_expect_success "format-patch --ignore-if-in-upstream" '
  48
  49        git format-patch --stdout \
  50                --ignore-if-in-upstream master..side >patch1 &&
  51        cnt=`grep "^From " patch1 | wc -l` &&
  52        test $cnt = 2
  53
  54'
  55
  56test_expect_success "format-patch result applies" '
  57
  58        git checkout -b rebuild-0 master &&
  59        git am -3 patch0 &&
  60        cnt=`git rev-list master.. | wc -l` &&
  61        test $cnt = 2
  62'
  63
  64test_expect_success "format-patch --ignore-if-in-upstream result applies" '
  65
  66        git checkout -b rebuild-1 master &&
  67        git am -3 patch1 &&
  68        cnt=`git rev-list master.. | wc -l` &&
  69        test $cnt = 2
  70'
  71
  72test_expect_success 'commit did not screw up the log message' '
  73
  74        git cat-file commit side | grep "^Side .* with .* backslash-n"
  75
  76'
  77
  78test_expect_success 'format-patch did not screw up the log message' '
  79
  80        grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 &&
  81        grep "^Subject: .*Side changes #3 with .* backslash-n" patch1
  82
  83'
  84
  85test_expect_success 'replay did not screw up the log message' '
  86
  87        git cat-file commit rebuild-1 | grep "^Side .* with .* backslash-n"
  88
  89'
  90
  91test_expect_success 'extra headers' '
  92
  93        git config format.headers "To: R. E. Cipient <rcipient@example.com>
  94" &&
  95        git config --add format.headers "Cc: S. E. Cipient <scipient@example.com>
  96" &&
  97        git format-patch --stdout master..side > patch2 &&
  98        sed -e "/^$/q" patch2 > hdrs2 &&
  99        grep "^To: R. E. Cipient <rcipient@example.com>$" hdrs2 &&
 100        grep "^Cc: S. E. Cipient <scipient@example.com>$" hdrs2
 101
 102'
 103
 104test_expect_success 'extra headers without newlines' '
 105
 106        git config --replace-all format.headers "To: R. E. Cipient <rcipient@example.com>" &&
 107        git config --add format.headers "Cc: S. E. Cipient <scipient@example.com>" &&
 108        git format-patch --stdout master..side >patch3 &&
 109        sed -e "/^$/q" patch3 > hdrs3 &&
 110        grep "^To: R. E. Cipient <rcipient@example.com>$" hdrs3 &&
 111        grep "^Cc: S. E. Cipient <scipient@example.com>$" hdrs3
 112
 113'
 114
 115test_expect_success 'extra headers with multiple To:s' '
 116
 117        git config --replace-all format.headers "To: R. E. Cipient <rcipient@example.com>" &&
 118        git config --add format.headers "To: S. E. Cipient <scipient@example.com>" &&
 119        git format-patch --stdout master..side > patch4 &&
 120        sed -e "/^$/q" patch4 > hdrs4 &&
 121        grep "^To: R. E. Cipient <rcipient@example.com>,$" hdrs4 &&
 122        grep "^ *S. E. Cipient <scipient@example.com>$" hdrs4
 123'
 124
 125test_expect_success 'additional command line cc' '
 126
 127        git config --replace-all format.headers "Cc: R. E. Cipient <rcipient@example.com>" &&
 128        git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout master..side | sed -e "/^$/q" >patch5 &&
 129        grep "^Cc: R. E. Cipient <rcipient@example.com>,$" patch5 &&
 130        grep "^ *S. E. Cipient <scipient@example.com>$" patch5
 131'
 132
 133test_expect_success 'multiple files' '
 134
 135        rm -rf patches/ &&
 136        git checkout side &&
 137        git format-patch -o patches/ master &&
 138        ls patches/0001-Side-changes-1.patch patches/0002-Side-changes-2.patch patches/0003-Side-changes-3-with-n-backslash-n-in-it.patch
 139'
 140
 141test_expect_success 'thread' '
 142
 143        rm -rf patches/ &&
 144        git checkout side &&
 145        git format-patch --thread -o patches/ master &&
 146        FIRST_MID=$(grep "Message-Id:" patches/0001-* | sed "s/^[^<]*\(<[^>]*>\).*$/\1/") &&
 147        for i in patches/0002-* patches/0003-*
 148        do
 149          grep "References: $FIRST_MID" $i &&
 150          grep "In-Reply-To: $FIRST_MID" $i || break
 151        done
 152'
 153
 154test_expect_success 'thread in-reply-to' '
 155
 156        rm -rf patches/ &&
 157        git checkout side &&
 158        git format-patch --in-reply-to="<test.message>" --thread -o patches/ master &&
 159        FIRST_MID="<test.message>" &&
 160        for i in patches/*
 161        do
 162          grep "References: $FIRST_MID" $i &&
 163          grep "In-Reply-To: $FIRST_MID" $i || break
 164        done
 165'
 166
 167test_expect_success 'thread cover-letter' '
 168
 169        rm -rf patches/ &&
 170        git checkout side &&
 171        git format-patch --cover-letter --thread -o patches/ master &&
 172        FIRST_MID=$(grep "Message-Id:" patches/0000-* | sed "s/^[^<]*\(<[^>]*>\).*$/\1/") &&
 173        for i in patches/0001-* patches/0002-* patches/0003-*
 174        do
 175          grep "References: $FIRST_MID" $i &&
 176          grep "In-Reply-To: $FIRST_MID" $i || break
 177        done
 178'
 179
 180test_expect_success 'thread cover-letter in-reply-to' '
 181
 182        rm -rf patches/ &&
 183        git checkout side &&
 184        git format-patch --cover-letter --in-reply-to="<test.message>" --thread -o patches/ master &&
 185        FIRST_MID="<test.message>" &&
 186        for i in patches/*
 187        do
 188          grep "References: $FIRST_MID" $i &&
 189          grep "In-Reply-To: $FIRST_MID" $i || break
 190        done
 191'
 192
 193test_expect_success 'excessive subject' '
 194
 195        rm -rf patches/ &&
 196        git checkout side &&
 197        for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >>file &&
 198        git update-index file &&
 199        git commit -m "This is an excessively long subject line for a message due to the habit some projects have of not having a short, one-line subject at the start of the commit message, but rather sticking a whole paragraph right at the start as the only thing in the commit message. It had better not become the filename for the patch." &&
 200        git format-patch -o patches/ master..side &&
 201        ls patches/0004-This-is-an-excessively-long-subject-line-for-a-messa.patch
 202'
 203
 204test_expect_success 'cover-letter inherits diff options' '
 205
 206        git mv file foo &&
 207        git commit -m foo &&
 208        git format-patch --cover-letter -1 &&
 209        ! grep "file => foo .* 0 *$" 0000-cover-letter.patch &&
 210        git format-patch --cover-letter -1 -M &&
 211        grep "file => foo .* 0 *$" 0000-cover-letter.patch
 212
 213'
 214
 215cat > expect << EOF
 216  This is an excessively long subject line for a message due to the
 217    habit some projects have of not having a short, one-line subject at
 218    the start of the commit message, but rather sticking a whole
 219    paragraph right at the start as the only thing in the commit
 220    message. It had better not become the filename for the patch.
 221  foo
 222
 223EOF
 224
 225test_expect_success 'shortlog of cover-letter wraps overly-long onelines' '
 226
 227        git format-patch --cover-letter -2 &&
 228        sed -e "1,/A U Thor/d" -e "/^$/q" < 0000-cover-letter.patch > output &&
 229        test_cmp expect output
 230
 231'
 232
 233cat > expect << EOF
 234---
 235 file |   16 ++++++++++++++++
 236 1 files changed, 16 insertions(+), 0 deletions(-)
 237
 238diff --git a/file b/file
 239index 40f36c6..2dc5c23 100644
 240--- a/file
 241+++ b/file
 242@@ -13,4 +13,20 @@ C
 243 10
 244 D
 245 E
 246 F
 247+5
 248EOF
 249
 250test_expect_success 'format-patch respects -U' '
 251
 252        git format-patch -U4 -2 &&
 253        sed -e "1,/^$/d" -e "/^+5/q" < 0001-This-is-an-excessively-long-subject-line-for-a-messa.patch > output &&
 254        test_cmp expect output
 255
 256'
 257
 258test_done