(ctx context.Context, resolver remotes.Resolver, named reference.Named, layers []v1.Descriptor, ociVersion api.OCIVersion)
| 95 | } |
| 96 | |
| 97 | func PushManifest(ctx context.Context, resolver remotes.Resolver, named reference.Named, layers []v1.Descriptor, ociVersion api.OCIVersion) (v1.Descriptor, error) { |
| 98 | // Check if we need an extra empty layer for the manifest config |
| 99 | if ociVersion == api.OCIVersion1_1 || ociVersion == "" { |
| 100 | err := push(ctx, resolver, named, v1.DescriptorEmptyJSON) |
| 101 | if err != nil { |
| 102 | return v1.Descriptor{}, err |
| 103 | } |
| 104 | } |
| 105 | // prepare to push the manifest by pushing the layers |
| 106 | layerDescriptors := make([]v1.Descriptor, len(layers)) |
| 107 | for i := range layers { |
| 108 | layerDescriptors[i] = layers[i] |
| 109 | if err := push(ctx, resolver, named, layers[i]); err != nil { |
| 110 | return v1.Descriptor{}, err |
| 111 | } |
| 112 | } |
| 113 | |
| 114 | if ociVersion != "" { |
| 115 | // if a version was explicitly specified, use it |
| 116 | return createAndPushManifest(ctx, resolver, named, layerDescriptors, ociVersion) |
| 117 | } |
| 118 | |
| 119 | // try to push in the OCI 1.1 format but fallback to OCI 1.0 on 4xx errors |
| 120 | // (other than auth) since it's most likely the result of the registry not |
| 121 | // having support |
| 122 | descriptor, err := createAndPushManifest(ctx, resolver, named, layerDescriptors, api.OCIVersion1_1) |
| 123 | var pushErr pusherrors.ErrUnexpectedStatus |
| 124 | if errors.As(err, &pushErr) && isNonAuthClientError(pushErr.StatusCode) { |
| 125 | // TODO(milas): show a warning here (won't work with logrus) |
| 126 | return createAndPushManifest(ctx, resolver, named, layerDescriptors, api.OCIVersion1_0) |
| 127 | } |
| 128 | return descriptor, err |
| 129 | } |
| 130 | |
| 131 | func push(ctx context.Context, resolver remotes.Resolver, ref reference.Named, descriptor v1.Descriptor) error { |
| 132 | fullRef, err := reference.WithDigest(reference.TagNameOnly(ref), descriptor.Digest) |
no test coverage detected