@@ -308,37 +308,56 @@ func (pushService *pushService) uploadReleaseAsset(release *github.RepositoryRel
308308}
309309
310310func (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
344363func (pushService * pushService ) pushReleases () error {
0 commit comments