diff --git a/git/commits.go b/git/commits.go index 8ae5790..6eb6f95 100644 --- a/git/commits.go +++ b/git/commits.go @@ -57,17 +57,21 @@ var FieldNames = map[string]string{ "%G?": "verification_flag", } +// Check warns if changes introduce whitespace errors. +// Returns non-zero if any issues are found. +func Check(commit string) ([]byte, error) { + cmd := exec.Command("git", "show", "--check", commit) + cmd.Stderr = os.Stderr + return cmd.Output() +} + // Show returns the diff of a commit. // // NOTE: This could be expensive for very large commits. func Show(commit string) ([]byte, error) { cmd := exec.Command("git", "show", commit) cmd.Stderr = os.Stderr - out, err := cmd.Output() - if err != nil { - return nil, err - } - return out, nil + return cmd.Output() } // CommitEntry represents a single commit's information from `git`. diff --git a/rules/danglingwhitespace/rule.go b/rules/danglingwhitespace/rule.go index d55ddb5..122c746 100644 --- a/rules/danglingwhitespace/rule.go +++ b/rules/danglingwhitespace/rule.go @@ -1,9 +1,6 @@ package danglingwhitespace import ( - "bytes" - "fmt" - "github.com/vbatts/git-validation/git" "github.com/vbatts/git-validation/validate" ) @@ -23,27 +20,18 @@ func init() { } func ValidateDanglingWhitespace(c git.CommitEntry) (vr validate.Result) { - diff, err := git.Show(c["commit"]) - if err != nil { - return validate.Result{Pass: false, Msg: err.Error(), CommitEntry: c} - } - vr.CommitEntry = c + vr.Msg = "commit does not have any whitespace errors" vr.Pass = true - for _, line := range bytes.Split(diff, newLine) { - if !bytes.HasPrefix(line, diffAddLine) || bytes.Equal(line, diffAddLine) { - continue - } - if len(bytes.TrimSpace(line)) != len(line) { - vr.Pass = false - vr.Msg = fmt.Sprintf("line %q has trailiing spaces", string(line)) + + _, err := git.Check(c["commit"]) + if err != nil { + vr.Pass = false + if err.Error() == "exit status 2" { + vr.Msg = "has whitespace errors. See `git show --check " + c["commit"] + "`." + } else { + vr.Msg = "errored with: " + err.Error() } } - vr.Msg = "all added diff lines do not have trailing spaces" return } - -var ( - newLine = []byte("\n") - diffAddLine = []byte("+ ") -)