Skip to content

Commit 127bc30

Browse files
committed
Add some release asset upload retrying.
1 parent 374a26d commit 127bc30

File tree

1 file changed

+38
-25
lines changed

1 file changed

+38
-25
lines changed

internal/push/push.go

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -307,36 +307,49 @@ 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 {
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+
}
325+
}
326+
}
327+
}
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+
break
342+
} else {
343+
if githubErrorResponse := new(github.ErrorResponse); errors.As(err, &githubErrorResponse) && len(githubErrorResponse.Errors) == 1 && githubErrorResponse.Errors[0].Code == "already_exists" {
344+
log.Warn("Asset already existed.")
315345
return nil
346+
} else if response == nil || response.StatusCode < 500 || attempt >= 5 {
347+
return err
316348
} 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.")
321-
}
349+
log.Warnf("Attempt %d failed to upload release asset (%s), retrying...", attempt, err.Error())
322350
}
323351
}
324352
}
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-
}
340353
return nil
341354
}
342355

0 commit comments

Comments
 (0)