1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
func (c *Client) fetch(ctx context.Context, rCtx *RemoteContext, ref string, limit int) (images.Image, error) { store := c.ContentStore()
name, desc, err := rCtx.Resolver.Resolve(ctx, ref)
fetcher, err := rCtx.Resolver.Fetcher(ctx, name)
var ( handler images.Handler isConvertible bool converterFunc func(context.Context, ocispec.Descriptor) (ocispec.Descriptor, error) limiter *semaphore.Weighted )
if desc.MediaType == images.MediaTypeDockerSchema1Manifest && rCtx.ConvertSchema1 { schema1Converter := schema1.NewConverter(store, fetcher) handler = images.Handlers(append(rCtx.BaseHandlers, schema1Converter)...) isConvertible = true converterFunc = func(ctx context.Context, _ ocispec.Descriptor) (ocispec.Descriptor, error) { return schema1Converter.Convert(ctx) } } else { childrenHandler := images.ChildrenHandler(store) childrenHandler = images.SetChildrenMappedLabels(store, childrenHandler, rCtx.ChildLabelMap) if rCtx.AllMetadata { childrenHandler = remotes.FilterManifestByPlatformHandler(childrenHandler, rCtx.PlatformMatcher) } else { childrenHandler = images.FilterPlatforms(childrenHandler, rCtx.PlatformMatcher) } if limit > 0 { childrenHandler = images.LimitManifests(childrenHandler, rCtx.PlatformMatcher, limit) }
convertibleHandler := images.HandlerFunc( func(_ context.Context, desc ocispec.Descriptor) ([]ocispec.Descriptor, error) { if desc.MediaType == docker.LegacyConfigMediaType { isConvertible = true }
return []ocispec.Descriptor{}, nil }, )
appendDistSrcLabelHandler, err := docker.AppendDistributionSourceLabel(store, ref)
handlers := append(rCtx.BaseHandlers, remotes.FetchHandler(store, fetcher), convertibleHandler, childrenHandler, appendDistSrcLabelHandler, )
handler = images.Handlers(handlers...)
converterFunc = func(ctx context.Context, desc ocispec.Descriptor) (ocispec.Descriptor, error) { return docker.ConvertManifest(ctx, store, desc) } }
if rCtx.HandlerWrapper != nil { handler = rCtx.HandlerWrapper(handler) }
if rCtx.MaxConcurrentDownloads > 0 { limiter = semaphore.NewWeighted(int64(rCtx.MaxConcurrentDownloads)) }
if err := images.Dispatch(ctx, handler, limiter, desc); err != nil { return images.Image{}, err }
if isConvertible { if desc, err = converterFunc(ctx, desc); err != nil { return images.Image{}, err } }
return images.Image{ Name: name, Target: desc, Labels: rCtx.Labels, }, nil }
|