Browse code

Use spf13/cobra for docker diff

This fix is part of the effort to convert commands to spf13/cobra #23211.

Thif fix coverted command `docker diff` to use spf13/cobra

Signed-off-by: Yong Tang <yong.tang.github@outlook.com>

Yong Tang authored on 2016/06/06 07:13:55
Showing 6 changed files
... ...
@@ -7,7 +7,6 @@ func (cli *DockerCli) Command(name string) func(...string) error {
7 7
 		"build":              cli.CmdBuild,
8 8
 		"commit":             cli.CmdCommit,
9 9
 		"cp":                 cli.CmdCp,
10
-		"diff":               cli.CmdDiff,
11 10
 		"events":             cli.CmdEvents,
12 11
 		"exec":               cli.CmdExec,
13 12
 		"history":            cli.CmdHistory,
14 13
new file mode 100644
... ...
@@ -0,0 +1,58 @@
0
+package container
1
+
2
+import (
3
+	"fmt"
4
+
5
+	"golang.org/x/net/context"
6
+
7
+	"github.com/docker/docker/api/client"
8
+	"github.com/docker/docker/cli"
9
+	"github.com/docker/docker/pkg/archive"
10
+	"github.com/spf13/cobra"
11
+)
12
+
13
+type diffOptions struct {
14
+	container string
15
+}
16
+
17
+// NewDiffCommand creats a new cobra.Command for `docker diff`
18
+func NewDiffCommand(dockerCli *client.DockerCli) *cobra.Command {
19
+	var opts diffOptions
20
+
21
+	cmd := &cobra.Command{
22
+		Use:   "diff CONTAINER",
23
+		Short: "Inspect changes on a container's filesystem",
24
+		Args:  cli.ExactArgs(1),
25
+		RunE: func(cmd *cobra.Command, args []string) error {
26
+			opts.container = args[0]
27
+			return runDiff(dockerCli, &opts)
28
+		},
29
+	}
30
+	cmd.SetFlagErrorFunc(flagErrorFunc)
31
+
32
+	return cmd
33
+}
34
+
35
+func runDiff(dockerCli *client.DockerCli, opts *diffOptions) error {
36
+	ctx := context.Background()
37
+
38
+	changes, err := dockerCli.Client().ContainerDiff(ctx, opts.container)
39
+	if err != nil {
40
+		return err
41
+	}
42
+
43
+	for _, change := range changes {
44
+		var kind string
45
+		switch change.Kind {
46
+		case archive.ChangeModify:
47
+			kind = "C"
48
+		case archive.ChangeAdd:
49
+			kind = "A"
50
+		case archive.ChangeDelete:
51
+			kind = "D"
52
+		}
53
+		fmt.Fprintf(dockerCli.Out(), "%s %s\n", kind, change.Path)
54
+	}
55
+
56
+	return nil
57
+}
0 58
deleted file mode 100644
... ...
@@ -1,49 +0,0 @@
1
-package client
2
-
3
-import (
4
-	"fmt"
5
-
6
-	"golang.org/x/net/context"
7
-
8
-	Cli "github.com/docker/docker/cli"
9
-	"github.com/docker/docker/pkg/archive"
10
-	flag "github.com/docker/docker/pkg/mflag"
11
-)
12
-
13
-// CmdDiff shows changes on a container's filesystem.
14
-//
15
-// Each changed file is printed on a separate line, prefixed with a single
16
-// character that indicates the status of the file: C (modified), A (added),
17
-// or D (deleted).
18
-//
19
-// Usage: docker diff CONTAINER
20
-func (cli *DockerCli) CmdDiff(args ...string) error {
21
-	cmd := Cli.Subcmd("diff", []string{"CONTAINER"}, Cli.DockerCommands["diff"].Description, true)
22
-	cmd.Require(flag.Exact, 1)
23
-
24
-	cmd.ParseFlags(args, true)
25
-
26
-	if cmd.Arg(0) == "" {
27
-		return fmt.Errorf("Container name cannot be empty")
28
-	}
29
-
30
-	changes, err := cli.client.ContainerDiff(context.Background(), cmd.Arg(0))
31
-	if err != nil {
32
-		return err
33
-	}
34
-
35
-	for _, change := range changes {
36
-		var kind string
37
-		switch change.Kind {
38
-		case archive.ChangeModify:
39
-			kind = "C"
40
-		case archive.ChangeAdd:
41
-			kind = "A"
42
-		case archive.ChangeDelete:
43
-			kind = "D"
44
-		}
45
-		fmt.Fprintf(cli.out, "%s %s\n", kind, change.Path)
46
-	}
47
-
48
-	return nil
49
-}
... ...
@@ -34,6 +34,7 @@ func NewCobraAdaptor(clientFlags *cliflags.ClientFlags) CobraAdaptor {
34 34
 	rootCmd.SetOutput(stdout)
35 35
 	rootCmd.AddCommand(
36 36
 		container.NewCreateCommand(dockerCli),
37
+		container.NewDiffCommand(dockerCli),
37 38
 		container.NewExportCommand(dockerCli),
38 39
 		container.NewRunCommand(dockerCli),
39 40
 		container.NewStopCommand(dockerCli),
... ...
@@ -12,7 +12,6 @@ var DockerCommandUsage = []Command{
12 12
 	{"build", "Build an image from a Dockerfile"},
13 13
 	{"commit", "Create a new image from a container's changes"},
14 14
 	{"cp", "Copy files/folders between a container and the local filesystem"},
15
-	{"diff", "Inspect changes on a container's filesystem"},
16 15
 	{"events", "Get real time events from the server"},
17 16
 	{"exec", "Run a command in a running container"},
18 17
 	{"history", "Show the history of an image"},
... ...
@@ -83,5 +83,5 @@ func (s *DockerSuite) TestDiffEnsureDefaultDevs(c *check.C) {
83 83
 func (s *DockerSuite) TestDiffEmptyArgClientError(c *check.C) {
84 84
 	out, _, err := dockerCmdWithError("diff", "")
85 85
 	c.Assert(err, checker.NotNil)
86
-	c.Assert(strings.TrimSpace(out), checker.Equals, "Container name cannot be empty")
86
+	c.Assert(strings.TrimSpace(out), checker.Contains, "\"docker diff\" requires exactly 1 argument(s).")
87 87
 }