github.com/Racer159/jackal@v0.32.7-0.20240401174413-0bd2339e4f2e/src/pkg/zoci/copier.go (about) 1 // SPDX-License-Identifier: Apache-2.0 2 // SPDX-FileCopyrightText: 2021-Present The Jackal Authors 3 4 // Package zoci contains functions for interacting with Jackal packages stored in OCI registries. 5 package zoci 6 7 import ( 8 "bytes" 9 "context" 10 "fmt" 11 12 "github.com/Racer159/jackal/src/pkg/message" 13 "github.com/defenseunicorns/pkg/oci" 14 ocispec "github.com/opencontainers/image-spec/specs-go/v1" 15 "oras.land/oras-go/v2/content" 16 ) 17 18 // CopyPackage copies a jackal package from one OCI registry to another 19 func CopyPackage(ctx context.Context, src *Remote, dst *Remote, concurrency int) error { 20 21 srcManifest, err := src.FetchRoot(ctx) 22 if err != nil { 23 return err 24 } 25 layers := append(srcManifest.Layers, srcManifest.Config) 26 size := oci.SumDescsSize(layers) 27 28 title := fmt.Sprintf("[0/%d] layers copied", len(layers)) 29 progressBar := message.NewProgressBar(size, title) 30 defer progressBar.Stop() 31 32 if err := oci.Copy(ctx, src.OrasRemote, dst.OrasRemote, nil, concurrency, progressBar); err != nil { 33 return err 34 } 35 progressBar.Successf("Copied %s", src.Repo().Reference) 36 37 srcRoot, err := src.ResolveRoot(ctx) 38 if err != nil { 39 return err 40 } 41 42 b, err := srcManifest.MarshalJSON() 43 if err != nil { 44 return err 45 } 46 expected := content.NewDescriptorFromBytes(ocispec.MediaTypeImageManifest, b) 47 48 if err := dst.Repo().Manifests().PushReference(ctx, expected, bytes.NewReader(b), srcRoot.Digest.String()); err != nil { 49 return err 50 } 51 52 tag := src.Repo().Reference.Reference 53 if err := dst.UpdateIndex(ctx, tag, expected); err != nil { 54 return err 55 } 56 57 src.Log().Info(fmt.Sprintf("Published %s to %s", src.Repo().Reference, dst.Repo().Reference)) 58 return nil 59 }