MCPcopy Index your code
hub / github.com/OpenListTeam/OpenList / putBlob

Method putBlob

drivers/github/driver.go:687–745  ·  view source on GitHub ↗
(ctx context.Context, s model.FileStreamer, up driver.UpdateProgress)

Source from the content-addressed store, hash-verified

685}
686
687func (d *Github) putBlob(ctx context.Context, s model.FileStreamer, up driver.UpdateProgress) (string, error) {
688 beforeContent := "{\"encoding\":\"base64\",\"content\":\""
689 afterContent := "\"}"
690 length := int64(len(beforeContent)) + calculateBase64Length(s.GetSize()) + int64(len(afterContent))
691 beforeContentReader := strings.NewReader(beforeContent)
692 contentReader, contentWriter := io.Pipe()
693 go func() {
694 encoder := base64.NewEncoder(base64.StdEncoding, contentWriter)
695 if _, err := utils.CopyWithBuffer(encoder, s); err != nil {
696 _ = contentWriter.CloseWithError(err)
697 return
698 }
699 _ = encoder.Close()
700 _ = contentWriter.Close()
701 }()
702 afterContentReader := strings.NewReader(afterContent)
703 req, err := http.NewRequestWithContext(ctx, http.MethodPost,
704 fmt.Sprintf("https://api.github.com/repos/%s/%s/git/blobs", d.Owner, d.Repo),
705 driver.NewLimitedUploadStream(ctx, &driver.ReaderUpdatingProgress{
706 Reader: &driver.SimpleReaderWithSize{
707 Reader: io.MultiReader(beforeContentReader, contentReader, afterContentReader),
708 Size: length,
709 },
710 UpdateProgress: up,
711 }))
712 if err != nil {
713 return "", err
714 }
715 req.Header.Set("Accept", "application/vnd.github+json")
716 req.Header.Set("X-GitHub-Api-Version", "2022-11-28")
717 token := strings.TrimSpace(d.Token)
718 if token != "" {
719 req.Header.Set("Authorization", "Bearer "+token)
720 }
721 req.ContentLength = length
722
723 res, err := base.HttpClient.Do(req)
724 if err != nil {
725 return "", err
726 }
727 defer res.Body.Close()
728 resBody, err := io.ReadAll(res.Body)
729 if err != nil {
730 return "", err
731 }
732 if res.StatusCode != 201 {
733 var errMsg ErrResp
734 if err = utils.Json.Unmarshal(resBody, &errMsg); err != nil {
735 return "", errors.New(res.Status)
736 } else {
737 return "", fmt.Errorf("%s: %s", res.Status, errMsg.Message)
738 }
739 }
740 var resp PutBlobResp
741 if err = utils.Json.Unmarshal(resBody, &resp); err != nil {
742 return "", err
743 }
744 return resp.Sha, nil

Callers 1

PutMethod · 0.95

Calls 8

CopyWithBufferFunction · 0.92
NewLimitedUploadStreamFunction · 0.92
calculateBase64LengthFunction · 0.85
GetSizeMethod · 0.65
CloseMethod · 0.65
DoMethod · 0.65
SetMethod · 0.45
UnmarshalMethod · 0.45

Tested by

no test coverage detected