(ctx context.Context, w content.Writer, r io.Reader)
| 197 | } |
| 198 | |
| 199 | func compressAndWriteLayer(ctx context.Context, w content.Writer, r io.Reader) (digest.Digest, digest.Digest, int64, error) { |
| 200 | digester := digest.Canonical.Digester() |
| 201 | tee := io.TeeReader(r, digester.Hash()) |
| 202 | pr, pw := io.Pipe() |
| 203 | gz := gzip.NewWriter(pw) |
| 204 | |
| 205 | doneCh := make(chan error, 1) |
| 206 | go func() { |
| 207 | defer func() { |
| 208 | _ = gz.Close() |
| 209 | }() |
| 210 | |
| 211 | if _, err := io.Copy(gz, tee); err != nil { |
| 212 | doneCh <- err |
| 213 | _ = pw.CloseWithError(err) |
| 214 | return |
| 215 | } |
| 216 | if err := gz.Close(); err != nil { |
| 217 | doneCh <- err |
| 218 | _ = pw.CloseWithError(err) |
| 219 | return |
| 220 | } |
| 221 | doneCh <- pw.Close() |
| 222 | }() |
| 223 | |
| 224 | n, err := io.Copy(w, pr) |
| 225 | if err != nil { |
| 226 | return "", "", 0, err |
| 227 | } |
| 228 | if err := <-doneCh; err != nil { |
| 229 | return "", "", 0, err |
| 230 | } |
| 231 | |
| 232 | diffID := digester.Digest() |
| 233 | labels := map[string]string{ |
| 234 | "containerd.io/uncompressed": diffID.String(), |
| 235 | } |
| 236 | if err := w.Commit(ctx, n, "", content.WithLabels(labels)); err != nil && !errdefs.IsAlreadyExists(err) { |
| 237 | return "", "", 0, err |
| 238 | } |
| 239 | |
| 240 | return w.Digest(), diffID, n, nil |
| 241 | } |
| 242 | |
| 243 | func buildImageConfig(diffID digest.Digest, options types.ImageImportOptions) ([]byte, digest.Digest, error) { |
| 244 | ociplat := platforms.DefaultSpec() |
no test coverage detected
searching dependent graphs…