Skip to content

Commit bad1ead

Browse files
committed
src-dGH-355: Handle duplicates in --people-dict and extend docs
1 parent 13a2081 commit bad1ead

File tree

4 files changed

+39
-7
lines changed

4 files changed

+39
-7
lines changed

README.md

+8-1
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,14 @@ and add the unknown email to the list of that developer's emails.
223223

224224
If `--people-dict` is specified, it should point to a text file with the custom identities. The
225225
format is: every line is a single developer, it contains all the matching emails and names separated
226-
by `|`. The case is ignored.
226+
by `|`. The case is ignored. Example file contents:
227+
```
228+
Linus Torvalds|[email protected]
229+
230+
```
231+
232+
If `--people-dict` is not specified a [`.mailmap`](https://git-scm.com/docs/git-check-mailmap) file
233+
will be used if it exists in the latest commit.
227234

228235
#### Overwrites matrix
229236

internal/plumbing/identity/identity.go

+10-3
Original file line numberDiff line numberDiff line change
@@ -186,11 +186,18 @@ func (detector *Detector) LoadPeopleDict(path string) error {
186186
size := 0
187187
for scanner.Scan() {
188188
ids := strings.Split(scanner.Text(), "|")
189+
canon := ids[0]
190+
var exists bool
191+
var canon_i int
192+
// lookup or create a new canonical value
193+
if canon_i, exists = dict[canon]; !exists {
194+
reverseDict = append(reverseDict, canon)
195+
size++
196+
canon_i = size
197+
}
189198
for _, id := range ids {
190-
dict[strings.ToLower(id)] = size
199+
dict[strings.ToLower(id)] = canon_i
191200
}
192-
reverseDict = append(reverseDict, ids[0])
193-
size++
194201
}
195202
reverseDict = append(reverseDict, AuthorMissingName)
196203
detector.PeopleDict = dict

internal/plumbing/identity/identity_test.go

+18-2
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,27 @@ func TestIdentityDetectorLoadPeopleDict(t *testing.T) {
185185
assert.Contains(t, id.PeopleDict, "[email protected]")
186186
assert.Contains(t, id.PeopleDict, "máximo cuadros")
187187
assert.Contains(t, id.PeopleDict, "[email protected]")
188-
assert.Equal(t, len(id.ReversedPeopleDict), 4)
188+
assert.Contains(t, id.PeopleDict, "duplicate")
189+
assert.Contains(t, id.PeopleDict, "[email protected]")
190+
assert.Contains(t, id.PeopleDict, "[email protected]")
191+
assert.Contains(t, id.PeopleDict, "multiple")
192+
assert.Contains(t, id.PeopleDict, "[email protected]")
193+
assert.Contains(t, id.PeopleDict, "[email protected]")
194+
195+
assert.Equal(t, len(id.ReversedPeopleDict), 5)
189196
assert.Equal(t, id.ReversedPeopleDict[0], "Linus Torvalds")
190197
assert.Equal(t, id.ReversedPeopleDict[1], "Vadim Markovtsev")
191198
assert.Equal(t, id.ReversedPeopleDict[2], "Máximo Cuadros")
192-
assert.Equal(t, id.ReversedPeopleDict[3], AuthorMissingName)
199+
assert.Equal(t, id.ReversedPeopleDict[3], "Duplicate")
200+
assert.Equal(t, id.ReversedPeopleDict[4], AuthorMissingName)
201+
202+
assert.Equal(t, id.PeopleDict["duplicate"], id.PeopleDict["[email protected]"])
203+
assert.Equal(t, id.PeopleDict["duplicate"], id.PeopleDict["[email protected]"])
204+
205+
assert.Equal(t, id.PeopleDict["vadim markovtsev"], id.PeopleDict["[email protected]"])
206+
assert.Equal(t, id.PeopleDict["vadim markovtsev"], id.PeopleDict["[email protected]"])
207+
208+
assert.NotEqual(t, id.PeopleDict["multiple"], id.PeopleDict["vadim markovtsev"])
193209
}
194210

195211
func TestIdentityDetectorLoadPeopleDictWrongPath(t *testing.T) {

internal/test_data/identities

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
Linus Torvalds|[email protected]
22
3-
Máximo Cuadros|[email protected]
3+
Máximo Cuadros|[email protected]
4+
5+

0 commit comments

Comments
 (0)