infra/blueprint-test/pkg/git/git.go (81 lines of code) (raw):

package git import ( "fmt" "time" "github.com/GoogleCloudPlatform/cloud-foundation-toolkit/infra/blueprint-test/pkg/utils" "github.com/gruntwork-io/terratest/modules/logger" "github.com/gruntwork-io/terratest/modules/shell" "github.com/mitchellh/go-testing-interface" ) type CmdCfg struct { gitBinary string // git binary dir string // dir to execute commands in logger *logger.Logger // custom logger t testing.TB // TestingT or TestingB } type cmdOption func(*CmdCfg) func WithDir(dir string) cmdOption { return func(f *CmdCfg) { f.dir = dir } } func WithLogger(logger *logger.Logger) cmdOption { return func(f *CmdCfg) { f.logger = logger } } // NewCmdConfig sets defaults and validates values for git Options. func NewCmdConfig(t testing.TB, opts ...cmdOption) *CmdCfg { gitOpts := &CmdCfg{ logger: utils.GetLoggerFromT(), t: t, } // apply options for _, opt := range opts { opt(gitOpts) } if gitOpts.gitBinary == "" { err := utils.BinaryInPath("git") if err != nil { t.Fatalf("unable to find git in path: %v", err) } gitOpts.gitBinary = "git" } return gitOpts } // RunCmd executes a git command func (g *CmdCfg) RunCmdE(args ...string) (string, error) { kptCmd := shell.Command{ Command: g.gitBinary, Args: args, Logger: g.logger, WorkingDir: g.dir, } return shell.RunCommandAndGetStdOutE(g.t, kptCmd) } // GetLatestCommit returns latest commit func (g *CmdCfg) GetLatestCommit() string { commit, err := g.RunCmdE("rev-parse", "HEAD") if err != nil { g.t.Fatalf("error getting latest commit: %v", err) } return commit } // Init run git init func (g *CmdCfg) Init() { _, err := g.RunCmdE("init") if err != nil { g.t.Fatalf("error running git init: %v", err) } } // AddAll stages all changes. func (g *CmdCfg) AddAll() { _, err := g.RunCmdE("add", "-A") if err != nil { g.t.Fatalf("error running git add: %v", err) } } // CommitWithMsg commits changes with commit msg. func (g *CmdCfg) CommitWithMsg(msg string, commitFlags []string) { _, err := g.RunCmdE(append([]string{"commit", "-m", fmt.Sprintf("%q", msg)}, commitFlags...)...) if err != nil { g.t.Fatalf("error running git commit: %v", err) } } // CommitWithMsg commits changes with a generated commit msg. func (g *CmdCfg) Commit() { currentTime := time.Now() g.CommitWithMsg(fmt.Sprintf("commit %s", currentTime.Format(time.RFC1123)), []string{"--author", "BlueprintsTest <blueprints-ci-test@google.com>"}) }