Skip to content

Commit

Permalink
Allow crane edit to generate non-image artifacts (#1545)
Browse files Browse the repository at this point in the history
  • Loading branch information
jonjohnsonjr committed Jan 28, 2023
1 parent 759b19f commit 9306eba
Showing 1 changed file with 26 additions and 7 deletions.
33 changes: 26 additions & 7 deletions internal/cmd/edit.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package cmd
import (
"archive/tar"
"bytes"
"encoding/json"
"errors"
"fmt"
"io"
Expand All @@ -30,6 +31,7 @@ import (
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/mutate"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/google/go-containerregistry/pkg/v1/static"
"github.com/google/go-containerregistry/pkg/v1/tarball"
"github.com/google/go-containerregistry/pkg/v1/types"
"github.com/spf13/cobra"
Expand Down Expand Up @@ -158,6 +160,15 @@ func editConfig(in io.Reader, out io.Writer, src, dst string, options ...crane.O
return nil, err
}

m, err := img.Manifest()
if err != nil {
return nil, err
}
mt, err := img.MediaType()
if err != nil {
return nil, err
}

var edited []byte
if interactive(in, out) {
rcf, err := img.RawConfigFile()
Expand All @@ -176,21 +187,25 @@ func editConfig(in io.Reader, out io.Writer, src, dst string, options ...crane.O
edited = b
}

cf, err := v1.ParseConfigFile(bytes.NewReader(edited))
l := static.NewLayer(edited, m.Config.MediaType)
layerDigest, err := l.Digest()
if err != nil {
return nil, err
}

img, err = mutate.ConfigFile(img, cf)
m.Config.Digest = layerDigest
m.Config.Size = int64(len(edited))
b, err := json.Marshal(m)
if err != nil {
return nil, err
}

digest, err := img.Digest()
if err != nil {
return nil, err
rm := &rawManifest{
body: b,
mediaType: mt,
}

digest, _, _ := v1.SHA256(bytes.NewReader(b))

if dst == "" {
dst = src
ref, err := name.ParseReference(src, o.Name...)
Expand All @@ -207,7 +222,11 @@ func editConfig(in io.Reader, out io.Writer, src, dst string, options ...crane.O
return nil, err
}

if err := crane.Push(img, dst, options...); err != nil {
if err := remote.WriteLayer(dstRef.Context(), l, o.Remote...); err != nil {
return nil, err
}

if err := remote.Put(dstRef, rm, o.Remote...); err != nil {
return nil, err
}

Expand Down

0 comments on commit 9306eba

Please sign in to comment.