@@ -307,36 +307,49 @@ func (pushService *pushService) uploadReleaseAsset(release *github.RepositoryRel
307
307
}
308
308
309
309
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." )
315
345
return nil
346
+ } else if response == nil || response .StatusCode < 500 || attempt >= 5 {
347
+ return err
316
348
} 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 ())
322
350
}
323
351
}
324
352
}
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
353
return nil
341
354
}
342
355
0 commit comments