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 { digstr := descr.Digest.String() _, _, mandata, err := imager.ReadManifest(ctx, digstr) if err != nil { return err } 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 }