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>

Jeff King committed May 26, 2011 at 16:41 UTC 00ebc977484e18c03160b6319322858c088bce55
1 file changed +77
t/t4152-am-subjects.sh new
+77
@@ -0,0 +1,77 @@
1 +#!/bin/sh
2 +
3 +test_description='test subject preservation with format-patch | am'
4 +. ./test-lib.sh
5 +
6 +make_patches() {
7 + type=$1
8 + subject=$2
9 + test_expect_success "create patches with $type subject" '
10 + git reset --hard baseline &&
11 + echo $type >file &&
12 + git commit -a -m "$subject" &&
13 + git format-patch -1 --stdout >$type.patch &&
14 + git format-patch -1 --stdout -k >$type-k.patch
15 + '
16 +}
17 +
18 +check_subject() {
19 + git reset --hard baseline &&
20 + git am $2 $1.patch &&
21 + git log -1 --pretty=format:%B >actual &&
22 + test_cmp expect actual
23 +}
24 +
25 +test_expect_success 'setup baseline commit' '
26 + test_commit baseline file
27 +'
28 +
29 +SHORT_SUBJECT='short subject'
30 +make_patches short "$SHORT_SUBJECT"
31 +
32 +LONG_SUBJECT1='this is a long subject that is virtually guaranteed'
33 +LONG_SUBJECT2='to require wrapping via format-patch if it is all'
34 +LONG_SUBJECT3='going to appear on a single line'
35 +LONG_SUBJECT="$LONG_SUBJECT1 $LONG_SUBJECT2 $LONG_SUBJECT3"
36 +make_patches long "$LONG_SUBJECT"
37 +
38 +MULTILINE_SUBJECT="$LONG_SUBJECT1
39 +$LONG_SUBJECT2
40 +$LONG_SUBJECT3"
41 +make_patches multiline "$MULTILINE_SUBJECT"
42 +
43 +echo "$SHORT_SUBJECT" >expect
44 +test_expect_success 'short subject preserved (format-patch | am)' '
45 + check_subject short
46 +'
47 +test_expect_success 'short subject preserved (format-patch -k | am)' '
48 + check_subject short-k
49 +'
50 +test_expect_success 'short subject preserved (format-patch -k | am -k)' '
51 + check_subject short-k -k
52 +'
53 +
54 +echo "$LONG_SUBJECT" >expect
55 +test_expect_success 'long subject preserved (format-patch | am)' '
56 + check_subject long
57 +'
58 +test_expect_success 'long subject preserved (format-patch -k | am)' '
59 + check_subject long-k
60 +'
61 +test_expect_failure 'long subject preserved (format-patch -k | am -k)' '
62 + check_subject long-k -k
63 +'
64 +
65 +echo "$LONG_SUBJECT" >expect
66 +test_expect_success 'multiline subject unwrapped (format-patch | am)' '
67 + check_subject multiline
68 +'
69 +test_expect_success 'multiline subject unwrapped (format-patch -k | am)' '
70 + check_subject multiline-k
71 +'
72 +echo "$MULTILINE_SUBJECT" >expect
73 +test_expect_failure 'multiline subject preserved (format-patch -k | am -k)' '
74 + check_subject multiline-k -k
75 +'
76 +
77 +test_done