| 128 | } |
| 129 | |
| 130 | func Push(ctx context.Context, resolver remotes.Resolver, ref reference.Named, descriptor spec.Descriptor) error { |
| 131 | pusher, err := resolver.Pusher(ctx, ref.String()) |
| 132 | if err != nil { |
| 133 | return err |
| 134 | } |
| 135 | ctx = remotes.WithMediaTypeKeyPrefix(ctx, ComposeYAMLMediaType, "artifact-") |
| 136 | ctx = remotes.WithMediaTypeKeyPrefix(ctx, ComposeEnvFileMediaType, "artifact-") |
| 137 | ctx = remotes.WithMediaTypeKeyPrefix(ctx, ComposeEmptyConfigMediaType, "config-") |
| 138 | ctx = remotes.WithMediaTypeKeyPrefix(ctx, spec.MediaTypeEmptyJSON, "config-") |
| 139 | |
| 140 | push, err := pusher.Push(ctx, descriptor) |
| 141 | if errdefs.IsAlreadyExists(err) { |
| 142 | return nil |
| 143 | } |
| 144 | if err != nil { |
| 145 | return err |
| 146 | } |
| 147 | |
| 148 | _, err = push.Write(descriptor.Data) |
| 149 | if err != nil { |
| 150 | // Close the writer on error since Commit won't be called |
| 151 | _ = push.Close() |
| 152 | return err |
| 153 | } |
| 154 | // Commit will close the writer |
| 155 | return push.Commit(ctx, int64(len(descriptor.Data)), descriptor.Digest) |
| 156 | } |