( ctx context.Context, resolvedRef string, rootDesc ocispecs.Descriptor, matcher platforms.MatchComparer, layerLimit *int, )
| 403 | } |
| 404 | |
| 405 | func (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 |
no test coverage detected