Merge branch 'nd/index-format-doc'
[git] / t / t4203-mailmap.sh
1 #!/bin/sh
2
3 test_description='.mailmap configurations'
4
5 . ./test-lib.sh
6
7 fuzz_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
15 test_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
26 cat >expect <<\EOF
27 A U Thor (1):
28       initial
29
30 nick1 (1):
31       second
32
33 EOF
34
35 test_expect_success 'No mailmap' '
36         git shortlog HEAD >actual &&
37         test_cmp expect actual
38 '
39
40 cat >expect <<\EOF
41 Repo Guy (1):
42       initial
43
44 nick1 (1):
45       second
46
47 EOF
48
49 test_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
57 cat >expect <<\EOF
58 Internal Guy (1):
59       second
60
61 Repo Guy (1):
62       initial
63
64 EOF
65 test_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
73 cat >expect <<\EOF
74 External Guy (1):
75       initial
76
77 Internal Guy (1):
78       second
79
80 EOF
81 test_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
88 cat >expect <<\EOF
89 Repo Guy (1):
90       initial
91
92 nick1 (1):
93       second
94
95 EOF
96
97 test_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
104 cat >expect <<\EOF
105 Internal Guy (1):
106       second
107
108 Repo Guy (1):
109       initial
110
111 EOF
112
113 test_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
121 cat >expect <<\EOF
122 Internal Guy (1):
123       second
124
125 Repo Guy (1):
126       initial
127
128 EOF
129
130 test_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
138 cat >expect <<\EOF
139 A U Thor (1):
140       initial
141
142 nick1 (1):
143       second
144
145 EOF
146 test_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
152 # Extended mailmap configurations should give us the following output for shortlog
153 cat >expect <<\EOF
154 A U Thor <author@example.com> (1):
155       initial
156
157 CTO <cto@company.xx> (1):
158       seventh
159
160 Other Author <other@author.xx> (2):
161       third
162       fourth
163
164 Santa Claus <santa.claus@northpole.xx> (2):
165       fifth
166       sixth
167
168 Some Dude <some@dude.xx> (1):
169       second
170
171 EOF
172
173 test_expect_success 'Shortlog output (complex mapping)' '
174         echo three >>one &&
175         git add one &&
176         test_tick &&
177         git commit --author "nick2 <bugs@company.xx>" -m third &&
178
179         echo four >>one &&
180         git add one &&
181         test_tick &&
182         git commit --author "nick2 <nick2@company.xx>" -m fourth &&
183
184         echo five >>one &&
185         git add one &&
186         test_tick &&
187         git commit --author "santa <me@company.xx>" -m fifth &&
188
189         echo six >>one &&
190         git add one &&
191         test_tick &&
192         git commit --author "claus <me@company.xx>" -m sixth &&
193
194         echo seven >>one &&
195         git add one &&
196         test_tick &&
197         git commit --author "CTO <cto@coompany.xx>" -m seventh &&
198
199         mkdir -p internal_mailmap &&
200         echo "Committed <committer@example.com>" > internal_mailmap/.mailmap &&
201         echo "<cto@company.xx>                       <cto@coompany.xx>" >> internal_mailmap/.mailmap &&
202         echo "Some Dude <some@dude.xx>         nick1 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
203         echo "Other Author <other@author.xx>   nick2 <bugs@company.xx>" >> internal_mailmap/.mailmap &&
204         echo "Other Author <other@author.xx>         <nick2@company.xx>" >> internal_mailmap/.mailmap &&
205         echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
206         echo "Santa Claus <santa.claus@northpole.xx> <me@company.xx>" >> internal_mailmap/.mailmap &&
207
208         git shortlog -e HEAD >actual &&
209         test_cmp expect actual
210
211 '
212
213 # git log with --pretty format which uses the name and email mailmap placemarkers
214 cat >expect <<\EOF
215 Author CTO <cto@coompany.xx> maps to CTO <cto@company.xx>
216 Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
217
218 Author claus <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
219 Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
220
221 Author santa <me@company.xx> maps to Santa Claus <santa.claus@northpole.xx>
222 Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
223
224 Author nick2 <nick2@company.xx> maps to Other Author <other@author.xx>
225 Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
226
227 Author nick2 <bugs@company.xx> maps to Other Author <other@author.xx>
228 Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
229
230 Author nick1 <bugs@company.xx> maps to Some Dude <some@dude.xx>
231 Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
232
233 Author A U Thor <author@example.com> maps to A U Thor <author@example.com>
234 Committer C O Mitter <committer@example.com> maps to Committed <committer@example.com>
235 EOF
236
237 test_expect_success 'Log output (complex mapping)' '
238         git log --pretty=format:"Author %an <%ae> maps to %aN <%aE>%nCommitter %cn <%ce> maps to %cN <%cE>%n" >actual &&
239         test_cmp expect actual
240 '
241
242 # git blame
243 cat >expect <<\EOF
244 ^OBJI (A U Thor     DATE 1) one
245 OBJID (Some Dude    DATE 2) two
246 OBJID (Other Author DATE 3) three
247 OBJID (Other Author DATE 4) four
248 OBJID (Santa Claus  DATE 5) five
249 OBJID (Santa Claus  DATE 6) six
250 OBJID (CTO          DATE 7) seven
251 EOF
252 test_expect_success 'Blame output (complex mapping)' '
253         git blame one >actual &&
254         fuzz_blame actual >actual.fuzz &&
255         test_cmp expect actual.fuzz
256 '
257
258 test_done