1
0
mirror of https://github.com/golang/go synced 2024-11-18 11:24:41 -07:00
go/cmd/godoc
Dmitri Shuralyov f595fb5c96 cmd/godoc, godoc: implement build.Context.IsDir, update expected error string
Prior to this change, handlerServer.GetPageInfo created a build.Context
starting with build.Default, and provided custom implementations for
its IsAbsPath, ReadDir, and OpenFile funcs. Those funcs would operate
on h.c.fs virtual filesystem.

https://godoc.org/go/build#Context.IsDir is documented as:

	// IsDir reports whether the path names a directory.
	// If IsDir is nil, Import calls os.Stat and uses the result's IsDir method.
	IsDir func(path string) bool

IsDir was left as nil, and so the default implementation was used.
The default implementation uses os.Stat and isn't aware of the h.c.fs
virtual filesystem.

This appears to have been harmless in the past, but after the change to
go/build in https://golang.org/cl/33158, it started to interfere with
the operation of godoc. The command godoc began to fail to resolve
relative import path "." in directories that exist, because the
incorrect IsDir implementation was looking in real filesystem, rather
than the virtual one:

	$ ./godoc fmt
	2017/03/04 18:59:50 cannot find package "." in:
		/target
	$ ./godoc -http=localhost:6060
	2017/03/04 19:00:07 cannot find package "." in:
		/src/fmt

Providing a custom implementation of IsDir that is aware of the h.c.fs
virtual filesystem, and performs a stat operation on the correct path
there resolves that problem. It also fixes the failing tests.

Additionally, because the exact error string returned from
Context.Import has changed after https://golang.org/cl/33158,
and now contains the text "package not found" rather than the
underlying error text from filesystem caused by a failed ReadDir
operation, the expected error message from "./godoc nonexistingpkg"
in a test needed to be updated to "cannot find package". It's no longer
dependent on the operating system.

It might be desirable to provide more relevant detail in the error
message from cmd/godoc when a package is not found, but that should be
determined and done in a followup CL. The scope of this one is to fix
normal functionality.

This change follows update to go/build in https://golang.org/cl/33158.

Helps golang/go#19401.

Change-Id: I00e2f746ec4a2fe7e640218adce75f15bdf29aaf
Reviewed-on: https://go-review.googlesource.com/37768
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
2017-03-05 21:32:12 +00:00
..
appinit.go cmd/godoc: serve proxy paths without host enforcer 2015-09-23 05:23:18 +00:00
autocert.go cmd/godoc: optional ACME autocert support 2016-11-30 23:52:24 +00:00
blog.go go.tools: use golang.org/x/... import paths 2014-11-10 08:50:40 +11:00
codewalk.go go.tools: use golang.org/x/... import paths 2014-11-10 08:50:40 +11:00
dl.go godoc/{dl,proxy,short}: move packages out of Google's internal repo 2015-09-23 03:53:05 +00:00
doc.go cmd/godoc: Fix package comment inconsistencies. 2017-03-04 00:53:44 +00:00
godoc_test.go cmd/godoc, godoc: implement build.Context.IsDir, update expected error string 2017-03-05 21:32:12 +00:00
handlers.go cmd/godoc: set Strict-Transport-Security header in production 2016-05-02 17:22:30 +00:00
index.go cmd/godoc: exclude /pkg from search indexing 2015-03-12 00:26:38 +00:00
main.go x/tools/cmd/godoc: remove unused variable 2017-03-01 14:52:40 +00:00
play.go cmd/godoc: always serve fmt handler, HTTPS fix redirection 2015-09-25 02:10:07 +00:00
README.godoc-app go.tools: use golang.org/x/... import paths 2014-11-10 08:50:40 +11:00
remotesearch.go go.tools/cmd/godoc: update appinit.go to use new godoc packages 2013-07-30 14:23:23 +10:00
setup-godoc-app.bash cmd/godoc: make setup-godoc-app.bash more portable 2015-09-27 06:24:22 +00:00
x.go cmd/godoc: add perf subrepo 2016-12-20 20:09:41 +00:00

godoc on appengine
------------------

Prerequisites
-------------

* Go appengine SDK
  https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Go

* Go sources at tip under $GOROOT

* Godoc sources at tip inside $GOPATH
  (go get -d golang.org/x/tools/cmd/godoc)


Directory structure
-------------------

* Let $APPDIR be the directory containing the app engine files.
  (e.g., $APPDIR=$HOME/godoc-app)

* $APPDIR contains the following entries (this may change depending on
  app-engine release and version of godoc):

	app.yaml
	golang.org/x/tools/cmd/godoc
	godoc.zip
	index.split.*

* The app.yaml file is set up per app engine documentation.
  For instance:

	application: godoc-app
	version: 1
	runtime: go
	api_version: go1

	handlers:
	- url: /.*
	  script: _go_app


Configuring and running godoc
-----------------------------

To configure godoc, run

	bash setup-godoc-app.bash

to prepare an $APPDIR as described above. See the script for details on usage.

To run godoc locally, using the App Engine development server, run

	<path to go_appengine>/dev_appserver.py $APPDIR

godoc should come up at http://localhost:8080 .