diff --git a/internal/pb/pb.pb.go b/internal/pb/pb.pb.go index f1d6ef5e..b412caab 100644 --- a/internal/pb/pb.pb.go +++ b/internal/pb/pb.pb.go @@ -371,7 +371,7 @@ type CouplesAnalysisResults struct { PeopleCouples *Couples `protobuf:"bytes,7,opt,name=people_couples,json=peopleCouples" json:"people_couples,omitempty"` // order corresponds to `people_couples::index` PeopleFiles []*TouchedFiles `protobuf:"bytes,8,rep,name=people_files,json=peopleFiles" json:"people_files,omitempty"` - // order corresponds to `files_couples::index` + // order corresponds to `file_couples::index` FilesLines []int32 `protobuf:"varint,9,rep,packed,name=files_lines,json=filesLines" json:"files_lines,omitempty"` } diff --git a/internal/pb/pb.proto b/internal/pb/pb.proto index 1ec96fd5..4e5227d2 100644 --- a/internal/pb/pb.proto +++ b/internal/pb/pb.proto @@ -80,7 +80,7 @@ message CouplesAnalysisResults { Couples people_couples = 7; // order corresponds to `people_couples::index` repeated TouchedFiles people_files = 8; - // order corresponds to `files_couples::index` + // order corresponds to `file_couples::index` repeated int32 files_lines = 9; } @@ -109,6 +109,7 @@ message ShotnessAnalysisResults { message FileHistory { repeated string commits = 1; + //map changes_by_developer = 2; } message FileHistoryResultMessage { diff --git a/internal/test_data/couples.pb b/internal/test_data/couples.pb index 584a56fa..423ec563 100644 Binary files a/internal/test_data/couples.pb and b/internal/test_data/couples.pb differ diff --git a/leaves/couples.go b/leaves/couples.go index 08ebe066..41d217e5 100644 --- a/leaves/couples.go +++ b/leaves/couples.go @@ -295,12 +295,18 @@ func (couples *CouplesAnalysis) Deserialize(pbmessage []byte) (interface{}, erro reversedPeopleDict: message.PeopleCouples.Index, } for i, files := range message.PeopleFiles { - result.FilesLines[i] = int(message.FilesLines[i]) result.PeopleFiles[i] = make([]int, len(files.Files)) for j, val := range files.Files { result.PeopleFiles[i][j] = int(val) } } + if len(message.FileCouples.Index) != len(message.FilesLines) { + log.Panicf("Couples PB message integrity violation: file_couples (%d) != file_lines (%d)", + len(message.FileCouples.Index), len(message.FilesLines)) + } + for i, v := range message.FilesLines { + result.FilesLines[i] = int(v) + } convertCSR := func(dest []map[int]int64, src *pb.CompressedSparseRowMatrix) { for indptr := range src.Indptr { if indptr == 0 { @@ -323,9 +329,9 @@ func (couples *CouplesAnalysis) MergeResults(r1, r2 interface{}, c1, c2 *core.Co cr2 := r2.(CouplesResult) merged := CouplesResult{} var people, files map[string][3]int - people, merged.reversedPeopleDict = identity.Detector{}.MergeReversedDicts( - cr1.reversedPeopleDict, cr2.reversedPeopleDict) - files, merged.Files = identity.Detector{}.MergeReversedDicts(cr1.Files, cr2.Files) + id := identity.Detector{} + people, merged.reversedPeopleDict = id.MergeReversedDicts(cr1.reversedPeopleDict, cr2.reversedPeopleDict) + files, merged.Files = id.MergeReversedDicts(cr1.Files, cr2.Files) merged.FilesLines = make([]int, len(merged.Files)) for i, name := range merged.Files { idxs := files[name] @@ -364,8 +370,7 @@ func (couples *CouplesAnalysis) MergeResults(r1, r2 interface{}, c1, c2 *core.Co sort.Ints(merged.PeopleFiles[i]) } merged.PeopleMatrix = make([]map[int]int64, len(merged.reversedPeopleDict)+1) - addPeople := func(peopleMatrix []map[int]int64, reversedPeopleDict []string, - reversedFilesDict []string) { + addPeople := func(peopleMatrix []map[int]int64, reversedPeopleDict []string) { for pi, pc := range peopleMatrix { var idx int if pi < len(reversedPeopleDict) { @@ -378,13 +383,19 @@ func (couples *CouplesAnalysis) MergeResults(r1, r2 interface{}, c1, c2 *core.Co m = map[int]int64{} merged.PeopleMatrix[idx] = m } - for file, val := range pc { - m[files[reversedFilesDict[file]][0]] += val + for otherDev, val := range pc { + var otherIdx int + if otherDev < len(reversedPeopleDict) { + otherIdx = people[reversedPeopleDict[otherDev]][0] + } else { + otherIdx = len(merged.reversedPeopleDict) + } + m[otherIdx] += val } } } - addPeople(cr1.PeopleMatrix, cr1.reversedPeopleDict, cr1.Files) - addPeople(cr2.PeopleMatrix, cr2.reversedPeopleDict, cr2.Files) + addPeople(cr1.PeopleMatrix, cr1.reversedPeopleDict) + addPeople(cr2.PeopleMatrix, cr2.reversedPeopleDict) merged.FilesMatrix = make([]map[int]int64, len(merged.Files)) addFiles := func(filesMatrix []map[int]int64, reversedFilesDict []string) { for fi, fc := range filesMatrix { diff --git a/leaves/couples_test.go b/leaves/couples_test.go index b23820ac..40079fea 100644 --- a/leaves/couples_test.go +++ b/leaves/couples_test.go @@ -455,6 +455,9 @@ func TestCouplesDeserialize(t *testing.T) { assert.Len(t, result.PeopleMatrix, 3) assert.Len(t, result.Files, 74) assert.Len(t, result.FilesLines, 74) + for _, v := range result.FilesLines { + assert.True(t, v > 0) + } assert.Len(t, result.FilesMatrix, 74) }