mirror of
https://github.com/golang/go
synced 2024-09-29 05:14:29 -06:00
cmd/go: improve handling of os.DevNull on Windows
The "go test" and "go build" commands have special-case behavior when passed "-o /dev/null". These checks are case-sensitive and assume that os.DevNull is an absolute path. Windows filesystems are case-insensitive and os.DevNull is NUL, which is not an absolute path. CL 145220 changed filepath.IsAbs to report "NUL" as absolute to work around this issue; that change is being rolled back and a better fix here is to compare the value of -o against os.DevNull before attempting to merge it with a base path. Make that fix. On Windows, accept any capitilization of "NUL" as the null device. This change doesn't cover every possible name for the null device, such as "-o //./NUL", but this test is for efficiency rather than correctness. Accepting just the most common name is fine. For #56217. Change-Id: I60b59b671789fc456074d3c8bc755a74ea8d5765 Reviewed-on: https://go-review.googlesource.com/c/go/+/449117 TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Damien Neil <dneil@google.com> Reviewed-by: Bryan Mills <bcmills@google.com>
This commit is contained in:
parent
0521a12401
commit
575964d42c
@ -7,6 +7,7 @@ package base
|
|||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"runtime"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
)
|
)
|
||||||
@ -54,3 +55,17 @@ func IsTestFile(file string) bool {
|
|||||||
// We don't cover tests, only the code they test.
|
// We don't cover tests, only the code they test.
|
||||||
return strings.HasSuffix(file, "_test.go")
|
return strings.HasSuffix(file, "_test.go")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IsNull reports whether the path is a common name for the null device.
|
||||||
|
// It returns true for /dev/null on Unix, or NUL (case-insensitive) on Windows.
|
||||||
|
func IsNull(path string) bool {
|
||||||
|
if path == os.DevNull {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if runtime.GOOS == "windows" {
|
||||||
|
if strings.EqualFold(path, "NUL") {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
@ -1010,13 +1010,16 @@ func builderTest(b *work.Builder, ctx context.Context, pkgOpts load.PackageOpts,
|
|||||||
if testC || testNeedBinary() {
|
if testC || testNeedBinary() {
|
||||||
// -c or profiling flag: create action to copy binary to ./test.out.
|
// -c or profiling flag: create action to copy binary to ./test.out.
|
||||||
target := filepath.Join(base.Cwd(), testBinary+cfg.ExeSuffix)
|
target := filepath.Join(base.Cwd(), testBinary+cfg.ExeSuffix)
|
||||||
|
isNull := false
|
||||||
if testO != "" {
|
if testO != "" {
|
||||||
target = testO
|
target = testO
|
||||||
if !filepath.IsAbs(target) {
|
if base.IsNull(target) {
|
||||||
|
isNull = true
|
||||||
|
} else if !filepath.IsAbs(target) {
|
||||||
target = filepath.Join(base.Cwd(), target)
|
target = filepath.Join(base.Cwd(), target)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if target == os.DevNull {
|
if isNull {
|
||||||
runAction = buildAction
|
runAction = buildAction
|
||||||
} else {
|
} else {
|
||||||
pmain.Target = target
|
pmain.Target = target
|
||||||
|
@ -482,7 +482,7 @@ func runBuild(ctx context.Context, cmd *base.Command, args []string) {
|
|||||||
pkgs = omitTestOnly(pkgsFilter(pkgs))
|
pkgs = omitTestOnly(pkgsFilter(pkgs))
|
||||||
|
|
||||||
// Special case -o /dev/null by not writing at all.
|
// Special case -o /dev/null by not writing at all.
|
||||||
if cfg.BuildO == os.DevNull {
|
if base.IsNull(cfg.BuildO) {
|
||||||
cfg.BuildO = ""
|
cfg.BuildO = ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user