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)
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