github.com/willabides/benchdiff@v0.9.1/cmd/benchdiff/internal/gitrunner.go (about) 1 package internal 2 3 import ( 4 "bytes" 5 "fmt" 6 "log" 7 "os" 8 "os/exec" 9 ) 10 11 func runGitCmd(debug *log.Logger, gitCmd, repoPath string, args ...string) ([]byte, error) { 12 var stdout bytes.Buffer 13 cmd := exec.Command(gitCmd, args...) 14 cmd.Stdout = &stdout 15 cmd.Dir = repoPath 16 err := runCmd(cmd, debug) 17 return bytes.TrimSpace(stdout.Bytes()), err 18 } 19 20 func runAtGitRef(debug *log.Logger, gitCmd, repoPath, ref string, fn func(path string)) error { 21 worktree, err := os.MkdirTemp("", "benchdiff") 22 if err != nil { 23 return err 24 } 25 defer func() { 26 rErr := os.RemoveAll(worktree) 27 if rErr != nil { 28 fmt.Printf("Could not delete temp directory: %s\n", worktree) 29 } 30 }() 31 32 _, err = runGitCmd(debug, gitCmd, repoPath, "worktree", "add", "--quiet", "--detach", worktree, ref) 33 if err != nil { 34 return err 35 } 36 37 defer func() { 38 _, cerr := runGitCmd(debug, gitCmd, repoPath, "worktree", "remove", worktree) 39 if cerr != nil { 40 if exitErr, ok := cerr.(*exec.ExitError); ok { 41 fmt.Println(string(exitErr.Stderr)) 42 } 43 fmt.Println(cerr) 44 } 45 }() 46 fn(worktree) 47 return nil 48 }