Переглянути джерело

Extract MergeReversedDicts() from Burndown

Vadim Markovtsev 7 роки тому
батько
коміт
52012724fd
3 змінених файлів з 55 додано та 25 видалено
  1. 3 21
      burndown.go
  2. 26 0
      identity.go
  3. 26 4
      identity_test.go

+ 3 - 21
burndown.go

@@ -329,27 +329,9 @@ func (analyser *BurndownAnalysis) MergeResults(
 	} else {
 		merged.granularity = bar2.granularity
 	}
-	people := map[string][3]int{}
-	for i, pid := range bar1.reversedPeopleDict {
-		ptrs := people[pid]
-		ptrs[0] = len(people)
-		ptrs[1] = i
-		ptrs[2] = -1
-		people[pid] = ptrs
-	}
-	for i, pid := range bar2.reversedPeopleDict {
-		ptrs, exists := people[pid]
-		if !exists {
-			ptrs[0] = len(people)
-			ptrs[1] = -1
-		}
-		ptrs[2] = i
-		people[pid] = ptrs
-	}
-	merged.reversedPeopleDict = make([]string, len(people))
-	for name, ptrs := range people {
-		merged.reversedPeopleDict[ptrs[0]] = name
-	}
+	var people map[string][3]int
+	people, merged.reversedPeopleDict = IdentityDetector{}.MergeReversedDicts(
+		bar1.reversedPeopleDict, bar2.reversedPeopleDict)
 	var wg sync.WaitGroup
 	if len(bar1.GlobalHistory) > 0 || len(bar2.GlobalHistory) > 0 {
 		wg.Add(1)

+ 26 - 0
identity.go

@@ -213,6 +213,32 @@ func (id *IdentityDetector) GeneratePeopleDict(commits []*object.Commit) {
 	id.ReversedPeopleDict = reverse_dict
 }
 
+// MergeReversedDicts joins two identity lists together, excluding duplicates, in-order.
+func (_ IdentityDetector) MergeReversedDicts(rd1, rd2 []string) (map[string][3]int, []string) {
+	people := map[string][3]int{}
+	for i, pid := range rd1 {
+		ptrs := people[pid]
+		ptrs[0] = len(people)
+		ptrs[1] = i
+		ptrs[2] = -1
+		people[pid] = ptrs
+	}
+	for i, pid := range rd2 {
+		ptrs, exists := people[pid]
+		if !exists {
+			ptrs[0] = len(people)
+			ptrs[1] = -1
+		}
+		ptrs[2] = i
+		people[pid] = ptrs
+	}
+	mrd := make([]string, len(people))
+	for name, ptrs := range people {
+		mrd[ptrs[0]] = name
+	}
+  return people, mrd
+}
+
 func init() {
 	Registry.Register(&IdentityDetector{})
 }

+ 26 - 4
identity_test.go

@@ -144,7 +144,7 @@ func TestIdentityDetectorConsume(t *testing.T) {
 	assert.Equal(t, res["author"].(int), MISSING_AUTHOR)
 }
 
-func TestLoadPeopleDict(t *testing.T) {
+func TestIdentityDetectorLoadPeopleDict(t *testing.T) {
 	id := fixtureIdentityDetector()
 	err := id.LoadPeopleDict(path.Join("test_data", "identities"))
 	assert.Nil(t, err)
@@ -179,7 +179,7 @@ func TestGeneratePeopleDict(t *testing.T) {
 }
 */
 
-func TestGeneratePeopleDict(t *testing.T) {
+func TestIdentityDetectorGeneratePeopleDict(t *testing.T) {
 	id := fixtureIdentityDetector()
 	commits := make([]*object.Commit, 0)
 	iter, err := testRepository.CommitObjects()
@@ -232,7 +232,7 @@ func TestGeneratePeopleDict(t *testing.T) {
 	assert.NotEqual(t, id.ReversedPeopleDict[len(id.ReversedPeopleDict)-1], UNMATCHED_AUTHOR)
 }
 
-func TestLoadPeopleDictInvalidPath(t *testing.T) {
+func TestIdentityDetectorLoadPeopleDictInvalidPath(t *testing.T) {
 	id := fixtureIdentityDetector()
 	ipath := "/xxxyyyzzzInvalidPath!hehe"
 	err := id.LoadPeopleDict(ipath)
@@ -350,7 +350,7 @@ func getFakeCommitWithFile(name string, contents string) *object.Commit {
 	return &c
 }
 
-func TestGeneratePeopleDictMailmap(t *testing.T) {
+func TestIdentityDetectorGeneratePeopleDictMailmap(t *testing.T) {
 	id := fixtureIdentityDetector()
 	commits := make([]*object.Commit, 0)
 	iter, err := testRepository.CommitObjects()
@@ -369,3 +369,25 @@ func TestGeneratePeopleDictMailmap(t *testing.T) {
 	assert.Contains(t, id.ReversedPeopleDict,
 		"strange guy|vadim markovtsev|gmarkhor@gmail.com|vadim@sourced.tech")
 }
+
+func TestIdentityDetectorMergeReversedDicts(t *testing.T) {
+	pa1 := [...]string{"one", "two"}
+	pa2 := [...]string{"two", "three"}
+	people, merged := IdentityDetector{}.MergeReversedDicts(pa1[:], pa2[:])
+	assert.Len(t, people, 3)
+	assert.Len(t, merged, 3)
+	assert.Equal(t, people["one"], [3]int{0, 0, -1})
+	assert.Equal(t, people["two"], [3]int{1, 1, 0})
+	assert.Equal(t, people["three"], [3]int{2, -1, 1})
+	vm := [...]string{"one", "two", "three"}
+	assert.Equal(t, merged, vm[:])
+	pa1 = [...]string{"two", "one"}
+	people, merged = IdentityDetector{}.MergeReversedDicts(pa1[:], pa2[:])
+	assert.Len(t, people, 3)
+	assert.Len(t, merged, 3)
+	assert.Equal(t, people["one"], [3]int{1, 1, -1})
+	assert.Equal(t, people["two"], [3]int{0, 0, 0})
+	assert.Equal(t, people["three"], [3]int{2, -1, 1})
+	vm = [...]string{"two", "one", "three"}
+	assert.Equal(t, merged, vm[:])
+}