diff --git a/cmd/root.go b/cmd/root.go index 5e5cbbf9..9a4b5ffb 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -562,8 +562,16 @@ func newRunCommand(ctx context.Context, input *Input) func(*cobra.Command, []str ContainerNetworkMode: docker_container.NetworkMode(input.networkName), } if input.useNewActionCache { - config.ActionCache = &runner.GoGitActionCache{ - Path: config.ActionCacheDir, + if input.actionOfflineMode { + config.ActionCache = &runner.GoGitActionCacheOfflineMode{ + Parent: runner.GoGitActionCache{ + Path: config.ActionCacheDir, + }, + } + } else { + config.ActionCache = &runner.GoGitActionCache{ + Path: config.ActionCacheDir, + } } } r, err := runner.New(config) diff --git a/pkg/runner/action_cache_offline_mode.go b/pkg/runner/action_cache_offline_mode.go new file mode 100644 index 00000000..c4a572a4 --- /dev/null +++ b/pkg/runner/action_cache_offline_mode.go @@ -0,0 +1,41 @@ +package runner + +import ( + "context" + "io" + "path" + + git "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" +) + +type GoGitActionCacheOfflineMode struct { + Parent GoGitActionCache +} + +func (c GoGitActionCacheOfflineMode) Fetch(ctx context.Context, cacheDir, url, ref, token string) (string, error) { + sha, fetchErr := c.Parent.Fetch(ctx, cacheDir, url, ref, token) + gitPath := path.Join(c.Parent.Path, safeFilename(cacheDir)+".git") + gogitrepo, err := git.PlainOpen(gitPath) + if err != nil { + return "", fetchErr + } + refName := plumbing.ReferenceName("refs/action-cache-offline/" + ref) + r, err := gogitrepo.Reference(refName, true) + if fetchErr == nil { + if err != nil || sha != r.Hash().String() { + if err == nil { + refName = r.Name() + } + ref := plumbing.NewHashReference(refName, plumbing.NewHash(sha)) + _ = gogitrepo.Storer.SetReference(ref) + } + } else if err == nil { + return r.Hash().String(), nil + } + return sha, fetchErr +} + +func (c GoGitActionCacheOfflineMode) GetTarArchive(ctx context.Context, cacheDir, sha, includePrefix string) (io.ReadCloser, error) { + return c.Parent.GetTarArchive(ctx, cacheDir, sha, includePrefix) +}