Skip to content

Commit c1e27be

Browse files
committed
refactor: rewrite differ and test
Signed-off-by: Zxilly <[email protected]>
1 parent a6d0f2e commit c1e27be

File tree

2 files changed

+144
-78
lines changed

2 files changed

+144
-78
lines changed

internal/diff/diff.go

Lines changed: 58 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -42,106 +42,86 @@ type diffSection struct {
4242
newKnownSize int64
4343
}
4444

45-
func newDiffResult(newResult, oldResult *commonResult) diffResult {
46-
ret := diffResult{
47-
Packages: make([]diffPackage, 0),
48-
Sections: make([]diffSection, 0),
49-
}
50-
51-
// diff packages
52-
for k, v := range newResult.Packages {
53-
if oldV, ok := oldResult.Packages[k]; ok {
54-
if v.Size != oldV.Size {
55-
ret.Packages = append(ret.Packages, diffPackage{
56-
diffBase: diffBase{
57-
Name: k,
58-
From: oldV.Size,
59-
To: v.Size,
60-
ChangeType: changeTypeChange,
61-
},
62-
})
45+
func processPackages(newPackages, oldPackages map[string]commonPackage) (ret []diffPackage) {
46+
for k, v := range newPackages {
47+
typ := changeTypeAdd
48+
fromSize := int64(0)
49+
if oldV, ok := oldPackages[k]; ok {
50+
if v.Size == oldV.Size {
51+
continue
6352
}
64-
} else {
65-
ret.Packages = append(ret.Packages, diffPackage{
66-
diffBase: diffBase{
67-
Name: k,
68-
From: 0,
69-
To: v.Size,
70-
ChangeType: changeTypeAdd,
71-
},
72-
})
53+
typ = changeTypeChange
54+
fromSize = oldV.Size
7355
}
56+
ret = append(ret, diffPackage{
57+
diffBase: diffBase{Name: k, From: fromSize, To: v.Size, ChangeType: typ},
58+
})
7459
}
7560

76-
for k, v := range oldResult.Packages {
77-
if _, ok := newResult.Packages[k]; !ok {
78-
ret.Packages = append(ret.Packages, diffPackage{
79-
diffBase: diffBase{
80-
Name: k,
81-
From: v.Size,
82-
To: 0,
83-
ChangeType: changeTypeRemove,
84-
},
61+
for k, v := range oldPackages {
62+
if _, ok := newPackages[k]; !ok {
63+
ret = append(ret, diffPackage{
64+
diffBase: diffBase{Name: k, From: v.Size, To: 0, ChangeType: changeTypeRemove},
8565
})
8666
}
8767
}
8868

89-
// diff sections
90-
newSections := make(map[string]commonSection)
91-
oldSections := make(map[string]commonSection)
69+
return
70+
}
71+
72+
func processSections(newSections, oldSections []commonSection) (ret []diffSection) {
73+
newSectionsMap := make(map[string]commonSection)
74+
oldSectionsMap := make(map[string]commonSection)
9275

93-
for _, v := range newResult.Sections {
94-
newSections[v.Name] = v
76+
for _, v := range newSections {
77+
newSectionsMap[v.Name] = v
9578
}
96-
for _, v := range oldResult.Sections {
97-
oldSections[v.Name] = v
79+
for _, v := range oldSections {
80+
oldSectionsMap[v.Name] = v
9881
}
9982

100-
for k, v := range newSections {
101-
if oldV, ok := oldSections[k]; ok {
102-
if v.UnknownSize() != oldV.UnknownSize() {
103-
ret.Sections = append(ret.Sections, diffSection{
104-
diffBase: diffBase{
105-
Name: k,
106-
From: oldV.FileSize,
107-
To: v.FileSize,
108-
ChangeType: changeTypeChange,
109-
},
110-
oldFileSize: oldV.FileSize,
111-
oldKnownSize: oldV.KnownSize,
112-
newFileSize: v.FileSize,
113-
newKnownSize: v.KnownSize,
114-
})
83+
for k, v := range newSectionsMap {
84+
typ := changeTypeAdd
85+
fromSize := int64(0)
86+
fromFileSize := int64(0)
87+
fromKnownSize := int64(0)
88+
if oldV, ok := oldSectionsMap[k]; ok {
89+
if v.UnknownSize() == oldV.UnknownSize() {
90+
continue
11591
}
116-
} else {
117-
ret.Sections = append(ret.Sections, diffSection{
118-
diffBase: diffBase{
119-
Name: k,
120-
From: 0,
121-
To: v.FileSize,
122-
ChangeType: changeTypeAdd,
123-
},
124-
newFileSize: v.FileSize,
125-
newKnownSize: v.KnownSize,
126-
})
92+
typ = changeTypeChange
93+
fromSize = oldV.UnknownSize()
94+
fromFileSize = oldV.FileSize
95+
fromKnownSize = oldV.KnownSize
12796
}
97+
ret = append(ret, diffSection{
98+
diffBase: diffBase{Name: k, From: fromSize, To: v.UnknownSize(), ChangeType: typ},
99+
oldFileSize: fromFileSize,
100+
oldKnownSize: fromKnownSize,
101+
newFileSize: v.FileSize,
102+
newKnownSize: v.KnownSize,
103+
})
128104
}
129105

130-
for k, v := range oldSections {
131-
if _, ok := newSections[k]; !ok {
132-
ret.Sections = append(ret.Sections, diffSection{
133-
diffBase: diffBase{
134-
Name: k,
135-
From: v.FileSize,
136-
To: 0,
137-
ChangeType: changeTypeRemove,
138-
},
106+
for k, v := range oldSectionsMap {
107+
if _, ok := newSectionsMap[k]; !ok {
108+
ret = append(ret, diffSection{
109+
diffBase: diffBase{Name: k, From: v.UnknownSize(), To: 0, ChangeType: changeTypeRemove},
139110
oldFileSize: v.FileSize,
140111
oldKnownSize: v.KnownSize,
141112
})
142113
}
143114
}
144115

116+
return
117+
}
118+
119+
func newDiffResult(newResult, oldResult *commonResult) diffResult {
120+
ret := diffResult{
121+
Packages: processPackages(newResult.Packages, oldResult.Packages),
122+
Sections: processSections(newResult.Sections, oldResult.Sections),
123+
}
124+
145125
slices.SortFunc(ret.Packages, func(a, b diffPackage) int {
146126
return diffBaseCmp(a.diffBase, b.diffBase)
147127
})

internal/diff/diff_test.go

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package diff
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestProcessPackages(t *testing.T) {
10+
oldPackages := map[string]commonPackage{
11+
"pkg1": {Size: 100},
12+
"pkg2": {Size: 200},
13+
}
14+
newPackages := map[string]commonPackage{
15+
"pkg1": {Size: 150},
16+
"pkg3": {Size: 300},
17+
}
18+
19+
expected := []diffPackage{
20+
{diffBase{Name: "pkg1", From: 100, To: 150, ChangeType: changeTypeChange}},
21+
{diffBase{Name: "pkg3", From: 0, To: 300, ChangeType: changeTypeAdd}},
22+
{diffBase{Name: "pkg2", From: 200, To: 0, ChangeType: changeTypeRemove}},
23+
}
24+
25+
result := processPackages(newPackages, oldPackages)
26+
assert.ElementsMatch(t, expected, result)
27+
}
28+
29+
func TestProcessSections(t *testing.T) {
30+
oldSections := []commonSection{
31+
{Name: "sec1", FileSize: 100, KnownSize: 50},
32+
{Name: "sec2", FileSize: 200, KnownSize: 100},
33+
}
34+
newSections := []commonSection{
35+
{Name: "sec1", FileSize: 150, KnownSize: 75},
36+
{Name: "sec3", FileSize: 300, KnownSize: 150},
37+
}
38+
39+
expected := []diffSection{
40+
{diffBase: diffBase{Name: "sec1", From: 50, To: 75, ChangeType: changeTypeChange}, oldFileSize: 100, oldKnownSize: 50, newFileSize: 150, newKnownSize: 75},
41+
{diffBase: diffBase{Name: "sec3", From: 0, To: 150, ChangeType: changeTypeAdd}, oldFileSize: 0, oldKnownSize: 0, newFileSize: 300, newKnownSize: 150},
42+
{diffBase: diffBase{Name: "sec2", From: 100, To: 0, ChangeType: changeTypeRemove}, oldFileSize: 200, oldKnownSize: 100, newFileSize: 0, newKnownSize: 0},
43+
}
44+
45+
result := processSections(newSections, oldSections)
46+
assert.ElementsMatch(t, expected, result)
47+
}
48+
49+
func TestNewDiffResult(t *testing.T) {
50+
oldResult := &commonResult{
51+
Packages: map[string]commonPackage{
52+
"pkg1": {Size: 100},
53+
"pkg2": {Size: 200},
54+
},
55+
Sections: []commonSection{
56+
{Name: "sec1", FileSize: 100, KnownSize: 50},
57+
{Name: "sec2", FileSize: 200, KnownSize: 100},
58+
},
59+
}
60+
newResult := &commonResult{
61+
Packages: map[string]commonPackage{
62+
"pkg1": {Size: 150},
63+
"pkg3": {Size: 300},
64+
},
65+
Sections: []commonSection{
66+
{Name: "sec1", FileSize: 150, KnownSize: 75},
67+
{Name: "sec3", FileSize: 300, KnownSize: 150},
68+
},
69+
}
70+
71+
expected := diffResult{
72+
Packages: []diffPackage{
73+
{diffBase{Name: "pkg3", From: 0, To: 300, ChangeType: changeTypeAdd}},
74+
{diffBase{Name: "pkg1", From: 100, To: 150, ChangeType: changeTypeChange}},
75+
{diffBase{Name: "pkg2", From: 200, To: 0, ChangeType: changeTypeRemove}},
76+
},
77+
Sections: []diffSection{
78+
{diffBase: diffBase{Name: "sec3", From: 0, To: 150, ChangeType: changeTypeAdd}, oldFileSize: 0, oldKnownSize: 0, newFileSize: 300, newKnownSize: 150},
79+
{diffBase: diffBase{Name: "sec1", From: 50, To: 75, ChangeType: changeTypeChange}, oldFileSize: 100, oldKnownSize: 50, newFileSize: 150, newKnownSize: 75},
80+
{diffBase: diffBase{Name: "sec2", From: 100, To: 0, ChangeType: changeTypeRemove}, oldFileSize: 200, oldKnownSize: 100, newFileSize: 0, newKnownSize: 0},
81+
},
82+
}
83+
84+
result := newDiffResult(newResult, oldResult)
85+
assert.Equal(t, expected, result)
86+
}

0 commit comments

Comments
 (0)