Merge pull request #490 from thockin/release-3.x

Set $GITSYNC_HASH in exechook (v3)
This commit is contained in:
Kubernetes Prow Robot 2022-02-06 23:41:43 -08:00 committed by GitHub
commit 53b4dbd00d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 25 deletions

View File

@ -669,12 +669,12 @@ func updateSymlink(ctx context.Context, gitRoot, link, newDir string) (string, e
const tmplink = "tmp-link" const tmplink = "tmp-link"
log.V(1).Info("creating tmp symlink", "root", linkDir, "dst", newDirRelative, "src", tmplink) log.V(1).Info("creating tmp symlink", "root", linkDir, "dst", newDirRelative, "src", tmplink)
if _, err := cmdRunner.Run(ctx, linkDir, "ln", "-snf", newDirRelative, tmplink); err != nil { if _, err := cmdRunner.Run(ctx, linkDir, nil, "ln", "-snf", newDirRelative, tmplink); err != nil {
return "", fmt.Errorf("error creating symlink: %v", err) return "", fmt.Errorf("error creating symlink: %v", err)
} }
log.V(1).Info("renaming symlink", "root", linkDir, "old_name", tmplink, "new_name", linkFile) log.V(1).Info("renaming symlink", "root", linkDir, "old_name", tmplink, "new_name", linkFile)
if _, err := cmdRunner.Run(ctx, linkDir, "mv", "-T", tmplink, linkFile); err != nil { if _, err := cmdRunner.Run(ctx, linkDir, nil, "mv", "-T", tmplink, linkFile); err != nil {
return "", fmt.Errorf("error replacing symlink: %v", err) return "", fmt.Errorf("error replacing symlink: %v", err)
} }
@ -703,7 +703,7 @@ func cleanupWorkTree(ctx context.Context, gitRoot, worktree string) error {
log.V(1).Info("removing worktree", "path", worktree) log.V(1).Info("removing worktree", "path", worktree)
if err := os.RemoveAll(worktree); err != nil { if err := os.RemoveAll(worktree); err != nil {
return fmt.Errorf("error removing directory: %v", err) return fmt.Errorf("error removing directory: %v", err)
} else if _, err := cmdRunner.Run(ctx, gitRoot, *flGitCmd, "worktree", "prune"); err != nil { } else if _, err := cmdRunner.Run(ctx, gitRoot, nil, *flGitCmd, "worktree", "prune"); err != nil {
return err return err
} }
return nil return nil
@ -720,7 +720,7 @@ func addWorktreeAndSwap(ctx context.Context, gitRoot, dest, branch, rev string,
args = append(args, "origin", branch) args = append(args, "origin", branch)
// Update from the remote. // Update from the remote.
if _, err := cmdRunner.Run(ctx, gitRoot, *flGitCmd, args...); err != nil { if _, err := cmdRunner.Run(ctx, gitRoot, nil, *flGitCmd, args...); err != nil {
return err return err
} }
@ -745,14 +745,14 @@ func addWorktreeAndSwap(ctx context.Context, gitRoot, dest, branch, rev string,
return err return err
} }
_, err := cmdRunner.Run(ctx, gitRoot, *flGitCmd, "worktree", "add", "--detach", worktreePath, hash, "--no-checkout") _, err := cmdRunner.Run(ctx, gitRoot, nil, *flGitCmd, "worktree", "add", "--detach", worktreePath, hash, "--no-checkout")
log.V(0).Info("adding worktree", "path", worktreePath, "branch", fmt.Sprintf("origin/%s", branch)) log.V(0).Info("adding worktree", "path", worktreePath, "branch", fmt.Sprintf("origin/%s", branch))
if err != nil { if err != nil {
return err return err
} }
// GC clone // GC clone
if _, err := cmdRunner.Run(ctx, gitRoot, *flGitCmd, "gc", "--prune=all"); err != nil { if _, err := cmdRunner.Run(ctx, gitRoot, nil, *flGitCmd, "gc", "--prune=all"); err != nil {
return err return err
} }
@ -802,13 +802,13 @@ func addWorktreeAndSwap(ctx context.Context, gitRoot, dest, branch, rev string,
} }
args := []string{"sparse-checkout", "init"} args := []string{"sparse-checkout", "init"}
_, err = cmdRunner.Run(ctx, worktreePath, *flGitCmd, args...) _, err = cmdRunner.Run(ctx, worktreePath, nil, *flGitCmd, args...)
if err != nil { if err != nil {
return err return err
} }
} }
_, err = cmdRunner.Run(ctx, worktreePath, *flGitCmd, "reset", "--hard", hash) _, err = cmdRunner.Run(ctx, worktreePath, nil, *flGitCmd, "reset", "--hard", hash)
if err != nil { if err != nil {
return err return err
} }
@ -825,7 +825,7 @@ func addWorktreeAndSwap(ctx context.Context, gitRoot, dest, branch, rev string,
if depth != 0 { if depth != 0 {
submodulesArgs = append(submodulesArgs, "--depth", strconv.Itoa(depth)) submodulesArgs = append(submodulesArgs, "--depth", strconv.Itoa(depth))
} }
_, err = cmdRunner.Run(ctx, worktreePath, *flGitCmd, submodulesArgs...) _, err = cmdRunner.Run(ctx, worktreePath, nil, *flGitCmd, submodulesArgs...)
if err != nil { if err != nil {
return err return err
} }
@ -835,7 +835,7 @@ func addWorktreeAndSwap(ctx context.Context, gitRoot, dest, branch, rev string,
if *flChmod != 0 { if *flChmod != 0 {
mode := fmt.Sprintf("%#o", *flChmod) mode := fmt.Sprintf("%#o", *flChmod)
log.V(0).Info("changing file permissions", "mode", mode) log.V(0).Info("changing file permissions", "mode", mode)
_, err = cmdRunner.Run(ctx, "", "chmod", "-R", mode, worktreePath) _, err = cmdRunner.Run(ctx, "", nil, "chmod", "-R", mode, worktreePath)
if err != nil { if err != nil {
return err return err
} }
@ -863,14 +863,14 @@ func addWorktreeAndSwap(ctx context.Context, gitRoot, dest, branch, rev string,
} }
func cloneRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot string) error { func cloneRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot string) error {
args := []string{"clone", "--no-checkout", "-b", branch} args := []string{"clone", "-v", "--no-checkout", "-b", branch}
if depth != 0 { if depth != 0 {
args = append(args, "--depth", strconv.Itoa(depth)) args = append(args, "--depth", strconv.Itoa(depth))
} }
args = append(args, repo, gitRoot) args = append(args, repo, gitRoot)
log.V(0).Info("cloning repo", "origin", repo, "path", gitRoot) log.V(0).Info("cloning repo", "origin", repo, "path", gitRoot)
_, err := cmdRunner.Run(ctx, "", *flGitCmd, args...) _, err := cmdRunner.Run(ctx, "", nil, *flGitCmd, args...)
if err != nil { if err != nil {
if strings.Contains(err.Error(), "already exists and is not an empty directory") { if strings.Contains(err.Error(), "already exists and is not an empty directory") {
// Maybe a previous run crashed? Git won't use this dir. // Maybe a previous run crashed? Git won't use this dir.
@ -882,7 +882,7 @@ func cloneRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot
if err != nil { if err != nil {
return err return err
} }
_, err = cmdRunner.Run(ctx, "", *flGitCmd, args...) _, err = cmdRunner.Run(ctx, "", nil, *flGitCmd, args...)
if err != nil { if err != nil {
return err return err
} }
@ -924,7 +924,7 @@ func cloneRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot
} }
args := []string{"sparse-checkout", "init"} args := []string{"sparse-checkout", "init"}
_, err = cmdRunner.Run(ctx, gitRoot, *flGitCmd, args...) _, err = cmdRunner.Run(ctx, gitRoot, nil, *flGitCmd, args...)
if err != nil { if err != nil {
return err return err
} }
@ -935,7 +935,7 @@ func cloneRepo(ctx context.Context, repo, branch, rev string, depth int, gitRoot
// localHashForRev returns the locally known hash for a given rev. // localHashForRev returns the locally known hash for a given rev.
func localHashForRev(ctx context.Context, rev, gitRoot string) (string, error) { func localHashForRev(ctx context.Context, rev, gitRoot string) (string, error) {
output, err := cmdRunner.Run(ctx, gitRoot, *flGitCmd, "rev-parse", rev) output, err := cmdRunner.Run(ctx, gitRoot, nil, *flGitCmd, "rev-parse", rev)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -944,7 +944,7 @@ func localHashForRev(ctx context.Context, rev, gitRoot string) (string, error) {
// remoteHashForRef returns the upstream hash for a given ref. // remoteHashForRef returns the upstream hash for a given ref.
func remoteHashForRef(ctx context.Context, ref, gitRoot string) (string, error) { func remoteHashForRef(ctx context.Context, ref, gitRoot string) (string, error) {
output, err := cmdRunner.Run(ctx, gitRoot, *flGitCmd, "ls-remote", "-q", "origin", ref) output, err := cmdRunner.Run(ctx, gitRoot, nil, *flGitCmd, "ls-remote", "-q", "origin", ref)
if err != nil { if err != nil {
return "", err return "", err
} }
@ -954,7 +954,7 @@ func remoteHashForRef(ctx context.Context, ref, gitRoot string) (string, error)
func revIsHash(ctx context.Context, rev, gitRoot string) (bool, error) { func revIsHash(ctx context.Context, rev, gitRoot string) (bool, error) {
// If git doesn't identify rev as a commit, we're done. // If git doesn't identify rev as a commit, we're done.
output, err := cmdRunner.Run(ctx, gitRoot, *flGitCmd, "cat-file", "-t", rev) output, err := cmdRunner.Run(ctx, gitRoot, nil, *flGitCmd, "cat-file", "-t", rev)
if err != nil { if err != nil {
return false, err return false, err
} }
@ -1048,13 +1048,13 @@ func getRevs(ctx context.Context, localDir, branch, rev string) (string, string,
func setupGitAuth(ctx context.Context, username, password, gitURL string) error { func setupGitAuth(ctx context.Context, username, password, gitURL string) error {
log.V(1).Info("setting up git credential store") log.V(1).Info("setting up git credential store")
_, err := cmdRunner.Run(ctx, "", *flGitCmd, "config", "--global", "credential.helper", "store") _, err := cmdRunner.Run(ctx, "", nil, *flGitCmd, "config", "--global", "credential.helper", "store")
if err != nil { if err != nil {
return fmt.Errorf("can't configure git credential helper: %w", err) return fmt.Errorf("can't configure git credential helper: %w", err)
} }
creds := fmt.Sprintf("url=%v\nusername=%v\npassword=%v\n", gitURL, username, password) creds := fmt.Sprintf("url=%v\nusername=%v\npassword=%v\n", gitURL, username, password)
_, err = cmdRunner.RunWithStdin(ctx, "", creds, *flGitCmd, "credential", "approve") _, err = cmdRunner.RunWithStdin(ctx, "", nil, creds, *flGitCmd, "credential", "approve")
if err != nil { if err != nil {
return fmt.Errorf("can't configure git credentials: %w", err) return fmt.Errorf("can't configure git credentials: %w", err)
} }
@ -1101,7 +1101,7 @@ func setupGitCookieFile(ctx context.Context) error {
return fmt.Errorf("can't access git cookiefile: %w", err) return fmt.Errorf("can't access git cookiefile: %w", err)
} }
if _, err = cmdRunner.Run(ctx, "", *flGitCmd, "config", "--global", "http.cookiefile", pathToCookieFile); err != nil { if _, err = cmdRunner.Run(ctx, "", nil, *flGitCmd, "config", "--global", "http.cookiefile", pathToCookieFile); err != nil {
return fmt.Errorf("can't configure git cookiefile: %w", err) return fmt.Errorf("can't configure git cookiefile: %w", err)
} }
@ -1174,7 +1174,7 @@ func setupExtraGitConfigs(ctx context.Context, configsFlag string) error {
return fmt.Errorf("can't parse --git-config flag: %v", err) return fmt.Errorf("can't parse --git-config flag: %v", err)
} }
for _, kv := range configs { for _, kv := range configs {
if _, err := cmdRunner.Run(ctx, "", *flGitCmd, "config", "--global", kv.key, kv.val); err != nil { if _, err := cmdRunner.Run(ctx, "", nil, *flGitCmd, "config", "--global", kv.key, kv.val); err != nil {
return fmt.Errorf("error configuring additional git configs %q %q: %v", kv.key, kv.val, err) return fmt.Errorf("error configuring additional git configs %q %q: %v", kv.key, kv.val, err)
} }
} }

View File

@ -38,12 +38,12 @@ func NewRunner(logger *logging.Logger) *Runner {
} }
// Run runs given command // Run runs given command
func (c *Runner) Run(ctx context.Context, cwd, command string, args ...string) (string, error) { func (c *Runner) Run(ctx context.Context, cwd string, env []string, command string, args ...string) (string, error) {
return c.RunWithStdin(ctx, cwd, "", command, args...) return c.RunWithStdin(ctx, cwd, env, "", command, args...)
} }
// RunWithStdin runs given command with stardart input // RunWithStdin runs given command with stardart input
func (c *Runner) RunWithStdin(ctx context.Context, cwd, stdin, command string, args ...string) (string, error) { func (c *Runner) RunWithStdin(ctx context.Context, cwd string, env []string, stdin, command string, args ...string) (string, error) {
cmdStr := cmdForLog(command, args...) cmdStr := cmdForLog(command, args...)
c.logger.V(5).Info("running command", "cwd", cwd, "cmd", cmdStr) c.logger.V(5).Info("running command", "cwd", cwd, "cmd", cmdStr)
@ -51,6 +51,9 @@ func (c *Runner) RunWithStdin(ctx context.Context, cwd, stdin, command string, a
if cwd != "" { if cwd != "" {
cmd.Dir = cwd cmd.Dir = cwd
} }
if len(env) != 0 {
cmd.Env = env
}
outbuf := bytes.NewBuffer(nil) outbuf := bytes.NewBuffer(nil)
errbuf := bytes.NewBuffer(nil) errbuf := bytes.NewBuffer(nil)
cmd.Stdout = outbuf cmd.Stdout = outbuf

View File

@ -18,6 +18,7 @@ package hook
import ( import (
"context" "context"
"fmt"
"path/filepath" "path/filepath"
"time" "time"
@ -66,6 +67,10 @@ func (h *Exechook) Do(ctx context.Context, hash string) error {
worktreePath := filepath.Join(h.gitRoot, hash) worktreePath := filepath.Join(h.gitRoot, hash)
h.logger.V(0).Info("running exechook", "command", h.command, "timeout", h.timeout) h.logger.V(0).Info("running exechook", "command", h.command, "timeout", h.timeout)
_, err := h.cmdrunner.Run(ctx, worktreePath, h.command, h.args...) _, err := h.cmdrunner.Run(ctx, worktreePath, []string{envKV("GITSYNC_HASH", hash)}, h.command, h.args...)
return err return err
} }
func envKV(k, v string) string {
return fmt.Sprintf("%s=%s", k, v)
}

View File

@ -17,5 +17,9 @@
# Use for e2e test of --exechook-command. # Use for e2e test of --exechook-command.
# This option takes no command arguments, so requires a wrapper script. # This option takes no command arguments, so requires a wrapper script.
if [ -z "${GITSYNC_HASH}" ]; then
echo "GITSYNC_HASH is not set" > exechook
exit 1
fi
cat file > exechook cat file > exechook
cat ../link/file > link-exechook cat ../link/file > link-exechook