forked from spcau/godiff
-
Notifications
You must be signed in to change notification settings - Fork 0
/
textgen.go
93 lines (76 loc) · 2.11 KB
/
textgen.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
package main
import "fmt"
func GenerateText(filename1, filename2 string, msg1, msg2 string) {
out_acquire_lock()
if flag_unified_context {
fmt.Fprintf(out, "<<< %s: %s\n", filename1, msg1)
fmt.Fprintf(out, ">>> %s: %s\n\n", filename2, msg2)
} else {
fmt.Fprintf(out, "--- %s: %s\n", filename1, msg1)
fmt.Fprintf(out, "+++ %s: %s\n\n", filename2, msg2)
}
out_release_lock()
}
func (chg *DiffChangerUnifiedText) diff_lines(ops []DiffOp) {
if !chg.header_printed {
out_acquire_lock()
chg.header_printed = true
fmt.Fprintf(out, "--- %s\n", chg.name1)
fmt.Fprintf(out, "+++ %s\n", chg.name2)
}
fmt.Fprintf(out, "@@ -%d,%d +%d,%d @@\n", ops[0].start1+1, ops[len(ops)-1].end1-ops[0].start1, ops[0].start2+1, ops[len(ops)-1].end2-ops[0].start2)
for _, v := range ops {
switch v.op {
case DIFF_OP_INSERT, DIFF_OP_REMOVE, DIFF_OP_MODIFY:
for _, line := range chg.file1[v.start1:v.end1] {
out.WriteString("- ")
out.Write(line)
out.WriteByte('\n')
}
for _, line := range chg.file2[v.start2:v.end2] {
out.WriteString("+ ")
out.Write(line)
out.WriteByte('\n')
}
default:
for _, line := range chg.file1[v.start1:v.end1] {
out.WriteString(" ")
out.Write(line)
out.WriteByte('\n')
}
}
}
}
func (chg *DiffChangerText) diff_lines(ops []DiffOp) {
if !chg.header_printed {
out_acquire_lock()
chg.header_printed = true
fmt.Fprintf(out, "<<< %s\n", chg.name1)
fmt.Fprintf(out, ">>> %s\n", chg.name2)
}
for _, v := range ops {
switch v.op {
case DIFF_OP_SAME:
continue
case DIFF_OP_INSERT:
print_line_numbers("a", v.start1-1, -1, v.start2, v.end2)
case DIFF_OP_REMOVE:
print_line_numbers("d", v.start1, v.end1, v.start2-1, -1)
case DIFF_OP_MODIFY:
print_line_numbers("c", v.start1, v.end1, v.start2, v.end2)
}
for _, line := range chg.file1[v.start1:v.end1] {
out.WriteString("< ")
out.Write(line)
out.WriteByte('\n')
}
if v.end1 > v.start1 && v.end2 > v.start2 {
out.WriteString("---\n")
}
for _, line := range chg.file2[v.start2:v.end2] {
out.WriteString("> ")
out.Write(line)
out.WriteByte('\n')
}
}
}