diff --git a/registry/manifest.go b/registry/manifest.go index 5f04d23b..59370a58 100644 --- a/registry/manifest.go +++ b/registry/manifest.go @@ -102,6 +102,8 @@ func (registry *Registry) DeleteManifest(repository string, digest digest.Digest return nil } +// PutManifest uploads manifest to the given repository/reference. +// Manifest is typically either of type schema2.DeserializedManifest or schema1.SignedManifest func (registry *Registry) PutManifest(repository, reference string, manifest distribution.Manifest) error { url := registry.url("/v2/%s/manifests/%s", repository, reference) registry.Logf("registry.manifest.put url=%s repository=%s reference=%s", url, repository, reference) @@ -124,3 +126,19 @@ func (registry *Registry) PutManifest(repository, reference string, manifest dis } return err } + +// PutManifestV2 uploads the given schama2.Manifest to the given repository/reference and returns with its digest. +// If you want to upload a schema2.DeserializedManifest, please use the generic PutManifest(). +func (registry *Registry) PutManifestV2(repository, reference string, manifest *schema2.Manifest) (digest.Digest, error) { + deserializedManifest, err := schema2.FromStruct(*manifest) + if err != nil { + return "", err + } + _, canonical, err := deserializedManifest.Payload() + if err != nil { + return "", err + } + digest := digest.FromBytes(canonical) + err = registry.PutManifest(repository, reference, deserializedManifest) + return digest, err +}