27f8f86ea759b52b69b78c6a16a151f0e57cb6ec
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 'mailmap.blob defaults to off in non-bare repo' '
222 git init non-bare &&
223 (
224 cd non-bare &&
225 test_commit one .mailmap "Fake Name <author@example.com>" &&
226 echo " 1 Fake Name" >expect &&
227 git shortlog -ns HEAD >actual &&
228 test_cmp expect actual &&
229 rm .mailmap &&
230 echo " 1 A U Thor" >expect &&
231 git shortlog -ns HEAD >actual &&
232 test_cmp expect actual
233 )
234'
235
236test_expect_success 'mailmap.blob defaults to HEAD:.mailmap in bare repo' '
237 git clone --bare non-bare bare &&
238 (
239 cd bare &&
240 echo " 1 Fake Name" >expect &&
241 git shortlog -ns HEAD >actual &&
242 test_cmp expect actual
243 )
244'
245
246test_expect_success 'cleanup after mailmap.blob tests' '
247 rm -f .mailmap
248'
249
250test_expect_failure 'single-character name' '
251 echo " 1 A <author@example.com>" >expect &&
252 echo " 1 nick1 <bugs@company.xx>" >>expect &&
253 echo "A <author@example.com>" >.mailmap &&
254 test_when_finished "rm .mailmap" &&
255 git shortlog -es HEAD >actual &&
256 test_cmp expect actual
257'
258
259# Extended mailmap configurations should give us the following output for shortlog
260cat >expect <<\EOF
261A U Thor <author@example.com> (1):
262 initial
263
264CTO <cto@company.xx> (1):
265 seventh
266
267Other Author <other@author.xx> (2):
268 third
269 fourth
270
271Santa Claus <santa.claus@northpole.xx> (2):
272 fifth
273 sixth
274
275Some Dude <some@dude.xx> (1):
276 second
277
278EOF
279
280test_expect_success 'Shortlog output (complex mapping)' '
281 echo three >>one &&
282 git add one &&
283 test_tick &&
284 git commit --author "nick2 <bugs@company.xx>" -m third &&
285
286 echo four >>one &&
287 git add one &&
288 test_tick &&
289 git commit --author "nick2 <nick2@company.xx>" -m fourth &&
290
291 echo five >>one &&
292 git add one &&
293 test_tick &&
294 git commit --author "santa <me@company.xx>" -m fifth &&
295
296 echo six >>one &&
297 git add one &&
298 test_tick &&
299 git commit --author "claus <me@company.xx>" -m sixth &&
300
301 echo seven >>one &&
302 git add one &&
303 test_tick &&
304 git commit --author "CTO <cto@coompany.xx>" -m seventh &&
305
306 mkdir -p internal_mailmap &&
307 echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
308 echo "<cto@company.xx> <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
309 echo "Some Dude <some@dude.xx> nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
310 echo "Other Author <other@author.xx> nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
311 echo "Other Author <other@author.xx> <nick2@company.xx>" >> internal_mailmap/.mailmap &&
312 echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
313 echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
314
315 git shortlog -e HEAD >actual &&
316 test_cmp expect actual
317
318'
319
320# git log with --pretty format which uses the name and email mailmap placemarkers
321cat >expect <<\EOF
322Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
323Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
324
325Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
326Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
327
328Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
329Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
330
331Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
332Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
333
334Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
335Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
336
337Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
338Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
339
340Author A U Thor <author@example.com> maps to A U Thor <author@example.com>
341Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
342EOF
343
344test_expect_success 'Log output (complex mapping)' '
345 git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
346 test_cmp expect actual
347'
348
349cat >expect <<\EOF
350Author: CTO <cto@company.xx>
351Author: Santa Claus <santa.claus@northpole.xx>
352Author: Santa Claus <santa.claus@northpole.xx>
353Author: Other Author <other@author.xx>
354Author: Other Author <other@author.xx>
355Author: Some Dude <some@dude.xx>
356Author: A U Thor <author@example.com>
357EOF
358
359test_expect_success 'Log output with --use-mailmap' '
360 git log --use-mailmap | grep Author >actual &&
361 test_cmp expect actual
362'
363
364cat >expect <<\EOF
365Author: CTO <cto@company.xx>
366Author: Santa Claus <santa.claus@northpole.xx>
367Author: Santa Claus <santa.claus@northpole.xx>
368Author: Other Author <other@author.xx>
369Author: Other Author <other@author.xx>
370Author: Some Dude <some@dude.xx>
371Author: A U Thor <author@example.com>
372EOF
373
374test_expect_success 'Log output with log.mailmap' '
375 git -c log.mailmap=True log | grep Author >actual &&
376 test_cmp expect actual
377'
378
379cat >expect <<\EOF
380Author: Santa Claus <santa.claus@northpole.xx>
381Author: Santa Claus <santa.claus@northpole.xx>
382EOF
383
384test_expect_success 'Grep author with --use-mailmap' '
385 git log --use-mailmap --author Santa | grep Author >actual &&
386 test_cmp expect actual
387'
388cat >expect <<\EOF
389Author: Santa Claus <santa.claus@northpole.xx>
390Author: Santa Claus <santa.claus@northpole.xx>
391EOF
392
393test_expect_success 'Grep author with log.mailmap' '
394 git -c log.mailmap=True log --author Santa | grep Author >actual &&
395 test_cmp expect actual
396'
397
398>expect
399
400test_expect_success 'Only grep replaced author with --use-mailmap' '
401 git log --use-mailmap --author "<cto@coompany.xx>" >actual &&
402 test_cmp expect actual
403'
404
405# git blame
406cat >expect <<\EOF
407^OBJI (A U Thor DATE 1) one
408OBJID (Some Dude DATE 2) two
409OBJID (Other Author DATE 3) three
410OBJID (Other Author DATE 4) four
411OBJID (Santa Claus DATE 5) five
412OBJID (Santa Claus DATE 6) six
413OBJID (CTO DATE 7) seven
414EOF
415test_expect_success 'Blame output (complex mapping)' '
416 git blame one >actual &&
417 fuzz_blame actual >actual.fuzz &&
418 test_cmp expect actual.fuzz
419'
420
421test_done