Implement reference pruning on push.

This commit is contained in:
Chris Gavin 2020-08-27 17:29:47 +01:00
Родитель 7926f91bc1
Коммит d888c9f324
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 07F950B80C27E4DA
25 изменённых файлов: 88 добавлений и 12 удалений

Просмотреть файл

@ -14,6 +14,8 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"github.com/go-git/go-git/v5/plumbing"
"github.com/github/codeql-action-sync/internal/githubapiutil" "github.com/github/codeql-action-sync/internal/githubapiutil"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -22,6 +24,7 @@ import (
"github.com/github/codeql-action-sync/internal/version" "github.com/github/codeql-action-sync/internal/version"
"github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/config"
"github.com/go-git/go-git/v5/plumbing/transport"
githttp "github.com/go-git/go-git/v5/plumbing/transport/http" githttp "github.com/go-git/go-git/v5/plumbing/transport/http"
"github.com/google/go-github/v32/github" "github.com/google/go-github/v32/github"
"github.com/mitchellh/ioprogress" "github.com/mitchellh/ioprogress"
@ -142,35 +145,53 @@ func (pushService *pushService) pushGit(repository *github.Repository, initialPu
} }
refSpecBatches := [][]config.RefSpec{} refSpecBatches := [][]config.RefSpec{}
remoteReferences, err := remote.List(&git.ListOptions{Auth: credentials})
if err != nil && err != transport.ErrEmptyRemoteRepository {
return errors.Wrap(err, "Error listing remote references.")
}
deleteRefSpecs := []config.RefSpec{}
for _, remoteReference := range remoteReferences {
_, err := gitRepository.Reference(remoteReference.Name(), false)
if err != nil && err != plumbing.ErrReferenceNotFound {
return errors.Wrapf(err, "Error finding local reference %s.", remoteReference.Name())
}
if err == plumbing.ErrReferenceNotFound {
deleteRefSpecs = append(deleteRefSpecs, config.RefSpec(":"+remoteReference.Name().String()))
}
}
refSpecBatches = append(refSpecBatches, deleteRefSpecs)
if initialPush { if initialPush {
releasePathStats, err := ioutil.ReadDir(pushService.cacheDirectory.ReleasesPath()) releasePathStats, err := ioutil.ReadDir(pushService.cacheDirectory.ReleasesPath())
if err != nil { if err != nil {
return errors.Wrap(err, "Error reading releases.") return errors.Wrap(err, "Error reading releases.")
} }
refSpecBatches = append(refSpecBatches, []config.RefSpec{}) initialRefSpecs := []config.RefSpec{}
for _, releasePathStat := range releasePathStats { for _, releasePathStat := range releasePathStats {
refSpecBatches[0] = append(refSpecBatches[0], config.RefSpec("+refs/tags/"+releasePathStat.Name()+":refs/tags/"+releasePathStat.Name())) initialRefSpecs = append(initialRefSpecs, config.RefSpec("+refs/tags/"+releasePathStat.Name()+":refs/tags/"+releasePathStat.Name()))
} }
refSpecBatches = append(refSpecBatches, initialRefSpecs)
} else { } else {
// We've got to push `main` 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. // We've got to push `main` 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 = [][]config.RefSpec{ refSpecBatches = append(refSpecBatches,
[]config.RefSpec{ []config.RefSpec{
config.RefSpec("+refs/heads/main:refs/heads/main"), config.RefSpec("+refs/heads/main:refs/heads/main"),
}, },
[]config.RefSpec{ []config.RefSpec{
config.RefSpec("+refs/*:refs/*"), config.RefSpec("+refs/*:refs/*"),
}, },
} )
} }
for _, refSpecs := range refSpecBatches { for _, refSpecs := range refSpecBatches {
err = remote.PushContext(pushService.ctx, &git.PushOptions{ if len(refSpecs) != 0 {
RefSpecs: refSpecs, err = remote.PushContext(pushService.ctx, &git.PushOptions{
Auth: credentials, RefSpecs: refSpecs,
Progress: os.Stderr, Auth: credentials,
Force: true, Progress: os.Stderr,
}) })
if err != nil && errors.Cause(err) != git.NoErrAlreadyUpToDate { if err != nil && errors.Cause(err) != git.NoErrAlreadyUpToDate {
return errors.Wrap(err, "Error pushing Action to GitHub Enterprise Server.") return errors.Wrap(err, "Error pushing Action to GitHub Enterprise Server.")
}
} }
} }

Просмотреть файл

