func()

in registry/storage/registry.go [280:365]


func (repo *repository) Manifests(ctx context.Context, options ...distribution.ManifestServiceOption) (distribution.ManifestService, error) {
	manifestDirectoryPathSpec := manifestRevisionsPathSpec{name: repo.name.Name()}

	var statter distribution.BlobDescriptorService = &linkedBlobStatter{
		blobStore:  repo.blobStore,
		repository: repo,
		linkPath:   manifestRevisionLinkPath,
	}

	if repo.registry.blobDescriptorServiceFactory != nil {
		statter = repo.registry.blobDescriptorServiceFactory.BlobAccessController(statter)
	}

	blobStore := &linkedBlobStore{
		ctx:                  ctx,
		blobStore:            repo.blobStore,
		repository:           repo,
		deleteEnabled:        repo.registry.deleteEnabled,
		blobAccessController: statter,

		// LinkPath limits this blob store to only manifests. This instance cannot
		// be used for blob checks.
		linkPath:              manifestRevisionLinkPath,
		linkDirectoryPathSpec: manifestDirectoryPathSpec,
	}

	var v1Handler ManifestHandler
	if repo.schema1Enabled {
		v1Handler = &signedManifestHandler{
			ctx:               ctx,
			schema1SigningKey: repo.schema1SigningKey,
			repository:        repo,
			blobStore:         blobStore,
		}
	} else {
		v1Handler = &v1UnsupportedHandler{
			pullsDisabled: repo.schema1PullsDisabled,
			innerHandler: &signedManifestHandler{
				ctx:               ctx,
				schema1SigningKey: repo.schema1SigningKey,
				repository:        repo,
				blobStore:         blobStore,
			},
		}
	}

	ms := &manifestStore{
		ctx:            ctx,
		repository:     repo,
		blobStore:      blobStore,
		schema1Handler: v1Handler,
		schema2Handler: &schema2ManifestHandler{
			ctx:                      ctx,
			repository:               repo,
			blobStore:                blobStore,
			manifestURLs:             repo.registry.manifestURLs,
			manifestRefLimit:         repo.registry.manifestsRefLimit,
			manifestPayloadSizeLimit: repo.registry.manifestsPayloadSizeLimit,
		},
		manifestListHandler: &manifestListHandler{
			ctx:                      ctx,
			repository:               repo,
			blobStore:                blobStore,
			manifestRefLimit:         repo.registry.manifestsRefLimit,
			manifestPayloadSizeLimit: repo.registry.manifestsPayloadSizeLimit,
		},
		ocischemaHandler: &ocischemaManifestHandler{
			ctx:                      ctx,
			repository:               repo,
			blobStore:                blobStore,
			manifestURLs:             repo.registry.manifestURLs,
			manifestRefLimit:         repo.registry.manifestsRefLimit,
			manifestPayloadSizeLimit: repo.registry.manifestsPayloadSizeLimit,
		},
	}

	// Apply options
	for _, option := range options {
		err := option.Apply(ms)
		if err != nil {
			return nil, err
		}
	}

	return ms, nil
}