Skip to content

Commit c79c2ec

Browse files
committed
Add --git-diff-driver flag.
1 parent 128b555 commit c79c2ec

1 file changed

Lines changed: 63 additions & 29 deletions

File tree

main.go

Lines changed: 63 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,20 @@ import (
1717

1818
const version = "HEAD"
1919

20-
var color = flag.Bool("color", false, "Print color diff")
21-
var format = flag.String("f", "", "Diff format (jd, patch, merge)")
22-
var mset = flag.Bool("mset", false, "Arrays as multisets")
23-
var output = flag.String("o", "", "Output file")
24-
var patch = flag.Bool("p", false, "Patch mode")
25-
var port = flag.Int("port", 0, "Serve web UI on port")
26-
var set = flag.Bool("set", false, "Arrays as sets")
27-
var setkeys = flag.String("setkeys", "", "Keys to identify set objects")
28-
var translate = flag.String("t", "", "Translate mode")
29-
var ver = flag.Bool("version", false, "Print version and exit")
30-
var yaml = flag.Bool("yaml", false, "Read and write YAML")
20+
var (
21+
color = flag.Bool("color", false, "Print color diff")
22+
format = flag.String("f", "", "Diff format (jd, patch, merge)")
23+
gitDiffDriver = flag.Bool("git-diff-driver", false, "Use jd as a git diff driver.")
24+
mset = flag.Bool("mset", false, "Arrays as multisets")
25+
output = flag.String("o", "", "Output file")
26+
patch = flag.Bool("p", false, "Patch mode")
27+
port = flag.Int("port", 0, "Serve web UI on port")
28+
set = flag.Bool("set", false, "Arrays as sets")
29+
setkeys = flag.String("setkeys", "", "Keys to identify set objects")
30+
translate = flag.String("t", "", "Translate mode")
31+
ver = flag.Bool("version", false, "Print version and exit")
32+
yaml = flag.Bool("yaml", false, "Read and write YAML")
33+
)
3134

3235
func main() {
3336
flag.Parse()
@@ -46,6 +49,14 @@ func main() {
4649
if err != nil {
4750
errorAndExit(err.Error())
4851
}
52+
if *gitDiffDriver {
53+
err := printGitDiffDriver(metadata)
54+
if err != nil {
55+
panic(err)
56+
}
57+
os.Exit(0)
58+
return
59+
}
4960
mode := diffMode
5061
if *patch {
5162
mode = patchMode
@@ -175,6 +186,41 @@ func printUsageAndExit() {
175186
}
176187

177188
func printDiff(a, b string, metadata []jd.Metadata) {
189+
str, err := diff(a, b, metadata)
190+
if err != nil {
191+
errorAndExit(err.Error())
192+
}
193+
if *output == "" {
194+
if str == "" {
195+
196+
}
197+
fmt.Print(str)
198+
os.Exit(1)
199+
} else {
200+
if str == "" {
201+
os.Exit(0)
202+
}
203+
ioutil.WriteFile(*output, []byte(str), 0644)
204+
os.Exit(1)
205+
}
206+
}
207+
208+
func printGitDiffDriver(metadata []jd.Metadata) error {
209+
if len(flag.Args()) != 7 {
210+
return fmt.Errorf("Git diff driver expects exactly 7 arguments.")
211+
}
212+
a := readFile(flag.Arg(1))
213+
b := readFile(flag.Arg(4))
214+
str, err := diff(a, b, metadata)
215+
if err != nil {
216+
return err
217+
}
218+
fmt.Print(str)
219+
os.Exit(0)
220+
return nil
221+
}
222+
223+
func diff(a, b string, metadata []jd.Metadata) (string, error) {
178224
var aNode, bNode jd.JsonNode
179225
var err error
180226
if *yaml {
@@ -183,15 +229,15 @@ func printDiff(a, b string, metadata []jd.Metadata) {
183229
aNode, err = jd.ReadJsonString(a)
184230
}
185231
if err != nil {
186-
errorAndExit(err.Error())
232+
return "", err
187233
}
188234
if *yaml {
189235
bNode, err = jd.ReadYamlString(b)
190236
} else {
191237
bNode, err = jd.ReadJsonString(b)
192238
}
193239
if err != nil {
194-
errorAndExit(err.Error())
240+
return "", err
195241
}
196242
diff := aNode.Diff(bNode, metadata...)
197243
var renderOptions []jd.RenderOption
@@ -205,29 +251,17 @@ func printDiff(a, b string, metadata []jd.Metadata) {
205251
case "patch":
206252
str, err = diff.RenderPatch()
207253
if err != nil {
208-
errorAndExit(err.Error())
254+
return "", err
209255
}
210256
case "merge":
211257
str, err = diff.RenderMerge()
212258
if err != nil {
213-
errorAndExit(err.Error())
259+
return "", err
214260
}
215261
default:
216-
errorAndExit("Invalid format: %q", *format)
217-
}
218-
if *output == "" {
219-
if str == "" {
220-
os.Exit(0)
221-
}
222-
fmt.Print(str)
223-
os.Exit(1)
224-
} else {
225-
if str == "" {
226-
os.Exit(0)
227-
}
228-
ioutil.WriteFile(*output, []byte(str), 0644)
229-
os.Exit(1)
262+
return "", fmt.Errorf("Invalid format: %q", *format)
230263
}
264+
return str, nil
231265
}
232266

233267
func printPatch(p, a string, metadata []jd.Metadata) {

0 commit comments

Comments
 (0)