From 9900b79eb6cfd807c1c9d0d1db23ee8e7487d400 Mon Sep 17 00:00:00 2001 From: Antonio Murdaca Date: Tue, 28 Jun 2016 09:50:50 +0200 Subject: [PATCH] cmd/skopeo: refactor layers command Signed-off-by: Antonio Murdaca --- cmd/skopeo/layers.go | 41 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/cmd/skopeo/layers.go b/cmd/skopeo/layers.go index d3f11f9e..1427dd0e 100644 --- a/cmd/skopeo/layers.go +++ b/cmd/skopeo/layers.go @@ -1,6 +1,11 @@ package main import ( + "io/ioutil" + "strings" + + "github.com/containers/image/directory" + "github.com/containers/image/image" "github.com/urfave/cli" ) @@ -9,13 +14,45 @@ var layersCmd = cli.Command{ Name: "layers", Usage: "get images layers", Action: func(c *cli.Context) error { - img, err := parseImage(c) + rawSource, err := parseImageSource(c, c.Args()[0]) if err != nil { return err } - if err := img.LayersCommand(c.Args().Tail()...); err != nil { + src := image.FromSource(rawSource) + layers := c.Args().Tail() + if len(layers) == 0 { + ls, err := src.LayerDigests() + if err != nil { + return err + } + layers = ls + } + tmpDir, err := ioutil.TempDir(".", "layers-") + if err != nil { return err } + dest := directory.NewDirImageDestination(tmpDir) + manifest, err := src.Manifest() + if err != nil { + return err + } + if err := dest.PutManifest(manifest); err != nil { + return err + } + for _, l := range layers { + if !strings.HasPrefix(l, "sha256:") { + l = "sha256:" + l + } + r, _, err := rawSource.GetBlob(l) + if err != nil { + return err + } + if err := dest.PutBlob(l, r); err != nil { + r.Close() + return err + } + r.Close() + } return nil }, }