@@ -17,17 +17,20 @@ import (
1717
1818const 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
3235func 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
177188func 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
233267func printPatch (p , a string , metadata []jd.Metadata ) {
0 commit comments