Skip to content

Commit 38c5894

Browse files
committed
Add some release asset upload retrying.
1 parent 374a26d commit 38c5894

File tree

1 file changed

+43
-27
lines changed

1 file changed

+43
-27
lines changed

internal/push/push.go

Lines changed: 43 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -307,37 +307,53 @@ func (pushService *pushService) uploadReleaseAsset(release *github.RepositoryRel
307307
}
308308

309309
func (pushService *pushService) createOrUpdateReleaseAsset(release *github.RepositoryRelease, existingAssets []*github.ReleaseAsset, assetPathStat os.FileInfo) error {
310-
for _, existingAsset := range existingAssets {
311-
if existingAsset.GetName() == assetPathStat.Name() {
312-
actualSize := int64(existingAsset.GetSize())
313-
expectedSize := assetPathStat.Size()
314-
if actualSize == expectedSize {
315-
return nil
316-
} else {
317-
log.Warnf("Removing existing release asset %s because it was only partially-uploaded (had size %d, but should have been %d)...", existingAsset.GetName(), actualSize, expectedSize)
318-
_, err := pushService.githubEnterpriseClient.Repositories.DeleteReleaseAsset(pushService.ctx, pushService.destinationRepositoryOwner, pushService.destinationRepositoryName, existingAsset.GetID())
319-
if err != nil {
320-
return errors.Wrap(err, "Error deleting existing release asset.")
310+
attempt := 0
311+
for {
312+
attempt++
313+
for _, existingAsset := range existingAssets {
314+
if existingAsset.GetName() == assetPathStat.Name() {
315+
actualSize := int64(existingAsset.GetSize())
316+
expectedSize := assetPathStat.Size()
317+
if actualSize == expectedSize {
318+
return nil
319+
} else {
320+
log.Warnf("Removing existing release asset %s because it was only partially-uploaded (had size %d, but should have been %d)...", existingAsset.GetName(), actualSize, expectedSize)
321+
_, err := pushService.githubEnterpriseClient.Repositories.DeleteReleaseAsset(pushService.ctx, pushService.destinationRepositoryOwner, pushService.destinationRepositoryName, existingAsset.GetID())
322+
if err != nil {
323+
return errors.Wrap(err, "Error deleting existing release asset.")
324+
}
321325
}
322326
}
323327
}
328+
log.Debugf("Uploading release asset %s...", assetPathStat.Name())
329+
assetFile, err := os.Open(pushService.cacheDirectory.AssetPath(release.GetTagName(), assetPathStat.Name()))
330+
defer assetFile.Close()
331+
progressReader := &ioprogress.Reader{
332+
Reader: assetFile,
333+
Size: assetPathStat.Size(),
334+
DrawFunc: ioprogress.DrawTerminalf(os.Stderr, ioprogress.DrawTextFormatBytes),
335+
}
336+
if err != nil {
337+
return errors.Wrap(err, "Error opening release asset.")
338+
}
339+
_, response, err := pushService.uploadReleaseAsset(release, assetPathStat, progressReader)
340+
if err == nil {
341+
return nil
342+
} else {
343+
if githubErrorResponse := new(github.ErrorResponse); errors.As(err, &githubErrorResponse) {
344+
for _, innerError := range githubErrorResponse.Errors {
345+
if innerError.Code == "already_exists" {
346+
log.Warn("Asset already existed.")
347+
return nil
348+
}
349+
}
350+
}
351+
if response == nil || response.StatusCode < 500 || attempt >= 5 {
352+
return err
353+
}
354+
log.Warnf("Attempt %d failed to upload release asset (%s), retrying...", attempt, err.Error())
355+
}
324356
}
325-
log.Debugf("Uploading release asset %s...", assetPathStat.Name())
326-
assetFile, err := os.Open(pushService.cacheDirectory.AssetPath(release.GetTagName(), assetPathStat.Name()))
327-
defer assetFile.Close()
328-
progressReader := &ioprogress.Reader{
329-
Reader: assetFile,
330-
Size: assetPathStat.Size(),
331-
DrawFunc: ioprogress.DrawTerminalf(os.Stderr, ioprogress.DrawTextFormatBytes),
332-
}
333-
if err != nil {
334-
return errors.Wrap(err, "Error opening release asset.")
335-
}
336-
_, _, err = pushService.uploadReleaseAsset(release, assetPathStat, progressReader)
337-
if err != nil {
338-
return errors.Wrap(err, "Error uploading release asset.")
339-
}
340-
return nil
341357
}
342358

343359
func (pushService *pushService) pushReleases() error {

0 commit comments

Comments
 (0)