1
0
Fork 0
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:
ChristopherHX 2024-02-18 04:53:22 +01:00 committed by achyrva
parent 7065a7e228
commit f3706ee3ea
2 changed files with 59 additions and 48 deletions

View file

@ -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

View file

@ -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)
})
}
} }