From 8bce284496e60231ac2e82fc023ff1faadff6aa5 Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Thu, 17 Oct 2013 23:40:43 +0000 Subject: [PATCH 1/2] clean split between errors and output. JSON output always valid --- commands.go | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/commands.go b/commands.go index 7d33b81d0a..18661d83a9 100644 --- a/commands.go +++ b/commands.go @@ -577,11 +577,10 @@ func (cli *DockerCli) CmdInspect(args ...string) error { cmd.Usage() return nil } - fmt.Fprintf(cli.out, "[") - for i, name := range args { - if i > 0 { - fmt.Fprintf(cli.out, ",") - } + + indented := new(bytes.Buffer) + + for _, name := range args { obj, _, err := cli.call("GET", "/containers/"+name+"/json", nil) if err != nil { obj, _, err = cli.call("GET", "/images/"+name+"/json", nil) @@ -591,14 +590,18 @@ func (cli *DockerCli) CmdInspect(args ...string) error { } } - indented := new(bytes.Buffer) if err = json.Indent(indented, obj, "", " "); err != nil { fmt.Fprintf(cli.err, "%s\n", err) continue } - if _, err := io.Copy(cli.out, indented); err != nil { - fmt.Fprintf(cli.err, "%s\n", err) - } + indented.WriteString(",") + } + // Remove trailling ',' + indented.Truncate(indented.Len() - 1) + + fmt.Fprintf(cli.out, "[") + if _, err := io.Copy(cli.out, indented); err != nil { + fmt.Fprintf(cli.err, "%s\n", err) } fmt.Fprintf(cli.out, "]") return nil From 01284cbf7350d1b4537e83ddd60274afccf32ecf Mon Sep 17 00:00:00 2001 From: Victor Vieux Date: Thu, 17 Oct 2013 23:45:18 +0000 Subject: [PATCH 2/2] fix status code --- commands.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/commands.go b/commands.go index 18661d83a9..124c946837 100644 --- a/commands.go +++ b/commands.go @@ -579,6 +579,7 @@ func (cli *DockerCli) CmdInspect(args ...string) error { } indented := new(bytes.Buffer) + status := 0 for _, name := range args { obj, _, err := cli.call("GET", "/containers/"+name+"/json", nil) @@ -586,12 +587,14 @@ func (cli *DockerCli) CmdInspect(args ...string) error { obj, _, err = cli.call("GET", "/images/"+name+"/json", nil) if err != nil { fmt.Fprintf(cli.err, "No such image or container: %s\n", name) + status = 1 continue } } if err = json.Indent(indented, obj, "", " "); err != nil { fmt.Fprintf(cli.err, "%s\n", err) + status = 1 continue } indented.WriteString(",") @@ -601,9 +604,12 @@ func (cli *DockerCli) CmdInspect(args ...string) error { fmt.Fprintf(cli.out, "[") if _, err := io.Copy(cli.out, indented); err != nil { - fmt.Fprintf(cli.err, "%s\n", err) + return err } fmt.Fprintf(cli.out, "]") + if status != 0 { + return &utils.StatusError{Status: status} + } return nil }