From 6b880cce4224ec14a2c4e1b0ceb6bfe0592a0509 Mon Sep 17 00:00:00 2001 From: Chris Gavin Date: Fri, 14 Feb 2025 13:39:50 +0000 Subject: [PATCH] Push refs in smaller batches. --- internal/push/push.go | 51 +++++++++++++++++++++++++++++++------------ 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/internal/push/push.go b/internal/push/push.go index 9704421..c942f8c 100644 --- a/internal/push/push.go +++ b/internal/push/push.go @@ -163,6 +163,18 @@ func (pushService *pushService) createRepository() (*github.Repository, error) { return repository, nil } +func splitLargeRefSpecs(refSpecs []config.RefSpec) [][]config.RefSpec { + splitRefSpecs := [][]config.RefSpec{} + for i := 0; i < len(refSpecs); i += 25 { + end := i + 100 + if end > len(refSpecs) { + end = len(refSpecs) + } + splitRefSpecs = append(splitRefSpecs, refSpecs[i:end]) + } + return splitRefSpecs +} + func (pushService *pushService) pushGit(repository *github.Repository, initialPush bool) error { remoteURL := pushService.gitURL if remoteURL == "" { @@ -210,9 +222,10 @@ func (pushService *pushService) pushGit(repository *github.Repository, initialPu deleteRefSpecs = append(deleteRefSpecs, config.RefSpec(":"+remoteReference.Name().String())) } } - refSpecBatches = append(refSpecBatches, deleteRefSpecs) + refSpecBatches = append(refSpecBatches, splitLargeRefSpecs(deleteRefSpecs)...) - defaultBranchRefSpec := "+refs/heads/main:refs/heads/main" + defaultBranchRef := "refs/heads/main" + defaultBranchRefSpec := "+" + defaultBranchRef + ":" + defaultBranchRef if initialPush { releasePathStats, err := ioutil.ReadDir(pushService.cacheDirectory.ReleasesPath()) if err != nil { @@ -227,20 +240,30 @@ func (pushService *pushService) pushGit(repository *github.Repository, initialPu } initialRefSpecs = append(initialRefSpecs, config.RefSpec("+"+tagReferenceName.String()+":"+tagReferenceName.String())) } - refSpecBatches = append(refSpecBatches, initialRefSpecs) + refSpecBatches = append(refSpecBatches, splitLargeRefSpecs(initialRefSpecs)...) } else { // We've got to push the default branch on its own, so that it will be made the default branch if the repository has just been created. We then push everything else afterwards. refSpecBatches = append(refSpecBatches, []config.RefSpec{ config.RefSpec(defaultBranchRefSpec), }, - []config.RefSpec{ - config.RefSpec("+refs/*:refs/*"), - }, ) + nonDefaultRefSpecs := []config.RefSpec{} + localReferences, err := gitRepository.References() + if err != nil { + return errors.Wrap(err, "Error listing local references.") + } + localReferences.ForEach(func(ref *plumbing.Reference) error { + if ref.Name().String() != defaultBranchRef && strings.HasPrefix(ref.Name().String(), "refs/") { + nonDefaultRefSpecs = append(nonDefaultRefSpecs, config.RefSpec("+"+ref.Name().String()+":"+ref.Name().String())) + } + return nil + }) + refSpecBatches = append(refSpecBatches, splitLargeRefSpecs(nonDefaultRefSpecs)...) } for _, refSpecs := range refSpecBatches { if len(refSpecs) != 0 { + log.Debugf("Pushing refspecs %s.", refSpecs) err = remote.PushContext(pushService.ctx, &git.PushOptions{ RefSpecs: refSpecs, Auth: credentials, @@ -393,17 +416,17 @@ func (pushService *pushService) pushReleases() error { existingAssets = append(existingAssets, assets...) } - assetsPath := pushService.cacheDirectory.AssetsPath(releaseName) - assetPathStats, err := ioutil.ReadDir(assetsPath) + //assetsPath := pushService.cacheDirectory.AssetsPath(releaseName) + //assetPathStats, err := ioutil.ReadDir(assetsPath) if err != nil { return errors.Wrap(err, "Error reading release assets.") } - for _, assetPathStat := range assetPathStats { - err := pushService.createOrUpdateReleaseAsset(release, existingAssets, assetPathStat) - if err != nil { - return err - } - } + // for _, assetPathStat := range assetPathStats { + // err := pushService.createOrUpdateReleaseAsset(release, existingAssets, assetPathStat) + // if err != nil { + // return err + // } + // } } return nil