aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Martí <mvdan@mvdan.cc>2020-02-27 16:19:06 +0000
committerDaniel Martí <mvdan@mvdan.cc>2020-02-28 09:29:22 +0000
commitb8f54e57c20368db5693b941fd6f79634b067cb0 (patch)
treecb989be05b576b5800573cd55c8e66bd9e51f3b1
parent18053b7131fff206b11c73bd1db3b024f4d0589e (diff)
downloadgo-b8f54e57c20368db5693b941fd6f79634b067cb0.tar.gz
go-b8f54e57c20368db5693b941fd6f79634b067cb0.zip
cmd/go: version command should error when given bad args
For example, 'go version -m' happily gives you Go's own version, even though the -m flag only makes sense when grabbing the version of a binary on disk. Similarly, if any of the directly named files can't be found, the tool would succeed. That's acceptable if an error is encountered while walking a large directory, but not when locating a path directly given by the user. These added test cases run even in short mode, as 'go build' is not needed for them. Change-Id: I7bb40b72853799e31d9f86cc5e999c8d57813eef Reviewed-on: https://go-review.googlesource.com/c/go/+/221397 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Bryan C. Mills <bcmills@google.com>
-rw-r--r--src/cmd/go/internal/version/version.go6
-rw-r--r--src/cmd/go/testdata/script/version.txt12
2 files changed, 18 insertions, 0 deletions
diff --git a/src/cmd/go/internal/version/version.go b/src/cmd/go/internal/version/version.go
index 857548c7ed..ac2ae50155 100644
--- a/src/cmd/go/internal/version/version.go
+++ b/src/cmd/go/internal/version/version.go
@@ -53,6 +53,11 @@ var (
func runVersion(cmd *base.Command, args []string) {
if len(args) == 0 {
+ if *versionM || *versionV {
+ fmt.Fprintf(os.Stderr, "go version: flags can only be used with arguments\n")
+ base.SetExitStatus(2)
+ return
+ }
fmt.Printf("go version %s %s/%s\n", runtime.Version(), runtime.GOOS, runtime.GOARCH)
return
}
@@ -61,6 +66,7 @@ func runVersion(cmd *base.Command, args []string) {
info, err := os.Stat(arg)
if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
+ base.SetExitStatus(1)
continue
}
if info.IsDir() {
diff --git a/src/cmd/go/testdata/script/version.txt b/src/cmd/go/testdata/script/version.txt
index 4eafe1f184..0ed1194840 100644
--- a/src/cmd/go/testdata/script/version.txt
+++ b/src/cmd/go/testdata/script/version.txt
@@ -1,4 +1,16 @@
+# Without arguments, we just print Go's own version.
+go version
+stdout '^go version'
+
+# Flags without files, or paths to misisng files, should error.
+! go version missing.exe
+! go version -m
+stderr 'with arguments'
+! go version -v
+stderr 'with arguments'
+
env GO111MODULE=on
+# Skip the builds below if we are running in short mode.
[short] skip
# Check that 'go version' and 'go version -m' work on a binary built in module mode.