@@ -307,37 +307,53 @@ func (pushService *pushService) uploadReleaseAsset(release *github.RepositoryRel
307307}
308308
309309func (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
343359func (pushService * pushService ) pushReleases () error {
0 commit comments