MCPcopy
hub / github.com/containerd/containerd / Commit

Method Commit

core/remotes/docker/pusher.go:500–569  ·  view source on GitHub ↗
(ctx context.Context, size int64, expected digest.Digest, opts ...content.Opt)

Source from the content-addressed store, hash-verified

498}
499
500func (pw *pushWriter) Commit(ctx context.Context, size int64, expected digest.Digest, opts ...content.Opt) error {
501 // Check whether read has already thrown an error
502 if pw.pipe != nil {
503 if _, err := pw.pipe.Write([]byte{}); err != nil && !errors.Is(err, io.ErrClosedPipe) {
504 return fmt.Errorf("pipe error before commit: %w", err)
505 }
506 if err := pw.pipe.Close(); err != nil {
507 return err
508 }
509 }
510
511 // TODO: timeout waiting for response
512 var resp *http.Response
513 select {
514 case <-pw.done:
515 return io.ErrClosedPipe
516 case err := <-pw.errC:
517 pw.Close()
518 return err
519 case resp = <-pw.respC:
520 defer resp.Body.Close()
521 case p := <-pw.pipeC:
522 // check whether the pipe has changed in the commit, because sometimes Write
523 // can complete successfully, but the pipe may have changed. In that case, the
524 // content needs to be reset.
525 return pw.replacePipe(p)
526 }
527
528 // 201 is specified return status, some registries return
529 // 200, 202 or 204.
530 switch resp.StatusCode {
531 case http.StatusOK, http.StatusCreated, http.StatusNoContent, http.StatusAccepted:
532 default:
533 return unexpectedResponseErr(resp)
534 }
535
536 status, err := pw.tracker.GetStatus(pw.ref)
537 if err != nil {
538 return fmt.Errorf("failed to get status: %w", err)
539 }
540
541 if size > 0 && size != status.Offset {
542 return fmt.Errorf("unexpected size %d, expected %d", status.Offset, size)
543 }
544
545 if expected == "" {
546 expected = status.Expected
547 } else if expected != status.Expected {
548 return fmt.Errorf("unexpected digest received: got %q, expected %q", status.Expected, expected)
549 }
550
551 if dgstHdr := resp.Header.Get("Docker-Content-Digest"); dgstHdr != "" {
552 actual, err := digest.Parse(dgstHdr)
553 if err != nil {
554 return fmt.Errorf("invalid content digest in response: %w", err)
555 }
556
557 if actual != expected {

Callers

nothing calls this directly

Calls 9

CloseMethod · 0.95
replacePipeMethod · 0.95
unexpectedResponseErrFunction · 0.85
WriteMethod · 0.65
CloseMethod · 0.65
GetStatusMethod · 0.65
GetMethod · 0.65
InfoMethod · 0.65
SetStatusMethod · 0.65

Tested by

no test coverage detected