mirror of
https://code.forgejo.org/forgejo/runner.git
synced 2025-09-15 18:57:01 +00:00
refactor: simpilfy go-git cache (#2208)
This commit is contained in:
parent
7065a7e228
commit
f3706ee3ea
2 changed files with 59 additions and 48 deletions
|
@ -6,7 +6,6 @@ import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"path"
|
"path"
|
||||||
|
@ -43,17 +42,7 @@ func (c GoGitActionCache) Fetch(ctx context.Context, cacheDir, url, ref, token s
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
branchName := hex.EncodeToString(tmpBranch)
|
branchName := hex.EncodeToString(tmpBranch)
|
||||||
var refSpec config.RefSpec
|
|
||||||
spec := config.RefSpec(ref + ":" + branchName)
|
|
||||||
tagOrSha := false
|
|
||||||
if spec.IsExactSHA1() {
|
|
||||||
refSpec = spec
|
|
||||||
} else if strings.HasPrefix(ref, "refs/") {
|
|
||||||
refSpec = config.RefSpec(ref + ":refs/heads/" + branchName)
|
|
||||||
} else {
|
|
||||||
tagOrSha = true
|
|
||||||
refSpec = config.RefSpec("refs/*/" + ref + ":refs/heads/*/" + branchName)
|
|
||||||
}
|
|
||||||
var auth transport.AuthMethod
|
var auth transport.AuthMethod
|
||||||
if token != "" {
|
if token != "" {
|
||||||
auth = &http.BasicAuth{
|
auth = &http.BasicAuth{
|
||||||
|
@ -71,35 +60,17 @@ func (c GoGitActionCache) Fetch(ctx context.Context, cacheDir, url, ref, token s
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if refs, err := gogitrepo.References(); err == nil {
|
_ = gogitrepo.DeleteBranch(branchName)
|
||||||
_ = refs.ForEach(func(r *plumbing.Reference) error {
|
|
||||||
if strings.Contains(r.Name().String(), branchName) {
|
|
||||||
return gogitrepo.DeleteBranch(r.Name().String())
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
if err := remote.FetchContext(ctx, &git.FetchOptions{
|
if err := remote.FetchContext(ctx, &git.FetchOptions{
|
||||||
RefSpecs: []config.RefSpec{
|
RefSpecs: []config.RefSpec{
|
||||||
refSpec,
|
config.RefSpec(ref + ":" + branchName),
|
||||||
},
|
},
|
||||||
Auth: auth,
|
Auth: auth,
|
||||||
Force: true,
|
Force: true,
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
if tagOrSha && errors.Is(err, git.NoErrAlreadyUpToDate) {
|
|
||||||
return "", fmt.Errorf("couldn't find remote ref \"%s\"", ref)
|
|
||||||
}
|
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if tagOrSha {
|
|
||||||
for _, prefix := range []string{"refs/heads/tags/", "refs/heads/heads/"} {
|
|
||||||
hash, err := gogitrepo.ResolveRevision(plumbing.Revision(prefix + branchName))
|
|
||||||
if err == nil {
|
|
||||||
return hash.String(), nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hash, err := gogitrepo.ResolveRevision(plumbing.Revision(branchName))
|
hash, err := gogitrepo.ResolveRevision(plumbing.Revision(branchName))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|
|
@ -18,20 +18,60 @@ func TestActionCache(t *testing.T) {
|
||||||
Path: os.TempDir(),
|
Path: os.TempDir(),
|
||||||
}
|
}
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
sha, err := cache.Fetch(ctx, "christopherhx/script", "https://github.com/christopherhx/script", "main", "")
|
cacheDir := "nektos/act-test-actions"
|
||||||
a.NoError(err)
|
repo := "https://github.com/nektos/act-test-actions"
|
||||||
a.NotEmpty(sha)
|
refs := []struct {
|
||||||
atar, err := cache.GetTarArchive(ctx, "christopherhx/script", sha, "node_modules")
|
Name string
|
||||||
a.NoError(err)
|
CacheDir string
|
||||||
a.NotEmpty(atar)
|
Repo string
|
||||||
mytar := tar.NewReader(atar)
|
Ref string
|
||||||
th, err := mytar.Next()
|
}{
|
||||||
a.NoError(err)
|
{
|
||||||
a.NotEqual(0, th.Size)
|
Name: "Fetch Branch Name",
|
||||||
buf := &bytes.Buffer{}
|
CacheDir: cacheDir,
|
||||||
// G110: Potential DoS vulnerability via decompression bomb (gosec)
|
Repo: repo,
|
||||||
_, err = io.Copy(buf, mytar)
|
Ref: "main",
|
||||||
a.NoError(err)
|
},
|
||||||
str := buf.String()
|
{
|
||||||
a.NotEmpty(str)
|
Name: "Fetch Branch Name Absolutely",
|
||||||
|
CacheDir: cacheDir,
|
||||||
|
Repo: repo,
|
||||||
|
Ref: "refs/heads/main",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "Fetch HEAD",
|
||||||
|
CacheDir: cacheDir,
|
||||||
|
Repo: repo,
|
||||||
|
Ref: "HEAD",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "Fetch Sha",
|
||||||
|
CacheDir: cacheDir,
|
||||||
|
Repo: repo,
|
||||||
|
Ref: "de984ca37e4df4cb9fd9256435a3b82c4a2662b1",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, c := range refs {
|
||||||
|
t.Run(c.Name, func(t *testing.T) {
|
||||||
|
sha, err := cache.Fetch(ctx, c.CacheDir, c.Repo, c.Ref, "")
|
||||||
|
if !a.NoError(err) || !a.NotEmpty(sha) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
atar, err := cache.GetTarArchive(ctx, c.CacheDir, sha, "js")
|
||||||
|
if !a.NoError(err) || !a.NotEmpty(atar) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
mytar := tar.NewReader(atar)
|
||||||
|
th, err := mytar.Next()
|
||||||
|
if !a.NoError(err) || !a.NotEqual(0, th.Size) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
buf := &bytes.Buffer{}
|
||||||
|
// G110: Potential DoS vulnerability via decompression bomb (gosec)
|
||||||
|
_, err = io.Copy(buf, mytar)
|
||||||
|
a.NoError(err)
|
||||||
|
str := buf.String()
|
||||||
|
a.NotEmpty(str)
|
||||||
|
})
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue