cmd/doc: fix -http on Windows

On Windows, GOMODCACHE almost never starts with a slash, and
"go doc -http" constructs a GOPROXY URL by doing "file://" + GOMODCACHE,
resulting in an invalid file URI.

For example, if GOMODCACHE is "C:\foo", then the file URI should be
"file:///C:/foo", but it becomes "file://C:/foo" instead, where "C:" is
understood as a host name, not a drive letter.

Fixes #74137.

Change-Id: I23e776e0f649a0062e01d1a4a6ea8268ba467331
Reviewed-on: https://go-review.googlesource.com/c/go/+/684575
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Michael Matloob <matloob@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Reviewed-by: Michael Matloob <matloob@google.com>
This commit is contained in:
qmuntal 2025-06-27 12:45:22 +02:00 committed by Quim Muntal
parent b51f1cdb87
commit acb914f2c2
3 changed files with 38 additions and 22 deletions

View file

@ -405,6 +405,8 @@
// //
// go doc // go doc
// Show documentation for current package. // Show documentation for current package.
// go doc -http
// Serve HTML documentation over HTTP for the current package.
// go doc Foo // go doc Foo
// Show documentation for Foo in the current package. // Show documentation for Foo in the current package.
// (Foo starts with a capital letter so it cannot match // (Foo starts with a capital letter so it cannot match
@ -447,6 +449,8 @@
// Treat a command (package main) like a regular package. // Treat a command (package main) like a regular package.
// Otherwise package main's exported symbols are hidden // Otherwise package main's exported symbols are hidden
// when showing the package's top-level documentation. // when showing the package's top-level documentation.
// -http
// Serve HTML docs over HTTP.
// -short // -short
// One-line representation for each symbol. // One-line representation for each symbol.
// -src // -src

View file

@ -75,6 +75,8 @@ different cases. If this occurs, documentation for all matches is printed.
Examples: Examples:
go doc go doc
Show documentation for current package. Show documentation for current package.
go doc -http
Serve HTML documentation over HTTP for the current package.
go doc Foo go doc Foo
Show documentation for Foo in the current package. Show documentation for Foo in the current package.
(Foo starts with a capital letter so it cannot match (Foo starts with a capital letter so it cannot match
@ -116,6 +118,8 @@ Flags:
Treat a command (package main) like a regular package. Treat a command (package main) like a regular package.
Otherwise package main's exported symbols are hidden Otherwise package main's exported symbols are hidden
when showing the package's top-level documentation. when showing the package's top-level documentation.
-http
Serve HTML docs over HTTP.
-short -short
One-line representation for each symbol. One-line representation for each symbol.
-src -src

View file

@ -227,8 +227,16 @@ func doPkgsite(urlPath string) error {
fields := strings.Fields(vars) fields := strings.Fields(vars)
if err == nil && len(fields) == 2 { if err == nil && len(fields) == 2 {
goproxy, gomodcache := fields[0], fields[1] goproxy, gomodcache := fields[0], fields[1]
goproxy = "file://" + filepath.Join(gomodcache, "cache", "download") + "," + goproxy gomodcache = filepath.Join(gomodcache, "cache", "download")
env = append(env, "GOPROXY="+goproxy) // Convert absolute path to file URL. pkgsite will not accept
// Windows absolute paths because they look like a host:path remote.
// TODO(golang.org/issue/32456): use url.FromFilePath when implemented.
if strings.HasPrefix(gomodcache, "/") {
gomodcache = "file://" + gomodcache
} else {
gomodcache = "file:///" + filepath.ToSlash(gomodcache)
}
env = append(env, "GOPROXY="+gomodcache+","+goproxy)
} }
const version = "v0.0.0-20250608123103-82c52f1754cd" const version = "v0.0.0-20250608123103-82c52f1754cd"