forked from containers/podman
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
podman diff accept two images or containers
First, make podman diff accept optionally a second argument. This allows the user to specify a second image/container to compare the first with. If it is not set the parent layer will be used as before. Second, podman container diff should only use containers and podman image diff should only use images. Previously, podman container diff would use the image when both an image and container with this name exists. To make this work two new parameters have been added to the api. If they are not used the previous behaviour is used. The same applies to the bindings. Fixes containers#10649 Signed-off-by: Paul Holzinger <[email protected]>
- Loading branch information
Showing
28 changed files
with
512 additions
and
172 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
package diff | ||
|
||
import ( | ||
"encoding/json" | ||
"fmt" | ||
"os" | ||
|
||
"github.com/containers/common/pkg/report" | ||
"github.com/containers/podman/v3/cmd/podman/registry" | ||
"github.com/containers/podman/v3/pkg/domain/entities" | ||
"github.com/docker/docker/pkg/archive" | ||
"github.com/pkg/errors" | ||
"github.com/spf13/cobra" | ||
) | ||
|
||
func Diff(cmd *cobra.Command, args []string, options entities.DiffOptions) error { | ||
results, err := registry.ContainerEngine().Diff(registry.GetContext(), args, options) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
switch { | ||
case report.IsJSON(options.Format): | ||
return changesToJSON(results) | ||
case options.Format == "": | ||
return changesToTable(results) | ||
default: | ||
return errors.New("only supported value for '--format' is 'json'") | ||
} | ||
} | ||
|
||
type ChangesReportJSON struct { | ||
Changed []string `json:"changed,omitempty"` | ||
Added []string `json:"added,omitempty"` | ||
Deleted []string `json:"deleted,omitempty"` | ||
} | ||
|
||
func changesToJSON(diffs *entities.DiffReport) error { | ||
body := ChangesReportJSON{} | ||
for _, row := range diffs.Changes { | ||
switch row.Kind { | ||
case archive.ChangeAdd: | ||
body.Added = append(body.Added, row.Path) | ||
case archive.ChangeDelete: | ||
body.Deleted = append(body.Deleted, row.Path) | ||
case archive.ChangeModify: | ||
body.Changed = append(body.Changed, row.Path) | ||
default: | ||
return errors.Errorf("output kind %q not recognized", row.Kind) | ||
} | ||
} | ||
|
||
// Pull in configured json library | ||
enc := json.NewEncoder(os.Stdout) | ||
enc.SetIndent("", " ") | ||
return enc.Encode(body) | ||
} | ||
|
||
func changesToTable(diffs *entities.DiffReport) error { | ||
for _, row := range diffs.Changes { | ||
fmt.Fprintln(os.Stdout, row.String()) | ||
} | ||
return nil | ||
} | ||
|
||
// IDOrLatestArgs used to validate a nameOrId was provided or the "--latest" flag | ||
func ValidateContainerDiffArgs(cmd *cobra.Command, args []string) error { | ||
given, _ := cmd.Flags().GetBool("latest") | ||
if len(args) > 0 && !given { | ||
return cobra.RangeArgs(1, 2)(cmd, args) | ||
} | ||
if len(args) > 0 && given { | ||
return errors.New("--latest and containers cannot be used together") | ||
} | ||
if len(args) == 0 && !given { | ||
return errors.Errorf("%q requires a name, id, or the \"--latest\" flag", cmd.CommandPath()) | ||
} | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
% podman-container-diff(1) | ||
|
||
## NAME | ||
podman\-container\-diff - Inspect changes on a container's filesystem | ||
|
||
## SYNOPSIS | ||
**podman container diff** [*options*] *container* [*container*] | ||
|
||
## DESCRIPTION | ||
Displays changes on a container's filesystem. The container will be compared to its parent layer or the second argument when given. | ||
|
||
The output is prefixed with the following symbols: | ||
|
||
| Symbol | Description | | ||
|--------|-------------| | ||
| A | A file or directory was added. | | ||
| D | A file or directory was deleted. | | ||
| C | A file or directory was changed. | | ||
|
||
## OPTIONS | ||
|
||
#### **--format** | ||
|
||
Alter the output into a different format. The only valid format for **podman container diff** is `json`. | ||
|
||
#### **--latest**, **-l** | ||
|
||
Instead of providing the container name or ID, use the last created container. If you use methods other than Podman | ||
to run containers such as CRI-O, the last started container could be from either of those methods. (This option is not available with the remote Podman client) | ||
|
||
## EXAMPLE | ||
|
||
``` | ||
# podman container diff container1 | ||
C /usr | ||
C /usr/local | ||
C /usr/local/bin | ||
A /usr/local/bin/docker-entrypoint.sh | ||
``` | ||
|
||
``` | ||
$ podman container diff --format json container1 container2 | ||
{ | ||
"added": [ | ||
"/test" | ||
] | ||
} | ||
``` | ||
|
||
## SEE ALSO | ||
**[podman(1)](podman.1.md)**, **[podman-container(1)](podman-container.1.md)** | ||
|
||
## HISTORY | ||
July 2021, Originally compiled by Paul Holzinger <[email protected]> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.