t: test subject handling in format-patch / am pipeline

Commit a1f6baa (format-patch: wrap long header lines,
2011-02-23) changed format-patch's behavior with respect to
long header lines, but made no accompanying changes to the
receiving side. It was thought that "git am" would handle
these folded subjects fine, but there is a regression when
using "am -k".

Let's add a test documenting this. While we're at it, let's
give more complete test coverage to document what should be
happening in each case. We test three types of subjects:
a short one, one long enough to require wrapping, and a
multiline subject. For each, we test these three
combinations:

  format-patch | am
  format-patch -k | am
  format-patch -k | am -k

We don't bother testing "format-patch | am -k", which is
nonsense (you will be adding in [PATCH] cruft to each
subject).

This reveals the regression above (long subjects have
linebreaks introduced via "format-patch -k | am -k"),
as well as an existing non-optimal behavior (multiline
subjects are not preserved using "-k").

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2011-05-26 16:41:18 -04:00 committed by Junio C Hamano
parent 990f6e30eb
commit 00ebc97748

77
t/t4152-am-subjects.sh Executable file
View file

@ -0,0 +1,77 @@
#!/bin/sh
test_description='test subject preservation with format-patch | am'
. ./test-lib.sh
make_patches() {
type=$1
subject=$2
test_expect_success "create patches with $type subject" '
git reset --hard baseline &&
echo $type >file &&
git commit -a -m "$subject" &&
git format-patch -1 --stdout >$type.patch &&
git format-patch -1 --stdout -k >$type-k.patch
'
}
check_subject() {
git reset --hard baseline &&
git am $2 $1.patch &&
git log -1 --pretty=format:%B >actual &&
test_cmp expect actual
}
test_expect_success 'setup baseline commit' '
test_commit baseline file
'
SHORT_SUBJECT='short subject'
make_patches short "$SHORT_SUBJECT"
LONG_SUBJECT1='this is a long subject that is virtually guaranteed'
LONG_SUBJECT2='to require wrapping via format-patch if it is all'
LONG_SUBJECT3='going to appear on a single line'
LONG_SUBJECT="$LONG_SUBJECT1 $LONG_SUBJECT2 $LONG_SUBJECT3"
make_patches long "$LONG_SUBJECT"
MULTILINE_SUBJECT="$LONG_SUBJECT1
$LONG_SUBJECT2
$LONG_SUBJECT3"
make_patches multiline "$MULTILINE_SUBJECT"
echo "$SHORT_SUBJECT" >expect
test_expect_success 'short subject preserved (format-patch | am)' '
check_subject short
'
test_expect_success 'short subject preserved (format-patch -k | am)' '
check_subject short-k
'
test_expect_success 'short subject preserved (format-patch -k | am -k)' '
check_subject short-k -k
'
echo "$LONG_SUBJECT" >expect
test_expect_success 'long subject preserved (format-patch | am)' '
check_subject long
'
test_expect_success 'long subject preserved (format-patch -k | am)' '
check_subject long-k
'
test_expect_failure 'long subject preserved (format-patch -k | am -k)' '
check_subject long-k -k
'
echo "$LONG_SUBJECT" >expect
test_expect_success 'multiline subject unwrapped (format-patch | am)' '
check_subject multiline
'
test_expect_success 'multiline subject unwrapped (format-patch -k | am)' '
check_subject multiline-k
'
echo "$MULTILINE_SUBJECT" >expect
test_expect_failure 'multiline subject preserved (format-patch -k | am -k)' '
check_subject multiline-k -k
'
test_done