From 7d443c65202c3ac863b7c40425b2362cd2c83e2d Mon Sep 17 00:00:00 2001 From: Tom Lazar Date: Wed, 2 Sep 2020 09:56:44 -0500 Subject: [PATCH] Set the default branch inside the event data (#354) * set ${{github.event.repository.default_branch}} * change `ok == false` to `!ok` Co-authored-by: Casey Lee --- cmd/input.go | 1 + cmd/root.go | 8 ++++++++ pkg/runner/run_context.go | 30 ++++++++++++++++++++++++++++++ pkg/runner/runner.go | 1 + 4 files changed, 40 insertions(+) diff --git a/cmd/input.go b/cmd/input.go index 736c11b6077..8f817f3ba07 100644 --- a/cmd/input.go +++ b/cmd/input.go @@ -20,6 +20,7 @@ type Input struct { noOutput bool envfile string secretfile string + defaultBranch string privileged bool } diff --git a/cmd/root.go b/cmd/root.go index 8ac8d63a913..2e0b79a3502 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -41,6 +41,7 @@ func Execute(ctx context.Context, version string) { rootCmd.Flags().BoolVarP(&input.bindWorkdir, "bind", "b", false, "bind working directory to container, rather than copy") rootCmd.Flags().BoolVarP(&input.forcePull, "pull", "p", false, "pull docker image(s) if already present") rootCmd.Flags().StringVarP(&input.eventPath, "eventpath", "e", "", "path to event JSON file") + rootCmd.Flags().StringVar(&input.defaultBranch, "defaultbranch", "", "the name of the main branch") rootCmd.Flags().BoolVar(&input.privileged, "privileged", false, "use privileged mode") rootCmd.PersistentFlags().StringVarP(&input.actor, "actor", "a", "nektos/act", "user that triggered the event") rootCmd.PersistentFlags().StringVarP(&input.workflowsPath, "workflows", "W", "./.github/workflows/", "path to workflow file(s)") @@ -156,11 +157,18 @@ func newRunCommand(ctx context.Context, input *Input) func(*cobra.Command, []str return drawGraph(plan) } + // check to see if the main branch was defined + defaultbranch, err := cmd.Flags().GetString("defaultbranch") + if err != nil { + return err + } + // run the plan config := &runner.Config{ Actor: input.actor, EventName: eventName, EventPath: input.EventPath(), + DefaultBranch: defaultbranch, ForcePull: input.forcePull, ReuseContainers: input.reuseContainers, Workdir: input.Workdir(), diff --git a/pkg/runner/run_context.go b/pkg/runner/run_context.go index beaa8854634..158d8f69b4a 100644 --- a/pkg/runner/run_context.go +++ b/pkg/runner/run_context.go @@ -400,6 +400,13 @@ func (rc *RunContext) getGithubContext() *githubContext { } } + // set the branch in the event data + if rc.Config.DefaultBranch != "" { + ghc.Event = withDefaultBranch(rc.Config.DefaultBranch, ghc.Event) + } else { + ghc.Event = withDefaultBranch("master", ghc.Event) + } + if ghc.EventName == "pull_request" { ghc.BaseRef = asString(nestedMapLookup(ghc.Event, "pull_request", "base", "ref")) ghc.HeadRef = asString(nestedMapLookup(ghc.Event, "pull_request", "head", "ref")) @@ -452,6 +459,29 @@ func nestedMapLookup(m map[string]interface{}, ks ...string) (rval interface{}) } } +func withDefaultBranch(b string, event map[string]interface{}) map[string]interface{} { + repoI, ok := event["repository"] + if !ok { + repoI = make(map[string]interface{}) + } + + repo, ok := repoI.(map[string]interface{}) + if !ok { + log.Warnf("unable to set default branch to %v", b) + return event + } + + // if the branch is already there return with no changes + if _, ok = repo["default_branch"]; ok { + return event + } + + repo["default_branch"] = b + event["repository"] = repo + + return event +} + func (rc *RunContext) withGithubEnv(env map[string]string) map[string]string { github := rc.getGithubContext() env["HOME"] = "/github/home" diff --git a/pkg/runner/runner.go b/pkg/runner/runner.go index e5ea0c85ae2..8d8592f1476 100644 --- a/pkg/runner/runner.go +++ b/pkg/runner/runner.go @@ -22,6 +22,7 @@ type Config struct { BindWorkdir bool // bind the workdir to the job container EventName string // name of event to run EventPath string // path to JSON file to use for event.json in containers + DefaultBranch string // name of the main branch for this repository ReuseContainers bool // reuse containers to maintain state ForcePull bool // force pulling of the image, if already present LogOutput bool // log the output from docker run