-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrsyncdiff.go
138 lines (117 loc) · 3.24 KB
/
rsyncdiff.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
133
134
135
136
137
138
package main
import (
"fmt"
"os"
"os/exec"
"regexp"
"strings"
flag "github.com/docker/docker/pkg/mflag"
)
var builddate string
type arrayFlags []string
func (i *arrayFlags) String() string {
return strings.Join(*i, ",")
}
func (i *arrayFlags) Set(value string) error {
*i = append(*i, value)
return nil
}
var (
rsyncFrom string
rsyncTo string
)
var (
targetFiles arrayFlags
rsyncExclude string
rsyncExcludeFrom string
isVD bool
isLess bool
isColor bool
isC bool
isU bool
)
func init() {
flag.Usage = func() {
fmt.Fprint(os.Stderr, ``)
fmt.Fprintln(os.Stderr, "Difference verification tool of rsync command")
fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0])
fmt.Fprintf(os.Stderr, "BuildDate:%s\n", builddate)
fmt.Fprintf(os.Stderr, "%s [OPTIONS] RSYNC-FROM RSYNC-TO\n", os.Args[0])
flag.PrintDefaults()
}
flag.Var(&targetFiles, []string{"t", "-target-file"}, "Difference acquisition object file")
flag.StringVar(&rsyncExclude, []string{"e", "-exclude"}, "", "rsync exclude option")
flag.StringVar(&rsyncExcludeFrom, []string{"-exclude-from"}, "", "rsync exlude from option")
flag.BoolVar(&isVD, []string{"v", "-vimdiff"}, false, "Produce a vimdiff. Specify also t option")
flag.BoolVar(&isLess, []string{"l", "-less"}, false, "using less for output")
flag.BoolVar(&isColor, []string{"r", "-colordiff"}, false, "using colordiff for output")
flag.BoolVar(&isC, []string{"c", "-context-diff"}, false, "Produce a context format diff")
flag.BoolVar(&isU, []string{"-unified-diff"}, true, "Produce a unified format diff (default)")
flag.Parse()
}
func parseRsyncOutput(rsyncOutput []string) []string {
diffTargets := make([]string, 0, len(rsyncOutput))
reg := regexp.MustCompile(".*(\\++|\\.+|deleting)\\ ")
for _, line := range rsyncOutput {
filename := reg.ReplaceAllString(strings.TrimRight(line, "\n"), "")
if len(targetFiles) != 0 && !isSpecifyTarget(filename) {
continue
}
diffTargets = append(diffTargets, filename)
}
return diffTargets
}
func exitOnUsage(msg string, err error) {
if err != nil {
flag.Usage()
fmt.Println(msg, err)
os.Exit(1)
}
}
func optCheck(args []string) {
var err error
if len(args) != 2 {
flag.Usage()
os.Exit(1)
}
_, err = exec.LookPath("rsync")
exitOnUsage("install of rsync is necessary", err)
_, err = exec.LookPath("cat")
exitOnUsage("install of cat is necessary", err)
if isColor {
_, err = exec.LookPath("colordiff")
exitOnUsage("install of colordiff is necessary", err)
}
if isVD && len(targetFiles) == 0 {
flag.Usage()
os.Exit(1)
}
if isVD {
_, err = exec.LookPath("vimdiff")
exitOnUsage("install of vimdiff is necessary", err)
}
}
func exitOnErr(msg string, err error) {
if err != nil {
fmt.Println(msg, err)
os.Exit(1)
}
}
func main() {
args := flag.Args()
optCheck(args)
rsyncFrom = args[0]
rsyncTo = args[1]
cmd := &Command{}
cmd.Command = "rsync"
cmd.Options = []string{rsyncFrom, rsyncTo}
out, err := cmd.Output()
exitOnErr("rsync proccess", err)
lines := strings.Split(string(out), "\n")
diffTargets := parseRsyncOutput(lines)
outputter := new(DiffOutputter)
outputter.CreateFunction()
exit, err := outputter.Output(diffTargets)
exitOnErr("", err)
os.Exit(exit)
}