(ctx context.Context, size int64, expected digest.Digest, opts ...content.Opt)
| 498 | } |
| 499 | |
| 500 | func (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 { |
nothing calls this directly
no test coverage detected