]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/gofmt: always format non-directory arguments again
authorDaniel Martí <mvdan@mvdan.cc>
Thu, 29 Apr 2021 21:54:26 +0000 (22:54 +0100)
committerDaniel Martí <mvdan@mvdan.cc>
Fri, 30 Apr 2021 16:17:01 +0000 (16:17 +0000)
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í <mvdan@mvdan.cc>
Trust: Daniel Martí <mvdan@mvdan.cc>
Trust: Robert Griesemer <gri@golang.org>
Trust: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/testdata/script/fmt_load_errors.txt
src/cmd/gofmt/gofmt.go

index 297ec0fe3c7c28d533065de426e99e229388f54b..84bf41cfbafacd175597b77c26b9525e8f4c6e03 100644 (file)
@@ -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
index fef86c941fd6a388a43cfe132b530f6f50336f14..b3c120daab42c41c824c91f6bd901b3eeda25a0c 100644 (file)
@@ -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)
+                       }
                }
        }
 }