git-gohooks/general/gochanges.go
Ingo Oeser d81ea3f35c filepath love
* use filepath to get correct result of file path operation on every OS.
 * use filepath.Walk to get a better idea what is being done here
 * simpler way to get the basename of a program; also works on Windows
2015-08-22 23:45:53 +02:00

62 lines
1.5 KiB
Go

package general
import (
"bytes"
"log"
"os/exec"
"path/filepath"
"strings"
"syscall"
)
// RunCommand is a simple wrapper to run commands
// result is the output of stdout and errCode is the exit code
func RunCommand(command string, values ...string) (result string, errCode int) {
cmd := exec.Command(command, values...)
var out bytes.Buffer
var outErr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &outErr
if err := cmd.Start(); err != nil {
log.Fatalf("cmd.Start: %v", err)
}
if err := cmd.Wait(); err != nil {
if exiterr, ok := err.(*exec.ExitError); ok {
if status, okStatus := exiterr.Sys().(syscall.WaitStatus); okStatus {
errCode = status.ExitStatus()
result = outErr.String()
return result, errCode
}
} else {
log.Fatalf("cmd.Wait: %v", err)
return result, errCode
}
}
result = out.String()
return result, errCode
}
// GetChangedGoFiles returns a list of changed .go files
// anything else is filtered out
func GetChangedGoFiles() (result []string) {
gitDiff, _ := RunCommand("git", "diff", "--name-only", "--cached", "--diff-filter=ACM")
absolutePath := GetGitRoot()
resultLines := strings.Split(gitDiff, "\n")
for _, filename := range resultLines {
if strings.HasSuffix(filename, ".go") {
result = append(result, filepath.Join(absolutePath, filename))
}
}
return result
}
// GetGitRoot returns the path with the .git directory
func GetGitRoot() string {
gitDir, _ := RunCommand("git", "rev-parse", "--git-dir")
return filepath.Dir(gitDir)
}