-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdiff.go
79 lines (73 loc) · 1.38 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
package tbln
import (
"fmt"
"io"
)
// DiffMode represents the mode of diff.
type DiffMode int
// Represents the diff mode
const (
OnlyAdd DiffMode = iota
OnlyDiff
AllDiff
)
func (m DiffMode) String() string {
switch m {
case OnlyAdd:
return "OnlyAdd"
case OnlyDiff:
return "OnlyDiff"
case AllDiff:
return "AllDiff"
default:
return "Unknown"
}
}
// Diff returns diff format
func (d *DiffRow) Diff(diffMode DiffMode) string {
switch d.Les {
case 0:
if diffMode == AllDiff {
return fmt.Sprintf(" %s", JoinRow(d.Self))
}
case 1:
if diffMode == OnlyAdd {
return JoinRow(d.Other)
}
return fmt.Sprintf("+%s", JoinRow(d.Other))
case -1:
if diffMode == AllDiff || diffMode == OnlyDiff {
return fmt.Sprintf("-%s", JoinRow(d.Self))
}
case 2:
var str string
if diffMode == OnlyAdd {
return JoinRow(d.Other)
}
if diffMode == AllDiff || diffMode == OnlyDiff {
str = fmt.Sprintf("-%s\n", JoinRow(d.Self))
}
return str + fmt.Sprintf("+%s", JoinRow(d.Other))
default:
return ""
}
return ""
}
// DiffAll Write diff to writer from two readers.
func DiffAll(writer io.Writer, t1, t2 Reader, diffMode DiffMode) error {
d, err := NewCompare(t1, t2)
if err != nil {
return err
}
for {
dd, err := d.ReadDiffRow()
if err != nil {
break
}
dString := dd.Diff(diffMode)
if dString != "" {
fmt.Fprintf(writer, "%s\n", dString)
}
}
return err
}