...
1
16
17
18 package differ
19
20 import (
21 "fmt"
22 "os"
23 "os/exec"
24 "runtime"
25 "strings"
26 )
27
28
29
30
31 type Differ struct {
32 Cmd string
33 MultiDiff bool
34 Args []string
35 }
36
37
38 func (d *Differ) run(command string, args ...string) error {
39
40 if d.Cmd == ":" {
41 return nil
42 }
43
44
45 var cmd *exec.Cmd
46 if command == "FC" {
47 cmd = exec.Command(command, "/T")
48 } else {
49 cmd = exec.Command("/usr/bin/env", "bash", "-c", command+` "$@"`, "--")
50 }
51 cmd.Args = append(cmd.Args, args...)
52 cmd.Stdout = os.Stdout
53 cmd.Stderr = os.Stderr
54 if err := cmd.Start(); err != nil {
55
56 return fmt.Errorf("buildifier: %s: %v", command, err)
57 }
58
59
60
61
62
63 return cmd.Wait()
64 }
65
66
67
68
69 func (d *Differ) Show(old, new string) error {
70 if !d.MultiDiff {
71 return d.run(d.Cmd, old, new)
72 }
73
74 d.Args = append(d.Args, ":", old, new)
75 return nil
76 }
77
78
79
80
81 func (d *Differ) Run() error {
82 if !d.MultiDiff {
83 return nil
84 }
85
86 if len(d.Args) == 0 {
87 return nil
88 }
89 return d.run(d.Cmd, d.Args...)
90 }
91
92
93 func Find() (*Differ, bool) {
94 d := &Differ{}
95 deprecationWarning := false
96 if cmd := os.Getenv("BUILDIFIER_DIFF"); cmd != "" {
97 deprecationWarning = true
98 d.Cmd = cmd
99 }
100
101
102 knowMultiDiff := false
103 if md := os.Getenv("BUILDIFIER_MULTIDIFF"); md == "0" || md == "1" {
104 deprecationWarning = true
105 d.MultiDiff = md == "1"
106 knowMultiDiff = true
107 }
108
109 if d.Cmd != "" {
110 if !knowMultiDiff {
111 lower := strings.ToLower(d.Cmd)
112 d.MultiDiff = strings.Contains(lower, "tkdiff") &&
113 isatty(1) && os.Getenv("DISPLAY") != ""
114 }
115 } else {
116 if !knowMultiDiff {
117 d.MultiDiff = isatty(1) && os.Getenv("DISPLAY") != ""
118 if d.MultiDiff {
119 deprecationWarning = true
120 }
121 }
122 if d.MultiDiff {
123 d.Cmd = "tkdiff"
124 } else {
125 if runtime.GOOS == "windows" {
126 deprecationWarning = true
127 d.Cmd = "FC"
128 } else {
129 d.Cmd = "diff --unified"
130 }
131 }
132 }
133 return d, deprecationWarning
134 }
135
View as plain text