-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdiff.go
132 lines (115 loc) · 2.43 KB
/
diff.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package main
import (
"encoding/json"
"os"
"strings"
)
func read(path string) ([]ParsedTask, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, err
}
var tasks []ParsedTask
err = json.Unmarshal(data, &tasks)
if err != nil {
return nil, err
}
return tasks, nil
}
func extractTask(task ParsedTask) *DiffInfo {
return &DiffInfo{
Text: task.Text,
Line: task.Line,
File: task.File,
Context: task.Context,
}
}
func sameText(task1, task2 ParsedTask) bool {
return strings.TrimSpace(task1.Text) == strings.TrimSpace(task2.Text)
}
func generate_diff(dir1 string, dir2 string) ([]DiffResult, error) {
base_tasks, err := read(dir1)
if err != nil {
return nil, err
}
new_tasks, err := read(dir2)
if err != nil {
return nil, err
}
var diffs []DiffResult
for _, new_task := range new_tasks {
found := false
// search for the same text but different line or file
for _, base_task := range base_tasks {
if sameText(base_task, new_task) {
diffType := "SAME"
if base_task.Line != new_task.Line || base_task.File != new_task.File {
diffType = "MOVE"
}
diffs = append(diffs, DiffResult{
ID: base_task.ID,
Tag: new_task.Tag,
Type: diffType,
Data: DiffData{
Old: extractTask(base_task),
New: extractTask(new_task),
},
})
found = true
break
}
}
if found {
continue
}
// then we need to see if line number and tag are same but text is different
for _, base_task := range base_tasks {
if base_task.Line == new_task.Line && base_task.Tag == new_task.Tag && !sameText(base_task, new_task) {
diffs = append(diffs, DiffResult{
ID: base_task.ID,
Tag: new_task.Tag,
Type: "UPDATE",
Data: DiffData{
Old: extractTask(base_task),
New: extractTask(new_task),
},
})
found = true
break
}
}
if found {
continue
}
diffs = append(diffs, DiffResult{
ID: new_task.ID,
Tag: new_task.Tag,
Type: "NEW",
Data: DiffData{
Old: nil,
New: extractTask(new_task),
},
})
}
for _, base_task := range base_tasks {
found := false
for _, diff := range diffs {
if diff.ID == base_task.ID {
found = true
break
}
}
if !found {
diffs = append(diffs, DiffResult{
ID: base_task.ID,
Tag: base_task.Tag,
Type: "DELETE",
Data: DiffData{
Old: extractTask(base_task),
New: nil,
},
})
}
}
return diffs, nil
}