1 #!/bin/sh
3 test_description='.mailmap configurations'
5 . ./test-lib.sh
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 }
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 '
26 cat >expect <<\EOF
27 A U Thor (1):
28 initial
30 nick1 (1):
31 second
33 EOF
35 test_expect_success 'No mailmap' '
36 git shortlog HEAD >actual &&
37 test_cmp expect actual
38 '
40 cat >expect <<\EOF
41 Repo Guy (1):
42 initial
44 nick1 (1):
45 second
47 EOF
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 '
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
61 Repo Guy (1):
62 initial
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 '
73 cat >expect <<\EOF
74 External Guy (1):
75 initial
77 Internal Guy (1):
78 second
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 '
88 cat >expect <<\EOF
89 Repo Guy (1):
90 initial
92 nick1 (1):
93 second
95 EOF
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 '
104 cat >expect <<\EOF
105 Internal Guy (1):
106 second
108 Repo Guy (1):
109 initial
111 EOF
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 '
121 cat >expect <<\EOF
122 Internal Guy (1):
123 second
125 Repo Guy (1):
126 initial
128 EOF
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 '
138 cat >expect <<\EOF
139 A U Thor (1):
140 initial
142 nick1 (1):
143 second
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 '
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
157 CTO <cto@company.xx> (1):
158 seventh
160 Other Author <other@author.xx> (2):
161 third
162 fourth
164 Santa Claus <santa.claus@northpole.xx> (2):
165 fifth
166 sixth
168 Some Dude <some@dude.xx> (1):
169 second
171 EOF
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 &&
179 echo four >>one &&
180 git add one &&
181 test_tick &&
182 git commit --author "nick2 <nick2@company.xx>" -m fourth &&
184 echo five >>one &&
185 git add one &&
186 test_tick &&
187 git commit --author "santa <me@company.xx>" -m fifth &&
189 echo six >>one &&
190 git add one &&
191 test_tick &&
192 git commit --author "claus <me@company.xx>" -m sixth &&
194 echo seven >>one &&
195 git add one &&
196 test_tick &&
197 git commit --author "CTO <cto@coompany.xx>" -m seventh &&
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 &&
208 git shortlog -e HEAD >actual &&
209 test_cmp expect actual
211 '
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>
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>
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>
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>
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>
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>
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
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 '
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 '
258 test_done