(release *Release, assets []LocalAsset)
| 389 | } |
| 390 | |
| 391 | func (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 |
no test coverage detected