56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package main
 | 
						|
 | 
						|
import (
 | 
						|
	"io"
 | 
						|
	"os"
 | 
						|
 | 
						|
	"github.com/containerd/containerd/log"
 | 
						|
	"github.com/urfave/cli"
 | 
						|
)
 | 
						|
 | 
						|
// TODO(stevvooe): Create "multi-fetch" mode that just takes a remote
 | 
						|
// then receives object/hint lines on stdin, returning content as
 | 
						|
// needed.
 | 
						|
 | 
						|
var fetchObjectCommand = cli.Command{
 | 
						|
	Name:        "fetch-object",
 | 
						|
	Usage:       "retrieve objects from a remote",
 | 
						|
	ArgsUsage:   "[flags] <remote> <object> [<hint>, ...]",
 | 
						|
	Description: `Fetch objects by identifier from a remote.`,
 | 
						|
	Flags:       registryFlags,
 | 
						|
	Action: func(context *cli.Context) error {
 | 
						|
		var (
 | 
						|
			ref = context.Args().First()
 | 
						|
		)
 | 
						|
		ctx, cancel := appContext(context)
 | 
						|
		defer cancel()
 | 
						|
 | 
						|
		resolver, err := getResolver(ctx, context)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
 | 
						|
		ctx = log.WithLogger(ctx, log.G(ctx).WithField("ref", ref))
 | 
						|
 | 
						|
		log.G(ctx).Infof("resolving")
 | 
						|
		name, desc, err := resolver.Resolve(ctx, ref)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
		fetcher, err := resolver.Fetcher(ctx, name)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
 | 
						|
		log.G(ctx).Infof("fetching")
 | 
						|
		rc, err := fetcher.Fetch(ctx, desc)
 | 
						|
		if err != nil {
 | 
						|
			return err
 | 
						|
		}
 | 
						|
		defer rc.Close()
 | 
						|
 | 
						|
		_, err = io.Copy(os.Stdout, rc)
 | 
						|
		return err
 | 
						|
	},
 | 
						|
}
 |