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
@ -439,26 +441,28 @@
// //
// Flags: // Flags:
// //
// -all // -all
// Show all the documentation for the package. // Show all the documentation for the package.
// -c // -c
// Respect case when matching symbols. // Respect case when matching symbols.
// -cmd // -cmd
// 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.
// -short // -http
// One-line representation for each symbol. // Serve HTML docs over HTTP.
// -src // -short
// Show the full source code for the symbol. This will // One-line representation for each symbol.
// display the full Go source of its declaration and // -src
// definition, such as a function definition (including // Show the full source code for the symbol. This will
// the body), type declaration or enclosing const // display the full Go source of its declaration and
// block. The output may therefore include unexported // definition, such as a function definition (including
// details. // the body), type declaration or enclosing const
// -u // block. The output may therefore include unexported
// Show documentation for unexported as well as exported // details.
// symbols, methods, and fields. // -u
// Show documentation for unexported as well as exported
// symbols, methods, and fields.
// //
// # Print Go environment information // # Print Go environment information
// //

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"