diff --git a/cmd/oras/internal/display/metadata/interface.go b/cmd/oras/internal/display/metadata/interface.go index fcd5bd6a7..66adedcd2 100644 --- a/cmd/oras/internal/display/metadata/interface.go +++ b/cmd/oras/internal/display/metadata/interface.go @@ -104,4 +104,7 @@ type ManifestIndexUpdateHandler ManifestIndexCreateHandler // CopyHandler handles metadata output for cp events. type CopyHandler interface { TaggedHandler + Renderer + + OnCopied(target *option.BinaryTarget, desc ocispec.Descriptor) error } diff --git a/cmd/oras/internal/display/metadata/text/copy.go b/cmd/oras/internal/display/metadata/text/copy.go index a21d5aac4..13a027b33 100644 --- a/cmd/oras/internal/display/metadata/text/copy.go +++ b/cmd/oras/internal/display/metadata/text/copy.go @@ -18,12 +18,14 @@ package text import ( ocispec "github.com/opencontainers/image-spec/specs-go/v1" "oras.land/oras/cmd/oras/internal/display/metadata" + "oras.land/oras/cmd/oras/internal/option" "oras.land/oras/cmd/oras/internal/output" ) // CopyHandler handles text metadata output for cp events. type CopyHandler struct { printer *output.Printer + desc ocispec.Descriptor } // NewCopyHandler returns a new handler for cp events. @@ -37,3 +39,14 @@ func NewCopyHandler(printer *output.Printer) metadata.CopyHandler { func (h *CopyHandler) OnTagged(_ ocispec.Descriptor, tag string) error { return h.printer.Println("Tagged", tag) } + +// Render implements metadata.Renderer. +func (h *CopyHandler) Render() error { + return h.printer.Println("Digest:", h.desc.Digest) +} + +// OnCopied implements metadata.CopyHandler. +func (h *CopyHandler) OnCopied(target *option.BinaryTarget, desc ocispec.Descriptor) error { + h.desc = desc + return h.printer.Println("Copied", target.From.AnnotatedReference(), "=>", target.To.AnnotatedReference()) +} diff --git a/cmd/oras/root/cp.go b/cmd/oras/root/cp.go index c6693edcb..cf39c2083 100644 --- a/cmd/oras/root/cp.go +++ b/cmd/oras/root/cp.go @@ -141,7 +141,10 @@ func runCopy(cmd *cobra.Command, opts *copyOptions) error { // correct source digest opts.From.RawReference = fmt.Sprintf("%s@%s", opts.From.Path, desc.Digest.String()) } - _ = opts.Printer.Println("Copied", opts.From.AnnotatedReference(), "=>", opts.To.AnnotatedReference()) + + if err := metadataHandler.OnCopied(&opts.BinaryTarget, desc); err != nil { + return err + } if len(opts.extraRefs) != 0 { tagNOpts := oras.DefaultTagNOptions @@ -152,9 +155,7 @@ func runCopy(cmd *cobra.Command, opts *copyOptions) error { } } - _ = opts.Printer.Println("Digest:", desc.Digest) - - return nil + return metadataHandler.Render() } func doCopy(ctx context.Context, copyHandler status.CopyHandler, src oras.ReadOnlyGraphTarget, dst oras.GraphTarget, opts *copyOptions) (desc ocispec.Descriptor, err error) {