]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: support -modcacherw in 'go mod' subcommands
authorJay Conrod <jayconrod@google.com>
Tue, 22 Oct 2019 18:45:31 +0000 (14:45 -0400)
committerJay Conrod <jayconrod@google.com>
Tue, 22 Oct 2019 20:00:03 +0000 (20:00 +0000)
The -modcacherw flag is now registered in work.AddModCommonFlags,
which is called from work.AddBuildFlags, where it was registered
before. 'go mod' subcommands register the flag by calling
work.AddModCommonFlags directly.

Also, build commands now exit with an error if -modcacherw is set
explicitly (not in GOFLAGS) in GOPATH mode.

Updates #31481

Change-Id: I461e59a51ed31b006fff4d5c57c2a866be0bbf38
Reviewed-on: https://go-review.googlesource.com/c/go/+/202563
Run-TryBot: Jay Conrod <jayconrod@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
14 files changed:
src/cmd/go/internal/cfg/cfg.go
src/cmd/go/internal/get/get.go
src/cmd/go/internal/modcmd/download.go
src/cmd/go/internal/modcmd/edit.go
src/cmd/go/internal/modcmd/graph.go
src/cmd/go/internal/modcmd/init.go
src/cmd/go/internal/modcmd/tidy.go
src/cmd/go/internal/modcmd/vendor.go
src/cmd/go/internal/modcmd/verify.go
src/cmd/go/internal/modcmd/why.go
src/cmd/go/internal/modfetch/fetch.go
src/cmd/go/internal/work/build.go
src/cmd/go/internal/work/init.go
src/cmd/go/testdata/script/mod_cache_rw.txt

