e818de6ddd904378265cb11f2d48075cda474f5f
[git/git.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-existant' '
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