MCPcopy
hub / github.com/mislav/hub / UploadReleaseAssets

Method UploadReleaseAssets

github/client.go:391–449  ·  view source on GitHub ↗
(release *Release, assets []LocalAsset)

Source from the content-addressed store, hash-verified

389}
390
391func (client *Client) UploadReleaseAssets(release *Release, assets []LocalAsset) (doneAssets []*ReleaseAsset, err error) {
392 api, err := client.simpleApi()
393 if err != nil {
394 return
395 }
396
397 idx := strings.Index(release.UploadUrl, "{")
398 uploadURL := release.UploadUrl[0:idx]
399
400 for _, asset := range assets {
401 for _, existingAsset := range release.Assets {
402 if existingAsset.Name == asset.Name {
403 if err = client.DeleteReleaseAsset(&existingAsset); err != nil {
404 return
405 }
406 break
407 }
408 }
409
410 params := map[string]interface{}{"name": filepath.Base(asset.Name)}
411 if asset.Label != "" {
412 params["label"] = asset.Label
413 }
414 uploadPath := addQuery(uploadURL, params)
415
416 var res *simpleResponse
417 attempts := 0
418 maxAttempts := 3
419 body := asset.Contents
420 for {
421 res, err = api.PostFile(uploadPath, body, asset.Size)
422 if err == nil && res.StatusCode >= 500 && res.StatusCode < 600 && attempts < maxAttempts {
423 attempts++
424 time.Sleep(time.Second * time.Duration(attempts))
425 var f *os.File
426 f, err = os.Open(asset.Name)
427 if err != nil {
428 return
429 }
430 defer f.Close()
431 body = f
432 continue
433 }
434 if err = checkStatus(201, "uploading release asset", res, err); err != nil {
435 return
436 }
437 break
438 }
439
440 newAsset := ReleaseAsset{}
441 err = res.Unmarshal(&newAsset)
442 if err != nil {
443 return
444 }
445 doneAssets = append(doneAssets, &newAsset)
446 }
447
448 return

Callers 2

createReleaseFunction · 0.95
editReleaseFunction · 0.95

Calls 7

simpleApiMethod · 0.95
DeleteReleaseAssetMethod · 0.95
UnmarshalMethod · 0.95
addQueryFunction · 0.85
checkStatusFunction · 0.85
PostFileMethod · 0.80
CloseMethod · 0.45

Tested by

no test coverage detected