index ea909b5b37d5e0899a574f489af1efe88044ffcb..36b23488886a48a5b76e0d0659089b43abc39e03 100644 (file)
@@ -33,7 +33,6 @@ var (
        BuildN                 bool               // -n flag
        BuildO                 string             // -o flag
        BuildP                 = runtime.NumCPU() // -p flag
-       BuildModcacheRW        bool               // -modcacherw flag
        BuildPkgdir            string             // -pkgdir flag
        BuildRace              bool               // -race flag
        BuildToolexec          []string           // -toolexec flag
@@ -45,6 +44,8 @@ var (
        BuildWork              bool // -work flag
        BuildX                 bool // -x flag
 
+       ModCacheRW bool // -modcacherw flag
+
        CmdName string // "build", "install", "list", "mod tidy", etc.
 
        DebugActiongraph string // -debug-actiongraph flag (undocumented, unstable)
index 421f1bab7584a703a531d5a42426792dcf6b0bc6..500e3e0da6dd1621f610205f53108e605ff9dbb6 100644 (file)
@@ -108,7 +108,7 @@ var (
 )
 
 func init() {
-       work.AddBuildFlags(CmdGet, work.OmitModFlag)
+       work.AddBuildFlags(CmdGet, work.OmitModFlag|work.OmitModCommonFlags)
        CmdGet.Run = runGet // break init loop
        CmdGet.Flag.BoolVar(&Insecure, "insecure", Insecure, "")
 }
index 0d432e95490e1dc0bddc30155525a2f3a083c786..3a86d8ac063e385aea4048579392a8a6ed3d787d 100644 (file)
@@ -14,6 +14,7 @@ import (
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
        "cmd/go/internal/par"
+       "cmd/go/internal/work"
 )
 
 var cmdDownload = &base.Command{
@@ -53,6 +54,8 @@ var downloadJSON = cmdDownload.Flag.Bool("json", false, "")
 
 func init() {
        cmdDownload.Run = runDownload // break init cycle
+
+       work.AddModCommonFlags(cmdDownload)
 }
 
 type moduleJSON struct {
index 1be8b7cb2fbbdf41d1277c7d338ec6787ca65c55..239f88bdc2cbf5040133023164bafba6681655b2 100644 (file)
@@ -20,6 +20,7 @@ import (
        "cmd/go/internal/modfile"
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
+       "cmd/go/internal/work"
 )
 
 var cmdEdit = &base.Command{
@@ -130,6 +131,7 @@ func init() {
        cmdEdit.Flag.Var(flagFunc(flagReplace), "replace", "")
        cmdEdit.Flag.Var(flagFunc(flagDropExclude), "dropexclude", "")
 
+       work.AddModCommonFlags(cmdEdit)
        base.AddBuildFlagsNX(&cmdEdit.Flag)
 }
 
index 8fcb84f2801e658a7441e186b207a72d5c9685a6..5dbbf332fba84f1edf485c70ea376fbdd3e0a1ea 100644 (file)
@@ -16,6 +16,7 @@ import (
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
        "cmd/go/internal/par"
+       "cmd/go/internal/work"
 )
 
 var cmdGraph = &base.Command{
@@ -30,6 +31,10 @@ path@version, except for the main module, which has no @version suffix.
        Run: runGraph,
 }
 
+func init() {
+       work.AddModCommonFlags(cmdGraph)
+}
+
 func runGraph(cmd *base.Command, args []string) {
        if len(args) > 0 {
                base.Fatalf("go mod graph: graph takes no arguments")
index b94453bab0cf623208524f6c79c3e15c52515cdc..2858a46c4e2d2f009773b7caa15373ca88e9ed55 100644 (file)
@@ -9,6 +9,7 @@ package modcmd
 import (
        "cmd/go/internal/base"
        "cmd/go/internal/modload"
+       "cmd/go/internal/work"
        "os"
        "strings"
 )
@@ -27,6 +28,10 @@ To override this guess, supply the module path as an argument.
        Run: runInit,
 }
 
+func init() {
+       work.AddModCommonFlags(cmdInit)
+}
+
 func runInit(cmd *base.Command, args []string) {
        modload.CmdModInit = true
        if len(args) > 1 {
index 789e93660854f7b14756e69eb840f2820efbbc7d..1f5a18e05e8cf20d65d1167afdbe160ae424a07b 100644 (file)
@@ -15,6 +15,7 @@ import (
        "cmd/go/internal/modfetch"
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
+       "cmd/go/internal/work"
 )
 
 var cmdTidy = &base.Command{
@@ -35,6 +36,7 @@ to standard error.
 func init() {
        cmdTidy.Run = runTidy // break init cycle
        cmdTidy.Flag.BoolVar(&cfg.BuildV, "v", false, "")
+       work.AddModCommonFlags(cmdTidy)
 }
 
 func runTidy(cmd *base.Command, args []string) {
index bb1cecdbf55c3da402ea8be2c50b864862942fb7..71246b2f6893eaa927b871f5ab2a6e9c089e2094 100644 (file)
@@ -20,6 +20,7 @@ import (
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
        "cmd/go/internal/semver"
+       "cmd/go/internal/work"
 )
 
 var cmdVendor = &base.Command{
@@ -38,6 +39,7 @@ modules and packages to standard error.
 
 func init() {
        cmdVendor.Flag.BoolVar(&cfg.BuildV, "v", false, "")
+       work.AddModCommonFlags(cmdVendor)
 }
 
 func runVendor(cmd *base.Command, args []string) {
index 81fc44dc97ae609cffc8e43b56ddaa1d9435f9e4..9155fcb358044802e6b263be105dcb0707395ef5 100644 (file)
@@ -16,6 +16,7 @@ import (
        "cmd/go/internal/modfetch"
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
+       "cmd/go/internal/work"
 )
 
 var cmdVerify = &base.Command{
@@ -32,6 +33,10 @@ non-zero status.
        Run: runVerify,
 }
 
+func init() {
+       work.AddModCommonFlags(cmdVerify)
+}
+
 func runVerify(cmd *base.Command, args []string) {
        if len(args) != 0 {
                // NOTE(rsc): Could take a module pattern.
index 03e0a039bc5014d796a894b69fe9fcf4b0b6deea..93d64dcb59f116127c351961f4ce7fcf93bf5033 100644 (file)
@@ -8,6 +8,7 @@ import (
        "cmd/go/internal/base"
        "cmd/go/internal/modload"
        "cmd/go/internal/module"
+       "cmd/go/internal/work"
        "fmt"
        "strings"
 )
@@ -54,6 +55,7 @@ var (
 
 func init() {
        cmdWhy.Run = runWhy // break init cycle
+       work.AddModCommonFlags(cmdWhy)
 }
 
 func runWhy(cmd *base.Command, args []string) {
index 438c6212b5d692a0b66862aad238669ecc6e7f8c..7d20f66041a66ca85b4758d71da3c9031bebb20f 100644 (file)
@@ -125,7 +125,7 @@ func download(mod module.Version, dir string) (err error) {
                return err
        }
 
-       if !cfg.BuildModcacheRW {
+       if !cfg.ModCacheRW {
                // Make dir read-only only *after* renaming it.
                // os.Rename was observed to fail for read-only directories on macOS.
                makeDirsReadOnly(dir)
index 9b74963f43bb86bd896bc1d5f7fecd6dffbd67c2..d2b4bd3c65f7663469c03e6316856b0243013c54 100644 (file)
@@ -224,9 +224,10 @@ type BuildFlagMask int
 const (
        DefaultBuildFlags BuildFlagMask = 0
        OmitModFlag       BuildFlagMask = 1 << iota
+       OmitModCommonFlags
 )
 
-// addBuildFlags adds the flags common to the build, clean, get,
+// AddBuildFlags adds the flags common to the build, clean, get,
 // install, list, run, and test commands.
 func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) {
        cmd.Flag.BoolVar(&cfg.BuildA, "a", false, "")
@@ -243,10 +244,12 @@ func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) {
        if mask&OmitModFlag == 0 {
                cmd.Flag.StringVar(&cfg.BuildMod, "mod", "", "")
        }
+       if mask&OmitModCommonFlags == 0 {
+               AddModCommonFlags(cmd)
+       }
        cmd.Flag.StringVar(&cfg.BuildContext.InstallSuffix, "installsuffix", "", "")
        cmd.Flag.Var(&load.BuildLdflags, "ldflags", "")
        cmd.Flag.BoolVar(&cfg.BuildLinkshared, "linkshared", false, "")
-       cmd.Flag.BoolVar(&cfg.BuildModcacheRW, "modcacherw", false, "")
        cmd.Flag.StringVar(&cfg.BuildPkgdir, "pkgdir", "", "")
        cmd.Flag.BoolVar(&cfg.BuildRace, "race", false, "")
        cmd.Flag.BoolVar(&cfg.BuildMSan, "msan", false, "")
@@ -259,6 +262,12 @@ func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) {
        cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "")
 }
 
+// AddModCommonFlags adds the module-related flags common to build commands
+// and 'go mod' subcommands.
+func AddModCommonFlags(cmd *base.Command) {
+       cmd.Flag.BoolVar(&cfg.ModCacheRW, "modcacherw", false, "")
+}
+
 // tagsFlag is the implementation of the -tags flag.
 type tagsFlag []string
 
index f3055b62937b539e1921e8245eb80e3eff860e24..2f9fde4cb879f1ff204a3830d462b39a09d240d8 100644 (file)
@@ -248,12 +248,17 @@ func buildModeInit() {
        case "":
                // ok
        case "readonly", "vendor", "mod":
-               if load.ModLookup == nil && !inGOFLAGS("-mod") {
+               if !cfg.ModulesEnabled && !inGOFLAGS("-mod") {
                        base.Fatalf("build flag -mod=%s only valid when using modules", cfg.BuildMod)
                }
        default:
                base.Fatalf("-mod=%s not supported (can be '', 'mod', 'readonly', or 'vendor')", cfg.BuildMod)
        }
+       if !cfg.ModulesEnabled {
+               if cfg.ModCacheRW && !inGOFLAGS("-modcacherw") {
+                       base.Fatalf("build flag -modcacherw only valid when using modules")
+               }
+       }
 }
 
 func inGOFLAGS(flag string) bool {
index 9c19494214ec204747488bb06d6c33098a48755a..b4a3a456e8d6e30ab82b73ba0688460e315e1070 100644 (file)
@@ -33,6 +33,16 @@ go get -d rsc.io/quote@latest
 [!windows] [!root] ! cp $WORK/extraneous.txt $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/extraneous_file.go
 ! exists $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/extraneous_file.go
 
+
+# Repeat part of the test with 'go mod download' instead of 'go get' to verify
+# -modcacherw is supported on 'go mod' subcommands.
+go clean -modcache
+go mod download -modcacherw rsc.io/quote
+cp $WORK/extraneous.txt $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/extraneous_file.go
+! go mod verify
+[!root] ! cp $WORK/extraneous.txt $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/go.mod
+
+
 -- $WORK/extraneous.txt --
 module oops
 -- go.mod --