diff --git a/acme/acmego/main.go b/acme/acmego/main.go index 95bd2a1b..314ec294 100644 --- a/acme/acmego/main.go +++ b/acme/acmego/main.go @@ -22,7 +22,6 @@ // // .rs - rustfmt // .py - yapf -// package main import ( @@ -33,6 +32,7 @@ import ( "log" "os" "os/exec" + "path/filepath" "strconv" "strings" "unicode/utf8" @@ -42,14 +42,38 @@ import ( var gofmt = flag.Bool("f", false, "format the entire file after Put") -var formatters = map[string][]string{ - ".go": []string{"goimports"}, +type formatter struct { + cmd []string + enabled func(string) bool +} + +func enabledAlways(string) bool { return true } + +var formatters = map[string]formatter{ + ".go": {[]string{"goimports"}, enabledAlways}, +} + +func findClangFormatFile(path string) bool { + for { + newpath := filepath.Clean(filepath.Join(path, "..")) + if path == newpath { + break + } + path = newpath + if fi, err := os.Stat(filepath.Join(path, ".clang-format")); err == nil { + return !fi.IsDir() + } + } + return false } // Non-Go formatters (only loaded with -f option). -var otherFormatters = map[string][]string{ - ".rs": []string{"rustfmt", "--emit", "stdout"}, - ".py": []string{"yapf"}, +var otherFormatters = map[string]formatter{ + ".py": {[]string{"yapf"}, enabledAlways}, + ".rs": {[]string{"rustfmt", "--emit", "stdout"}, enabledAlways}, + ".c": {[]string{"clang-format"}, findClangFormatFile}, + ".h": {[]string{"clang-format"}, findClangFormatFile}, + ".cpp": {[]string{"clang-format"}, findClangFormatFile}, } func main() { @@ -73,8 +97,8 @@ func main() { continue } for suffix, formatter := range formatters { - if strings.HasSuffix(event.Name, suffix) { - reformat(event.ID, event.Name, formatter) + if strings.HasSuffix(event.Name, suffix) && formatter.enabled(event.Name) { + reformat(event.ID, event.Name, formatter.cmd) break } }