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>
| 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 |
} |