Skip to content

Commit 7277ad2

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

File tree

4 files changed

+37
-8
lines changed

4 files changed

+37
-8
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

+16-3
Original file line numberDiff line numberDiff line change
@@ -177,19 +177,32 @@ func TestIdentityDetectorLoadPeopleDict(t *testing.T) {
177177
id := fixtureIdentityDetector()
178178
err := id.LoadPeopleDict(path.Join("..", "..", "test_data", "identities"))
179179
assert.Nil(t, err)
180-
assert.Equal(t, len(id.PeopleDict), 7)
180+
assert.Equal(t, len(id.PeopleDict), 10)
181181
assert.Contains(t, id.PeopleDict, "linus torvalds")
182182
assert.Contains(t, id.PeopleDict, "[email protected]")
183183
assert.Contains(t, id.PeopleDict, "vadim markovtsev")
184184
assert.Contains(t, id.PeopleDict, "[email protected]")
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+
192+
assert.Equal(t, len(id.ReversedPeopleDict), 5)
189193
assert.Equal(t, id.ReversedPeopleDict[0], "Linus Torvalds")
190194
assert.Equal(t, id.ReversedPeopleDict[1], "Vadim Markovtsev")
191195
assert.Equal(t, id.ReversedPeopleDict[2], "Máximo Cuadros")
192-
assert.Equal(t, id.ReversedPeopleDict[3], AuthorMissingName)
196+
assert.Equal(t, id.ReversedPeopleDict[3], "Duplicate")
197+
assert.Equal(t, id.ReversedPeopleDict[4], AuthorMissingName)
198+
199+
assert.Equal(t, id.PeopleDict["duplicate"], id.PeopleDict["[email protected]"])
200+
assert.Equal(t, id.PeopleDict["duplicate"], id.PeopleDict["[email protected]"])
201+
202+
assert.Equal(t, id.PeopleDict["vadim markovtsev"], id.PeopleDict["[email protected]"])
203+
assert.Equal(t, id.PeopleDict["vadim markovtsev"], id.PeopleDict["[email protected]"])
204+
205+
assert.NotEqual(t, id.PeopleDict["duplicate"], id.PeopleDict["vadim markovtsev"])
193206
}
194207

195208
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)