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  }