@ -150,6 +150,35 @@ func TestPushGit(t *testing.T) {
"bd82b85707bc13904e3526517677039d4da4a9bb refs/heads/very-ignored-branch", "bd82b85707bc13904e3526517677039d4da4a9bb refs/heads/very-ignored-branch",
"bd82b85707bc13904e3526517677039d4da4a9bb refs/tags/an-ignored-tag-too", "bd82b85707bc13904e3526517677039d4da4a9bb refs/tags/an-ignored-tag-too",
"26936381e619a01122ea33993e3cebc474496805 refs/tags/v2", "26936381e619a01122ea33993e3cebc474496805 refs/tags/v2",
"26936381e619a01122ea33993e3cebc474496805 refs/heads/a-ref-that-will-need-pruning",
})
pushService = getTestPushService(t, "./push_test/action-cache-modified/", "")
err = pushService.pushGit(&repository, true)
require.NoError(t, err)
test.CheckExpectedReferencesInRepository(t, destinationPath, []string{
"26936381e619a01122ea33993e3cebc474496805 refs/tags/codeql-bundle-20200101",
"26936381e619a01122ea33993e3cebc474496805 refs/tags/codeql-bundle-20200630",
"b9f01aa2c50f49898d4c7845a66be8824499fe9d refs/heads/main",
"26936381e619a01122ea33993e3cebc474496805 refs/heads/v1",
"e529a54fad10a936308b2220e05f7f00757f8e7c refs/heads/v3",
"bd82b85707bc13904e3526517677039d4da4a9bb refs/heads/very-ignored-branch",
"bd82b85707bc13904e3526517677039d4da4a9bb refs/tags/an-ignored-tag-too",
"26936381e619a01122ea33993e3cebc474496805 refs/tags/v2",
})
err = pushService.pushGit(&repository, false)
require.NoError(t, err)
test.CheckExpectedReferencesInRepository(t, destinationPath, []string{
"26936381e619a01122ea33993e3cebc474496805 refs/tags/codeql-bundle-20200101",
"26936381e619a01122ea33993e3cebc474496805 refs/tags/codeql-bundle-20200630",
"b9f01aa2c50f49898d4c7845a66be8824499fe9d refs/heads/main",
"26936381e619a01122ea33993e3cebc474496805 refs/heads/v1",
"e529a54fad10a936308b2220e05f7f00757f8e7c refs/heads/v3",
"bd82b85707bc13904e3526517677039d4da4a9bb refs/heads/very-ignored-branch",
"bd82b85707bc13904e3526517677039d4da4a9bb refs/tags/an-ignored-tag-too",
"26936381e619a01122ea33993e3cebc474496805 refs/tags/v2",
"26936381e619a01122ea33993e3cebc474496805 refs/heads/a-ref-that-will-need-pruning/because-it-now-has-this-extra-bit",
}) })
} }

Просмотреть файл

@ -1,4 +1,5 @@
# pack-refs with: peeled fully-peeled sorted # pack-refs with: peeled fully-peeled sorted
26936381e619a01122ea33993e3cebc474496805 refs/heads/a-ref-that-will-need-pruning
b9f01aa2c50f49898d4c7845a66be8824499fe9d refs/heads/main b9f01aa2c50f49898d4c7845a66be8824499fe9d refs/heads/main
26936381e619a01122ea33993e3cebc474496805 refs/heads/v1 26936381e619a01122ea33993e3cebc474496805 refs/heads/v1
e529a54fad10a936308b2220e05f7f00757f8e7c refs/heads/v3 e529a54fad10a936308b2220e05f7f00757f8e7c refs/heads/v3

Просмотреть файл

@ -0,0 +1 @@
ref: refs/heads/main

Просмотреть файл

@ -0,0 +1,4 @@
[core]
repositoryformatversion = 0
filemode = true
bare = true

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Двоичный файл не отображается.

Просмотреть файл

@ -0,0 +1,10 @@
# pack-refs with: peeled fully-peeled sorted
26936381e619a01122ea33993e3cebc474496805 refs/heads/a-ref-that-will-need-pruning/because-it-now-has-this-extra-bit
b9f01aa2c50f49898d4c7845a66be8824499fe9d refs/heads/main
26936381e619a01122ea33993e3cebc474496805 refs/heads/v1
e529a54fad10a936308b2220e05f7f00757f8e7c refs/heads/v3
bd82b85707bc13904e3526517677039d4da4a9bb refs/heads/very-ignored-branch
bd82b85707bc13904e3526517677039d4da4a9bb refs/tags/an-ignored-tag-too
26936381e619a01122ea33993e3cebc474496805 refs/tags/codeql-bundle-20200101
26936381e619a01122ea33993e3cebc474496805 refs/tags/codeql-bundle-20200630
26936381e619a01122ea33993e3cebc474496805 refs/tags/v2

Просмотреть файл

Просмотреть файл

@ -0,0 +1 @@
This isn't really a CodeQL bundle either!

Просмотреть файл

@ -0,0 +1,4 @@
{
"tag_name": "codeql-bundle-20200101",
"target_commitish": "main"
}

Просмотреть файл

@ -0,0 +1 @@
This isn't really a CodeQL bundle!

Просмотреть файл

@ -0,0 +1,4 @@
{
"tag_name": "codeql-bundle-20200630",
"target_commitish": "main"
}