diff --git a/pkg/repocli/pushimage.go b/pkg/repocli/pushimage.go new file mode 100644 index 0000000..d19c338 --- /dev/null +++ b/pkg/repocli/pushimage.go @@ -0,0 +1,56 @@ +package repocli + +import ( + "context" + "encoding/json" + + ocispec "github.com/opencontainers/image-spec/specs-go/v1" +) + +func (down *Loader) Push(ctx context.Context, rawref, dir, osname, arch string) error { + var err error + + ref, err := NewReferer(rawref) + if err != nil { + return err + } + imager, err := NewImagerFromPlace(dir) + if err != nil { + return err + } + index := imager.Index() + for _, descr := range index.Manifests { + _, _, mandata, err := imager.ReadManifest(ctx, descr.Digest.Encoded()) + man := &ocispec.Manifest{} + err = json.Unmarshal(mandata, man) + if err != nil { + return err + } + layers := make([]ocispec.Descriptor, 0) + layers = append(layers, man.Layers...) + layers = append(layers, man.Config) + for _, layer := range layers { + id, _, err := down.cli.GetUpload(ctx, ref.RawRepo()) + if err != nil { + return err + } + digstr := layer.Digest.String() + size, reader, err := imager.LayerReader(ctx, digstr) + if err != nil { + return err + } + defer reader.Close() + _, err = down.cli.PatchUpload(ctx, ref.RawRepo(), reader, id, size) + if err != nil { + return err + } + _, err = down.cli.PutUpload(ctx, ref.RawRepo(), nil, id, digstr, size) + if err != nil { + return err + } + } + } + + return err + +}