MCPcopy Create free account
hub / github.com/dagger/dagger / tryLocalCanonicalClosure

Method tryLocalCanonicalClosure

engine/server/resolver/resolver.go:405–519  ·  view source on GitHub ↗
(
	ctx context.Context,
	resolvedRef string,
	rootDesc ocispecs.Descriptor,
	matcher platforms.MatchComparer,
	layerLimit *int,
)

Source from the content-addressed store, hash-verified

403}
404
405func (r *Resolver) tryLocalCanonicalClosure(
406 ctx context.Context,
407 resolvedRef string,
408 rootDesc ocispecs.Descriptor,
409 matcher platforms.MatchComparer,
410 layerLimit *int,
411) (_ *localizedImageClosure, _ bool, _ func(context.Context) error, rerr error) {
412 rootDesc, found, err := r.localCanonicalRootDescriptor(ctx, rootDesc.Digest)
413 if err != nil || !found {
414 return nil, found, nil, err
415 }
416
417 manifestDesc, manifest, found, err := tryResolveLocalManifestDescriptor(ctx, r.contentStore, rootDesc, matcher, true)
418 if err != nil || !found {
419 return nil, false, nil, err
420 }
421
422 configDesc := hydratePulledDescriptor(manifest.Config)
423 if _, err := r.contentStore.Info(ctx, configDesc.Digest); err != nil {
424 if cerrdefs.IsNotFound(err) {
425 return nil, false, nil, nil
426 }
427 return nil, false, nil, err
428 }
429
430 diffIDs, err := images.RootFS(ctx, r.contentStore, configDesc)
431 if err != nil {
432 if cerrdefs.IsNotFound(err) {
433 return nil, false, nil, nil
434 }
435 return nil, false, nil, err
436 }
437 if len(manifest.Layers) != len(diffIDs) {
438 return nil, false, nil, fmt.Errorf("mismatched image rootfs and manifest layers: %d diffIDs vs %d layers", len(diffIDs), len(manifest.Layers))
439 }
440
441 layers := make([]ocispecs.Descriptor, len(manifest.Layers))
442 for i, layer := range manifest.Layers {
443 if _, err := r.contentStore.Info(ctx, layer.Digest); err != nil {
444 if cerrdefs.IsNotFound(err) {
445 return nil, false, nil, nil
446 }
447 return nil, false, nil, err
448 }
449 layer = hydratePulledDescriptor(layer)
450 if layer.Annotations == nil {
451 layer.Annotations = map[string]string{}
452 }
453 layer.Annotations["containerd.io/uncompressed"] = diffIDs[i].String()
454 layers[i] = layer
455 }
456 if layerLimit != nil {
457 if *layerLimit > len(layers) {
458 return nil, false, nil, fmt.Errorf("layer limit %d exceeds image layer count %d", *layerLimit, len(layers))
459 }
460 layers = layers[:*layerLimit]
461 }
462

Callers 1

PullMethod · 0.95

Calls 10

hydratePulledDescriptorFunction · 0.85
childrenHandlerFunction · 0.85
ParseMethod · 0.80
InfoMethod · 0.65
StringMethod · 0.65
CompareMethod · 0.45

Tested by

no test coverage detected