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
// Show documentation for current package.
// go doc -http
// Serve HTML documentation over HTTP for the current package.
// go doc Foo
// Show documentation for Foo in the current package.
// (Foo starts with a capital letter so it cannot match
@ -439,26 +441,28 @@
//
// Flags:
//
// -all
// Show all the documentation for the package.
// -c
// Respect case when matching symbols.
// -cmd
// Treat a command (package main) like a regular package.
// Otherwise package main's exported symbols are hidden
// when showing the package's top-level documentation.
// -short
// One-line representation for each symbol.
// -src
// Show the full source code for the symbol. This will
// display the full Go source of its declaration and
// definition, such as a function definition (including
// the body), type declaration or enclosing const
// block. The output may therefore include unexported
// details.
// -u
// Show documentation for unexported as well as exported
// symbols, methods, and fields.
// -all
// Show all the documentation for the package.
// -c
// Respect case when matching symbols.
// -cmd
// Treat a command (package main) like a regular package.
// Otherwise package main's exported symbols are hidden
// when showing the package's top-level documentation.
// -http
// Serve HTML docs over HTTP.
// -short
// One-line representation for each symbol.
// -src
// Show the full source code for the symbol. This will
// display the full Go source of its declaration and
// definition, such as a function definition (including
// the body), type declaration or enclosing const
// block. The output may therefore include unexported
// details.
// -u
// Show documentation for unexported as well as exported
// symbols, methods, and fields.
//
// # Print Go environment information
//

View file

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

View file

@ -227,8 +227,16 @@ func doPkgsite(urlPath string) error {
fields := strings.Fields(vars)
if err == nil && len(fields) == 2 {
goproxy, gomodcache := fields[0], fields[1]
goproxy = "file://" + filepath.Join(gomodcache, "cache", "download") + "," + goproxy
env = append(env, "GOPROXY="+goproxy)
gomodcache = filepath.Join(gomodcache, "cache", "download")
// 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"