e7ea40ceb6c68a69fefae30ef5cee09acd02a6b2
1#!/bin/sh
2
3test_description='.mailmap configurations'
4
5. ./test-lib.sh
6
7fuzz_blame () {
8 sed "
9 s/$_x05[0-9a-f][0-9a-f][0-9a-f]/OBJID/g
10 s/$_x05[0-9a-f][0-9a-f]/OBJI/g
11 s/[-0-9]\{10\} [:0-9]\{8\} [-+][0-9]\{4\}/DATE/g
12 " "$@"
13}
14
15test_expect_success setup '
16 echo one >one &&
17 git add one &&
18 test_tick &&
19 git commit -m initial &&
20 echo two >>one &&
21 git add one &&
22 test_tick &&
23 git commit --author "nick1 <bugs@company.xx>" -m second
24'
25
26cat >expect <<\EOF
27A U Thor (1):
28 initial
29
30nick1 (1):
31 second
32
33EOF
34
35test_expect_success 'No mailmap' '
36 git shortlog HEAD >actual &&
37 test_cmp expect actual
38'
39
40cat >expect <<\EOF
41Repo Guy (1):
42 initial
43
44nick1 (1):
45 second
46
47EOF
48
49test_expect_success 'default .mailmap' '
50 echo "Repo Guy <author@example.com>" > .mailmap &&
51 git shortlog HEAD >actual &&
52 test_cmp expect actual
53'
54
55# Using a mailmap file in a subdirectory of the repo here, but
56# could just as well have been a file outside of the repository
57cat >expect <<\EOF
58Internal Guy (1):
59 second
60
61Repo Guy (1):
62 initial
63
64EOF
65test_expect_success 'mailmap.file set' '
66 mkdir -p internal_mailmap &&
67 echo "Internal Guy <bugs@company.xx>" > internal_mailmap/.mailmap &&
68 git config mailmap.file internal_mailmap/.mailmap &&
69 git shortlog HEAD >actual &&
70 test_cmp expect actual
71'
72
73cat >expect <<\EOF
74External Guy (1):
75 initial
76
77Internal Guy (1):
78 second
79
80EOF
81test_expect_success 'mailmap.file override' '
82 echo "External Guy <author@example.com>" >> internal_mailmap/.mailmap &&
83 git config mailmap.file internal_mailmap/.mailmap &&
84 git shortlog HEAD >actual &&
85 test_cmp expect actual
86'
87
88cat >expect <<\EOF
89Repo Guy (1):
90 initial
91
92nick1 (1):
93 second
94
95EOF
96
97test_expect_success 'mailmap.file non-existent' '
98 rm internal_mailmap/.mailmap &&
99 rmdir internal_mailmap &&
100 git shortlog HEAD >actual &&
101 test_cmp expect actual
102'
103
104cat >expect <<\EOF
105Internal Guy (1):
106 second
107
108Repo Guy (1):
109 initial
110
111EOF
112
113test_expect_success 'name entry after email entry' '
114 mkdir -p internal_mailmap &&
115 echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
116 echo "Internal Guy <bugs@company.xx>" >>internal_mailmap/.mailmap &&
117 git shortlog HEAD >actual &&
118 test_cmp expect actual
119'
120
121cat >expect <<\EOF
122Internal Guy (1):
123 second
124
125Repo Guy (1):
126 initial
127
128EOF
129
130test_expect_success 'name entry after email entry, case-insensitive' '
131 mkdir -p internal_mailmap &&
132 echo "<bugs@company.xy> <bugs@company.xx>" >internal_mailmap/.mailmap &&
133 echo "Internal Guy <BUGS@Company.xx>" >>internal_mailmap/.mailmap &&
134 git shortlog HEAD >actual &&
135 test_cmp expect actual
136'
137
138cat >expect <<\EOF
139A U Thor (1):
140 initial
141
142nick1 (1):
143 second
144
145EOF
146test_expect_success 'No mailmap files, but configured' '
147 rm -f .mailmap internal_mailmap/.mailmap &&
148 git shortlog HEAD >actual &&
149 test_cmp expect actual
150'
151
152test_expect_success 'setup mailmap blob tests' '
153 git checkout -b map &&
154 test_when_finished "git checkout master" &&
155 cat >just-bugs <<-\EOF &&
156 Blob Guy <bugs@company.xx>
157 EOF
158 cat >both <<-\EOF &&
159 Blob Guy <author@example.com>
160 Blob Guy <bugs@company.xx>
161 EOF
162 git add just-bugs both &&
163 git commit -m "my mailmaps" &&
164 echo "Repo Guy <author@example.com>" >.mailmap &&
165 echo "Internal Guy <author@example.com>" >internal.map
166'
167
168test_expect_success 'mailmap.blob set' '
169 cat >expect <<-\EOF &&
170 Blob Guy (1):
171 second
172
173 Repo Guy (1):
174 initial
175
176 EOF
177 git -c mailmap.blob=map:just-bugs shortlog HEAD >actual &&
178 test_cmp expect actual
179'
180
181test_expect_success 'mailmap.blob overrides .mailmap' '
182 cat >expect <<-\EOF &&
183 Blob Guy (2):
184 initial
185 second
186
187 EOF
188 git -c mailmap.blob=map:both shortlog HEAD >actual &&
189 test_cmp expect actual
190'
191
192test_expect_success 'mailmap.file overrides mailmap.blob' '
193 cat >expect <<-\EOF &&
194 Blob Guy (1):
195 second
196
197 Internal Guy (1):
198 initial
199
200 EOF
201 git \
202 -c mailmap.blob=map:both \
203 -c mailmap.file=internal.map \
204 shortlog HEAD >actual &&
205 test_cmp expect actual
206'
207
208test_expect_success 'mailmap.blob can be missing' '
209 cat >expect <<-\EOF &&
210 Repo Guy (1):
211 initial
212
213 nick1 (1):
214 second
215
216 EOF
217 git -c mailmap.blob=map:nonexistent shortlog HEAD >actual &&
218 test_cmp expect actual
219'
220
221test_expect_success 'cleanup after mailmap.blob tests' '
222 rm -f .mailmap
223'
224
225# Extended mailmap configurations should give us the following output for shortlog
226cat >expect <<\EOF
227A U Thor <author@example.com> (1):
228 initial
229
230CTO <cto@company.xx> (1):
231 seventh
232
233Other Author <other@author.xx> (2):
234 third
235 fourth
236
237Santa Claus <santa.claus@northpole.xx> (2):
238 fifth
239 sixth
240
241Some Dude <some@dude.xx> (1):
242 second
243
244EOF
245
246test_expect_success 'Shortlog output (complex mapping)' '
247 echo three >>one &&
248 git add one &&
249 test_tick &&
250 git commit --author "nick2 <bugs@company.xx>" -m third &&
251
252 echo four >>one &&
253 git add one &&
254 test_tick &&
255 git commit --author "nick2 <nick2@company.xx>" -m fourth &&
256
257 echo five >>one &&
258 git add one &&
259 test_tick &&
260 git commit --author "santa <me@company.xx>" -m fifth &&
261
262 echo six >>one &&
263 git add one &&
264 test_tick &&
265 git commit --author "claus <me@company.xx>" -m sixth &&
266
267 echo seven >>one &&
268 git add one &&
269 test_tick &&
270 git commit --author "CTO <cto@coompany.xx>" -m seventh &&
271
272 mkdir -p internal_mailmap &&
273 echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
274 echo "<cto@company.xx> <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
275 echo "Some Dude <some@dude.xx> nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
276 echo "Other Author <other@author.xx> nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
277 echo "Other Author <other@author.xx> <nick2@company.xx>" >> internal_mailmap/.mailmap &&
278 echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
279 echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
280
281 git shortlog -e HEAD >actual &&
282 test_cmp expect actual
283
284'
285
286# git log with --pretty format which uses the name and email mailmap placemarkers
287cat >expect <<\EOF
288Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
289Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
290
291Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
292Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
293
294Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
295Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
296
297Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
298Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
299
300Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
301Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
302
303Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
304Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
305
306Author A U Thor <author@example.com> maps to A U Thor <author@example.com>
307Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
308EOF
309
310test_expect_success 'Log output (complex mapping)' '
311 git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
312 test_cmp expect actual
313'
314
315# git blame
316cat >expect <<\EOF
317^OBJI (A U Thor DATE 1) one
318OBJID (Some Dude DATE 2) two
319OBJID (Other Author DATE 3) three
320OBJID (Other Author DATE 4) four
321OBJID (Santa Claus DATE 5) five
322OBJID (Santa Claus DATE 6) six
323OBJID (CTO DATE 7) seven
324EOF
325test_expect_success 'Blame output (complex mapping)' '
326 git blame one >actual &&
327 fuzz_blame actual >actual.fuzz &&
328 test_cmp expect actual.fuzz
329'
330
331test_done