@@ -308,37 +308,56 @@ func (pushService *pushService) uploadReleaseAsset(release *github.RepositoryRel
308
308
}
309
309
310
310
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
+ }
322
326
}
323
327
}
324
328
}
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
+ }
325
360
}
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
342
361
}
343
362
344
363
func (pushService * pushService ) pushReleases () error {
0 commit comments