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  }