From 80e7832733fd245181af3394077f2df21303a4aa Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 23 Apr 2019 12:19:57 -0400 Subject: [PATCH] cmd/go: change -tags to a comma-separated list Using commas makes it possible to put multiple tags into GOFLAGS. The space-separated form is still recognized and will be maintained. Alleviates #26849 somewhat. Fixes #18800 (again). Change-Id: I6f4cf28ea31e53e21ccbdad6ef1a0aee63b007d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/173438 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Brad Fitzpatrick Reviewed-by: Ian Cottrell --- src/cmd/go/alldocs.go | 6 ++-- src/cmd/go/go_test.go | 2 +- src/cmd/go/internal/work/build.go | 31 +++++++++++++++++-- src/cmd/go/testdata/script/mod_build_tags.txt | 3 ++ 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/cmd/go/alldocs.go b/src/cmd/go/alldocs.go index 6e4d77d5f6efe4..650a81ddff7a70 100644 --- a/src/cmd/go/alldocs.go +++ b/src/cmd/go/alldocs.go @@ -151,10 +151,12 @@ // install and load all packages from dir instead of the usual locations. // For example, when building with a non-standard configuration, // use -pkgdir to keep generated packages in a separate location. -// -tags 'tag list' -// a space-separated list of build tags to consider satisfied during the +// -tags tag,list +// a comma-separated list of build tags to consider satisfied during the // build. For more information about build tags, see the description of // build constraints in the documentation for the go/build package. +// (Earlier versions of Go used a space-separated list, and that form +// is deprecated but still recognized.) // -trimpath // remove all file system paths from the resulting executable. // Instead of absolute file system paths, the recorded file names diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 5ec02d8e493d9a..337dfd7ca850d0 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -4644,7 +4644,7 @@ func TestBuildTagsNoComma(t *testing.T) { tg.makeTempdir() tg.setenv("GOPATH", tg.path("go")) tg.run("build", "-tags", "tag1 tag2", "math") - tg.runFail("build", "-tags", "tag1,tag2", "math") + tg.runFail("build", "-tags", "tag1,tag2 tag3", "math") tg.grepBoth("space-separated list contains comma", "-tags with a comma-separated list didn't error") } diff --git a/src/cmd/go/internal/work/build.go b/src/cmd/go/internal/work/build.go index 355c1477f5d0bb..9c03f0818de37c 100644 --- a/src/cmd/go/internal/work/build.go +++ b/src/cmd/go/internal/work/build.go @@ -104,10 +104,12 @@ and test commands: install and load all packages from dir instead of the usual locations. For example, when building with a non-standard configuration, use -pkgdir to keep generated packages in a separate location. - -tags 'tag list' - a space-separated list of build tags to consider satisfied during the + -tags tag,list + a comma-separated list of build tags to consider satisfied during the build. For more information about build tags, see the description of build constraints in the documentation for the go/build package. + (Earlier versions of Go used a space-separated list, and that form + is deprecated but still recognized.) -trimpath remove all file system paths from the resulting executable. Instead of absolute file system paths, the recorded file names @@ -233,7 +235,7 @@ func AddBuildFlags(cmd *base.Command) { cmd.Flag.StringVar(&cfg.BuildPkgdir, "pkgdir", "", "") cmd.Flag.BoolVar(&cfg.BuildRace, "race", false, "") cmd.Flag.BoolVar(&cfg.BuildMSan, "msan", false, "") - cmd.Flag.Var((*base.StringsFlag)(&cfg.BuildContext.BuildTags), "tags", "") + cmd.Flag.Var((*tagsFlag)(&cfg.BuildContext.BuildTags), "tags", "") cmd.Flag.Var((*base.StringsFlag)(&cfg.BuildToolexec), "toolexec", "") cmd.Flag.BoolVar(&cfg.BuildTrimpath, "trimpath", false, "") cmd.Flag.BoolVar(&cfg.BuildWork, "work", false, "") @@ -242,6 +244,29 @@ func AddBuildFlags(cmd *base.Command) { cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "") } +// tagsFlag is the implementation of the -tags flag. +type tagsFlag []string + +func (v *tagsFlag) Set(s string) error { + // For compatibility with Go 1.12 and earlier, allow "-tags='a b c'" or even just "-tags='a'". + if strings.Contains(s, " ") || strings.Contains(s, "'") { + return (*base.StringsFlag)(v).Set(s) + } + + // Split on commas, ignore empty strings. + *v = []string{} + for _, s := range strings.Split(s, ",") { + if s != "" { + *v = append(*v, s) + } + } + return nil +} + +func (v *tagsFlag) String() string { + return "" +} + // fileExtSplit expects a filename and returns the name // and ext (without the dot). If the file has no // extension, ext will be empty. diff --git a/src/cmd/go/testdata/script/mod_build_tags.txt b/src/cmd/go/testdata/script/mod_build_tags.txt index 1347eaacbf78a9..ae1d605e1f2f12 100644 --- a/src/cmd/go/testdata/script/mod_build_tags.txt +++ b/src/cmd/go/testdata/script/mod_build_tags.txt @@ -16,6 +16,9 @@ stdout '\[y\.go\]' go list -f {{.GoFiles}} -tags 'tag1 tag2' stdout '\[x\.go y\.go\]' +go list -f {{.GoFiles}} -tags tag1,tag2 # commas allowed as of Go 1.13 +stdout '\[x\.go y\.go\]' + -- x/go.mod -- module x