Skip to content

Commit d089cfe

Browse files
committed
Add some release asset upload retrying.
1 parent ad03f1e commit d089cfe

File tree

1 file changed

+46
-27
lines changed

1 file changed

+46
-27
lines changed

internal/push/push.go

Lines changed: 46 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -308,37 +308,56 @@ func (pushService *pushService) uploadReleaseAsset(release *github.RepositoryRel
308308
}
309309

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

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

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy