summaryrefslogtreecommitdiff
path: root/libpod/diff.go
diff options
context:
space:
mode:
Diffstat (limited to 'libpod/diff.go')
-rw-r--r--libpod/diff.go44
1 files changed, 25 insertions, 19 deletions
diff --git a/libpod/diff.go b/libpod/diff.go
index c5a53478b..5bd162e7b 100644
--- a/libpod/diff.go
+++ b/libpod/diff.go
@@ -2,6 +2,7 @@ package libpod
import (
"github.com/containers/common/libimage"
+ "github.com/containers/podman/v3/libpod/define"
"github.com/containers/podman/v3/libpod/layers"
"github.com/containers/storage/pkg/archive"
"github.com/pkg/errors"
@@ -21,14 +22,14 @@ var initInodes = map[string]bool{
}
// GetDiff returns the differences between the two images, layers, or containers
-func (r *Runtime) GetDiff(from, to string) ([]archive.Change, error) {
- toLayer, err := r.getLayerID(to)
+func (r *Runtime) GetDiff(from, to string, diffType define.DiffType) ([]archive.Change, error) {
+ toLayer, err := r.getLayerID(to, diffType)
if err != nil {
return nil, err
}
fromLayer := ""
if from != "" {
- fromLayer, err = r.getLayerID(from)
+ fromLayer, err = r.getLayerID(from, diffType)
if err != nil {
return nil, err
}
@@ -49,25 +50,30 @@ func (r *Runtime) GetDiff(from, to string) ([]archive.Change, error) {
// GetLayerID gets a full layer id given a full or partial id
// If the id matches a container or image, the id of the top layer is returned
// If the id matches a layer, the top layer id is returned
-func (r *Runtime) getLayerID(id string) (string, error) {
- var toLayer string
- toImage, _, err := r.libimageRuntime.LookupImage(id, &libimage.LookupImageOptions{IgnorePlatform: true})
- if err == nil {
- return toImage.TopLayer(), nil
+func (r *Runtime) getLayerID(id string, diffType define.DiffType) (string, error) {
+ var lastErr error
+ if diffType&define.DiffImage == define.DiffImage {
+ toImage, _, err := r.libimageRuntime.LookupImage(id, &libimage.LookupImageOptions{IgnorePlatform: true})
+ if err == nil {
+ return toImage.TopLayer(), nil
+ }
+ lastErr = err
}
- targetID, err := r.store.Lookup(id)
- if err != nil {
- targetID = id
+ if diffType&define.DiffContainer == define.DiffContainer {
+ toCtr, err := r.store.Container(id)
+ if err == nil {
+ return toCtr.LayerID, nil
+ }
+ lastErr = err
}
- toCtr, err := r.store.Container(targetID)
- if err != nil {
- toLayer, err = layers.FullID(r.store, targetID)
- if err != nil {
- return "", errors.Errorf("layer, image, or container %s does not exist", id)
+
+ if diffType == define.DiffAll {
+ toLayer, err := layers.FullID(r.store, id)
+ if err == nil {
+ return toLayer, nil
}
- } else {
- toLayer = toCtr.LayerID
+ lastErr = err
}
- return toLayer, nil
+ return "", errors.Wrapf(lastErr, "%s not found", id)
}