From b8f54e57c20368db5693b941fd6f79634b067cb0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Daniel=20Mart=C3=AD?= Date: Thu, 27 Feb 2020 16:19:06 +0000 Subject: [PATCH] cmd/go: version command should error when given bad args MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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í TryBot-Result: Gobot Gobot Reviewed-by: Bryan C. Mills --- src/cmd/go/internal/version/version.go | 6 ++++++ src/cmd/go/testdata/script/version.txt | 12 ++++++++++++ 2 files changed, 18 insertions(+) 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. -- 2.50.0