diff options
author | Daniel Martí <mvdan@mvdan.cc> | 2020-02-27 16:19:06 +0000 |
---|---|---|
committer | Daniel Martí <mvdan@mvdan.cc> | 2020-02-28 09:29:22 +0000 |
commit | b8f54e57c20368db5693b941fd6f79634b067cb0 (patch) | |
tree | cb989be05b576b5800573cd55c8e66bd9e51f3b1 | |
parent | 18053b7131fff206b11c73bd1db3b024f4d0589e (diff) | |
download | go-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.go | 6 | ||||
-rw-r--r-- | src/cmd/go/testdata/script/version.txt | 12 |
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. |