Merge branch 'rj/t1050-use-test-path-is-file'
[git] / t / t5100-mailinfo.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2005 Junio C Hamano
4 #
5
6 test_description='git mailinfo and git mailsplit test'
7
8 . ./test-lib.sh
9
10 DATA="$TEST_DIRECTORY/t5100"
11
12 test_expect_success 'split sample box' \
13         'git mailsplit -o. "$DATA/sample.mbox" >last &&
14         last=$(cat last) &&
15         echo total is $last &&
16         test $(cat last) = 18'
17
18 check_mailinfo () {
19         mail=$1 opt=$2
20         mo="$mail$opt"
21         git mailinfo -u $opt "msg$mo" "patch$mo" <"$mail" >"info$mo" &&
22         test_cmp "$DATA/msg$mo" "msg$mo" &&
23         test_cmp "$DATA/patch$mo" "patch$mo" &&
24         test_cmp "$DATA/info$mo" "info$mo"
25 }
26
27
28 for mail in 00*
29 do
30         test_expect_success "mailinfo $mail" '
31                 check_mailinfo "$mail" "" &&
32                 if test -f "$DATA/msg$mail--scissors"
33                 then
34                         check_mailinfo "$mail" --scissors
35                 fi &&
36                 if test -f "$DATA/msg$mail--no-inbody-headers"
37                 then
38                         check_mailinfo "$mail" --no-inbody-headers
39                 fi &&
40                 if test -f "$DATA/msg$mail--message-id"
41                 then
42                         check_mailinfo "$mail" --message-id
43                 fi
44         '
45 done
46
47
48 test_expect_success 'split box with rfc2047 samples' \
49         'mkdir rfc2047 &&
50         git mailsplit -orfc2047 "$DATA/rfc2047-samples.mbox" \
51           >rfc2047/last &&
52         last=$(cat rfc2047/last) &&
53         echo total is $last &&
54         test $(cat rfc2047/last) = 11'
55
56 for mail in rfc2047/00*
57 do
58         test_expect_success "mailinfo $mail" '
59                 git mailinfo -u "$mail-msg" "$mail-patch" <"$mail" >"$mail-info" &&
60                 echo msg &&
61                 test_cmp "$DATA/empty" "$mail-msg" &&
62                 echo patch &&
63                 test_cmp "$DATA/empty" "$mail-patch" &&
64                 echo info &&
65                 test_cmp "$DATA/rfc2047-info-$(basename $mail)" "$mail-info"
66         '
67 done
68
69 test_expect_success 'respect NULs' '
70
71         git mailsplit -d3 -o. "$DATA/nul-plain" &&
72         test_cmp "$DATA/nul-plain" 001 &&
73         (cat 001 | git mailinfo msg patch) &&
74         test_line_count = 4 patch
75
76 '
77
78 test_expect_success 'Preserve NULs out of MIME encoded message' '
79
80         git mailsplit -d5 -o. "$DATA/nul-b64.in" &&
81         test_cmp "$DATA/nul-b64.in" 00001 &&
82         git mailinfo msg patch <00001 &&
83         test_cmp "$DATA/nul-b64.expect" patch
84
85 '
86
87 test_expect_success 'mailinfo on from header without name works' '
88
89         mkdir info-from &&
90         git mailsplit -oinfo-from "$DATA/info-from.in" &&
91         test_cmp "$DATA/info-from.in" info-from/0001 &&
92         git mailinfo info-from/msg info-from/patch \
93           <info-from/0001 >info-from/out &&
94         test_cmp "$DATA/info-from.expect" info-from/out
95
96 '
97
98 test_expect_success 'mailinfo finds headers after embedded From line' '
99         mkdir embed-from &&
100         git mailsplit -oembed-from "$DATA/embed-from.in" &&
101         test_cmp "$DATA/embed-from.in" embed-from/0001 &&
102         git mailinfo embed-from/msg embed-from/patch \
103           <embed-from/0001 >embed-from/out &&
104         test_cmp "$DATA/embed-from.expect" embed-from/out
105 '
106
107 test_expect_success 'mailinfo on message with quoted >From' '
108         mkdir quoted-from &&
109         git mailsplit -oquoted-from "$DATA/quoted-from.in" &&
110         test_cmp "$DATA/quoted-from.in" quoted-from/0001 &&
111         git mailinfo quoted-from/msg quoted-from/patch \
112           <quoted-from/0001 >quoted-from/out &&
113         test_cmp "$DATA/quoted-from.expect" quoted-from/msg
114 '
115
116 test_expect_success 'mailinfo unescapes with --mboxrd' '
117         mkdir mboxrd &&
118         git mailsplit -omboxrd --mboxrd \
119                 "$DATA/sample.mboxrd" >last &&
120         test x"$(cat last)" = x2 &&
121         for i in 0001 0002
122         do
123                 git mailinfo mboxrd/msg mboxrd/patch \
124                   <mboxrd/$i >mboxrd/out &&
125                 test_cmp "$DATA/${i}mboxrd" mboxrd/msg
126         done &&
127         sp=" " &&
128         echo "From " >expect &&
129         echo "From " >>expect &&
130         echo >> expect &&
131         cat >sp <<-INPUT_END &&
132         From mboxrd Mon Sep 17 00:00:00 2001
133         From: trailing spacer <sp@example.com>
134         Subject: [PATCH] a commit with trailing space
135
136         From$sp
137         >From$sp
138
139         INPUT_END
140
141         git mailsplit -f2 -omboxrd --mboxrd <sp >last &&
142         test x"$(cat last)" = x1 &&
143         git mailinfo mboxrd/msg mboxrd/patch <mboxrd/0003 &&
144         test_cmp expect mboxrd/msg
145 '
146
147 test_expect_success 'mailinfo handles rfc2822 quoted-string' '
148         mkdir quoted-string &&
149         git mailinfo /dev/null /dev/null <"$DATA/quoted-string.in" \
150                 >quoted-string/info &&
151         test_cmp "$DATA/quoted-string.expect" quoted-string/info
152 '
153
154 test_expect_success 'mailinfo handles rfc2822 comment' '
155         mkdir comment &&
156         git mailinfo /dev/null /dev/null <"$DATA/comment.in" \
157                 >comment/info &&
158         test_cmp "$DATA/comment.expect" comment/info
159 '
160
161 test_expect_success 'mailinfo with mailinfo.scissors config' '
162         test_config mailinfo.scissors true &&
163         (
164                 mkdir sub &&
165                 cd sub &&
166                 git mailinfo ../msg0014.sc ../patch0014.sc <../0014 >../info0014.sc
167         ) &&
168         test_cmp "$DATA/msg0014--scissors" msg0014.sc &&
169         test_cmp "$DATA/patch0014--scissors" patch0014.sc &&
170         test_cmp "$DATA/info0014--scissors" info0014.sc
171 '
172
173
174 test_expect_success 'mailinfo no options' '
175         subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
176                 git mailinfo /dev/null /dev/null)" &&
177         test z"$subj" = z"Subject: message"
178 '
179
180 test_expect_success 'mailinfo -k' '
181         subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
182                 git mailinfo -k /dev/null /dev/null)" &&
183         test z"$subj" = z"Subject: [PATCH] [other] [PATCH] message"
184 '
185
186 test_expect_success 'mailinfo -b no [PATCH]' '
187         subj="$(echo "Subject: [other] message" |
188                 git mailinfo -b /dev/null /dev/null)" &&
189         test z"$subj" = z"Subject: [other] message"
190 '
191
192 test_expect_success 'mailinfo -b leading [PATCH]' '
193         subj="$(echo "Subject: [PATCH] [other] message" |
194                 git mailinfo -b /dev/null /dev/null)" &&
195         test z"$subj" = z"Subject: [other] message"
196 '
197
198 test_expect_success 'mailinfo -b double [PATCH]' '
199         subj="$(echo "Subject: [PATCH] [PATCH] message" |
200                 git mailinfo -b /dev/null /dev/null)" &&
201         test z"$subj" = z"Subject: message"
202 '
203
204 test_expect_failure 'mailinfo -b trailing [PATCH]' '
205         subj="$(echo "Subject: [other] [PATCH] message" |
206                 git mailinfo -b /dev/null /dev/null)" &&
207         test z"$subj" = z"Subject: [other] message"
208 '
209
210 test_expect_failure 'mailinfo -b separated double [PATCH]' '
211         subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
212                 git mailinfo -b /dev/null /dev/null)" &&
213         test z"$subj" = z"Subject: [other] message"
214 '
215
216 test_expect_success 'mailinfo handles unusual header whitespace' '
217         git mailinfo /dev/null /dev/null >actual <<-\EOF &&
218         From:Real Name <user@example.com>
219         Subject:    extra spaces
220         EOF
221
222         cat >expect <<-\EOF &&
223         Author: Real Name
224         Email: user@example.com
225         Subject: extra spaces
226
227         EOF
228         test_cmp expect actual
229 '
230
231 test_done