From cc02d59e84b60b3221e6c079afe04d3b7e59b872 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Thu, 29 Apr 2021 22:54:26 +0100 Subject: [PATCH] cmd/gofmt: always format non-directory arguments again MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit golang.org/cl/284138 introduced a regression: running "gofmt foo" would silently ignore the file due to its lack of a ".go" extension, whereas the tool is documented otherwise: Given a file, it operates on that file; given a directory, it operates on all .go files in that directory, recursively. This wasn't caught as there were no tests for these edge cases. gofmt's own tests are regular Go tests, so it's hard to test it properly without adding an abstraction layer on top of func main. Luckily, this kind of test is a great fit for cmd/go's own script tests, and it just takes a few straightforward lines. Finally, add the relevant logic back, with documentation to clarify its intentional purpose. Fixes #45859. Change-Id: Ic5bf5937b8f95fcdad2b6933227c8b504ef38a82 Reviewed-on: https://go-review.googlesource.com/c/go/+/315270 Run-TryBot: Daniel Martí Trust: Daniel Martí Trust: Robert Griesemer Trust: Bryan C. Mills TryBot-Result: Go Bot Reviewed-by: Robert Griesemer Reviewed-by: Bryan C. Mills --- src/cmd/go/testdata/script/fmt_load_errors.txt | 13 +++++++++++++ src/cmd/gofmt/gofmt.go | 13 ++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/cmd/go/testdata/script/fmt_load_errors.txt b/src/cmd/go/testdata/script/fmt_load_errors.txt index 297ec0fe3c..84bf41cfba 100644 --- a/src/cmd/go/testdata/script/fmt_load_errors.txt +++ b/src/cmd/go/testdata/script/fmt_load_errors.txt @@ -6,6 +6,17 @@ go fmt -n exclude stdout 'exclude[/\\]x\.go' stdout 'exclude[/\\]x_linux\.go' +# Test edge cases with gofmt. +# Note that this execs GOROOT/bin/gofmt. + +! exec gofmt does-not-exist + +exec gofmt gofmt-dir/no-extension +stdout 'package x' + +exec gofmt gofmt-dir +! stdout 'package x' + -- exclude/empty/x.txt -- -- exclude/ignore/_x.go -- package x @@ -17,3 +28,5 @@ package x // +build windows package x +-- gofmt-dir/no-extension -- +package x diff --git a/src/cmd/gofmt/gofmt.go b/src/cmd/gofmt/gofmt.go index fef86c941f..b3c120daab 100644 --- a/src/cmd/gofmt/gofmt.go +++ b/src/cmd/gofmt/gofmt.go @@ -214,8 +214,19 @@ func gofmtMain() { } for _, arg := range args { - if err := filepath.WalkDir(arg, visitFile); err != nil { + switch info, err := os.Stat(arg); { + case err != nil: report(err) + case !info.IsDir(): + // Non-directory arguments are always formatted. + if err := processFile(arg, nil, os.Stdout, false); err != nil { + report(err) + } + default: + // Directories are walked, ignoring non-Go files. + if err := filepath.WalkDir(arg, visitFile); err != nil { + report(err) + } } } } -- 2.50.0