Commit ea89ce1e authored by Bryan C. Mills's avatar Bryan C. Mills

cmd/go/internal/modcmd: loosen path validation in "go mod edit"

Replaced modules require only valid import paths, not full
module paths that can be fetched with 'go get'.

The 'go' command does not in general reject manually-edited go.mod
files with these paths, so 'go mod edit' should not reject them
either.

Fixes #30513

Change-Id: I4f1a5c65937f91d41478f8d218c8018e0c70f320
Reviewed-on: https://go-review.googlesource.com/c/go/+/210343
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarJay Conrod <jayconrod@google.com>
parent 94ddb2d6
...@@ -164,7 +164,7 @@ func runEdit(cmd *base.Command, args []string) { ...@@ -164,7 +164,7 @@ func runEdit(cmd *base.Command, args []string) {
} }
if *editModule != "" { if *editModule != "" {
if err := module.CheckPath(*editModule); err != nil { if err := module.CheckImportPath(*editModule); err != nil {
base.Fatalf("go mod: invalid -module: %v", err) base.Fatalf("go mod: invalid -module: %v", err)
} }
} }
...@@ -242,7 +242,7 @@ func parsePathVersion(flag, arg string) (path, version string) { ...@@ -242,7 +242,7 @@ func parsePathVersion(flag, arg string) (path, version string) {
base.Fatalf("go mod: -%s=%s: need path@version", flag, arg) base.Fatalf("go mod: -%s=%s: need path@version", flag, arg)
} }
path, version = strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:]) path, version = strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:])
if err := module.CheckPath(path); err != nil { if err := module.CheckImportPath(path); err != nil {
base.Fatalf("go mod: -%s=%s: invalid path: %v", flag, arg, err) base.Fatalf("go mod: -%s=%s: invalid path: %v", flag, arg, err)
} }
...@@ -264,7 +264,7 @@ func parsePath(flag, arg string) (path string) { ...@@ -264,7 +264,7 @@ func parsePath(flag, arg string) (path string) {
base.Fatalf("go mod: -%s=%s: need just path, not path@version", flag, arg) base.Fatalf("go mod: -%s=%s: need just path, not path@version", flag, arg)
} }
path = arg path = arg
if err := module.CheckPath(path); err != nil { if err := module.CheckImportPath(path); err != nil {
base.Fatalf("go mod: -%s=%s: invalid path: %v", flag, arg, err) base.Fatalf("go mod: -%s=%s: invalid path: %v", flag, arg, err)
} }
return path return path
...@@ -278,7 +278,7 @@ func parsePathVersionOptional(adj, arg string, allowDirPath bool) (path, version ...@@ -278,7 +278,7 @@ func parsePathVersionOptional(adj, arg string, allowDirPath bool) (path, version
} else { } else {
path, version = strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:]) path, version = strings.TrimSpace(arg[:i]), strings.TrimSpace(arg[i+1:])
} }
if err := module.CheckPath(path); err != nil { if err := module.CheckImportPath(path); err != nil {
if !allowDirPath || !modfile.IsDirectoryPath(path) { if !allowDirPath || !modfile.IsDirectoryPath(path) {
return path, version, fmt.Errorf("invalid %s path: %v", adj, err) return path, version, fmt.Errorf("invalid %s path: %v", adj, err)
} }
......
...@@ -52,6 +52,12 @@ go mod init a.a/b/c ...@@ -52,6 +52,12 @@ go mod init a.a/b/c
go mod edit -module x.x/y/z go mod edit -module x.x/y/z
cmpenv go.mod go.mod.edit cmpenv go.mod go.mod.edit
# golang.org/issue/30513: don't require go-gettable module paths.
cd $WORK/local
go mod init foo
go mod edit -module local-only -require=other-local@v1.0.0 -replace other-local@v1.0.0=./other
cmpenv go.mod go.mod.edit
-- x.go -- -- x.go --
package x package x
...@@ -159,6 +165,14 @@ exclude x.1 v1.2.0 ...@@ -159,6 +165,14 @@ exclude x.1 v1.2.0
replace x.1 => y.1/v2 v2.3.6 replace x.1 => y.1/v2 v2.3.6
require x.3 v1.99.0 require x.3 v1.99.0
-- $WORK/local/go.mod.edit --
module local-only
go $goversion
require other-local v1.0.0
replace other-local v1.0.0 => ./other
-- $WORK/go.mod.badfmt -- -- $WORK/go.mod.badfmt --
module x.x/y/z module x.x/y/z
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment