]> Cypherpunks repositories - gostls13.git/commitdiff
godoc: app engine configuration and updated documentation
authorRobert Griesemer <gri@golang.org>
Wed, 27 Jul 2011 22:14:12 +0000 (15:14 -0700)
committerRobert Griesemer <gri@golang.org>
Wed, 27 Jul 2011 22:14:12 +0000 (15:14 -0700)
Also: Fixed an error message in zip.go.

R=r, dsymonds
CC=golang-dev
https://golang.org/cl/4816053

src/cmd/godoc/appconfig.go [new file with mode: 0644]
src/cmd/godoc/appinit.go [new file with mode: 0644]
src/cmd/godoc/doc.go
src/cmd/godoc/main.go
src/cmd/godoc/zip.go

diff --git a/src/cmd/godoc/appconfig.go b/src/cmd/godoc/appconfig.go
new file mode 100644 (file)
index 0000000..9cbe7a4
--- /dev/null
@@ -0,0 +1,19 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// This file contains configuration information used by
+// godoc when running on app engine. Adjust as needed
+// (typically when the .zip file changes).
+
+package main
+
+const (
+       // zipFilename is the name of the .zip file
+       // containing the file system served by godoc.
+       zipFilename = "go.zip"
+
+       // zipGoroot is the path of the goroot directory
+       // in the .zip file.
+       zipGoroot = "/home/username/go"
+)
diff --git a/src/cmd/godoc/appinit.go b/src/cmd/godoc/appinit.go
new file mode 100644 (file)
index 0000000..9b89872
--- /dev/null
@@ -0,0 +1,86 @@
+// Copyright 2011 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// To run godoc under app engine, substitute main.go with
+// this file (appinit.go), provide a .zip file containing
+// the file system to serve, and adjust the configuration
+// parameters in appconfig.go accordingly.
+//
+// The current app engine SDK may be based on an older Go
+// release version. To correct for version skew, copy newer
+// packages into the alt directory (e.g. alt/strings) and
+// adjust the imports in the godoc source files (e.g. from
+// `import "strings"` to `import "alt/strings"`). Both old
+// and new packages may be used simultaneously as long as
+// there is no package global state that needs to be shared.
+//
+// The directory structure should look as follows:
+//
+// godoc                       // directory containing the app engine app
+//      alt                    // alternative packages directory to
+//                             //      correct for version skew
+//             strings         // never version of the strings package
+//             ...             //
+//     app.yaml                // app engine control file
+//     go.zip                  // zip file containing the file system to serve
+//     godoc                   // contains godoc sources
+//             appinit.go      // this file instead of godoc/main.go
+//             appconfig.go    // godoc for app engine configuration
+//             ...             //
+//
+// To run app the engine emulator locally:
+//
+//     dev_appserver.py -a 0 godoc
+//
+// godoc is the top-level "goroot" directory.
+// The godoc home page is served at: <hostname>:8080 and localhost:8080.
+
+package main
+
+import (
+       "alt/archive/zip"
+       "http"
+       "log"
+       "os"
+)
+
+func serveError(w http.ResponseWriter, r *http.Request, relpath string, err os.Error) {
+       contents := applyTemplate(errorHTML, "errorHTML", err) // err may contain an absolute path!
+       w.WriteHeader(http.StatusNotFound)
+       servePage(w, "File "+relpath, "", "", contents)
+}
+
+func init() {
+       log.Println("initializing godoc ...")
+       *goroot = path.Join("/", zipGoroot) // fsHttp paths are relative to '/'
+
+       // read .zip file and set up file systems
+       const zipfile = zipFilename
+       rc, err := zip.OpenReader(zipfile)
+       if err != nil {
+               log.Fatalf("%s: %s\n", zipfile, err)
+       }
+       fs = NewZipFS(rc)
+       fsHttp = NewHttpZipFS(rc, *goroot)
+
+       // initialize http handlers
+       initHandlers()
+       readTemplates()
+       registerPublicHandlers(http.DefaultServeMux)
+
+       // initialize default directory tree with corresponding timestamp.
+       initFSTree()
+
+       // initialize directory trees for user-defined file systems (-path flag).
+       initDirTrees()
+
+       // create search index
+       // TODO(gri) Disabled for now as it takes too long. Find a solution for this.
+       /*
+               *indexEnabled = true
+               go indexer()
+       */
+
+       log.Println("godoc initialization complete")
+}
index a8fcd22d64ef119abb050ac9219c40793554fa29..dc98b0eca5c95b8fc9f3e23229cb3fff199401bd 100644 (file)
@@ -97,10 +97,9 @@ may be provided with the -filter flag; if it exists, only directories
 on those paths are considered. If -filter_minutes is set, the filter_file is
 updated regularly by walking the entire directory tree.
 
-When godoc runs as a web server, it creates a search index from all .go files
-under -goroot (excluding files starting with .). The index is created at startup
-and is automatically updated every time the -sync command terminates with exit
-status 0, indicating that files have changed.
+When godoc runs as a web server and -index is set, a search index is maintained.
+The index is created at startup and is automatically updated every time the
+-sync command terminates with exit status 0, indicating that files have changed.
 
 If the sync exit status is 1, godoc assumes that it succeeded without errors
 but that no files changed; the index is not updated in this case.
@@ -109,5 +108,23 @@ In all other cases, sync is assumed to have failed and godoc backs off running
 sync exponentially (up to 1 day). As soon as sync succeeds again (exit status 0
 or 1), the normal sync rhythm is re-established.
 
+The index contains both identifier and full text search information (searchable
+via regular expressions). The maximum number of full text search results shown
+can be set with the -maxresults flag; if set to 0, no full text results are
+shown, and only an identifier index but no full text search index is created.
+
+By default, godoc serves files from the file system of the underlying OS.
+Instead, a .zip file may be provided via the -zip flag, which contains
+the file system to serve. The file paths stored in the .zip file must use
+slash ('/') as path separator; and they must be unrooted. $GOROOT (or -goroot)
+must be set to the .zip file directory path containing the Go root directory.
+For instance, for a .zip file created by the command:
+
+       zip go.zip $HOME/go
+
+one may run godoc as follows:
+
+       godoc -http=:6060 -zip=go.zip -goroot=$HOME/go
+
 */
 package documentation
index 6f7d9d78dc7dc3fbeca6428a5ba988186ad29ae3..943c81cfb5a93e082692a7b28f04ddcc06b23d0f 100644 (file)
@@ -38,6 +38,7 @@ import (
        "io"
        "log"
        "os"
+       "path"
        "path/filepath"
        "regexp"
        "runtime"
@@ -228,23 +229,22 @@ func main() {
                log.Fatalf("negative tabwidth %d", *tabwidth)
        }
 
-       // Clean goroot: normalize path separator.
-       *goroot = filepath.Clean(*goroot)
-
        // Determine file system to use.
        // TODO(gri) - fs and fsHttp should really be the same. Try to unify.
        //           - fsHttp doesn't need to be set up in command-line mode,
        //             same is true for the http handlers in initHandlers.
        if *zipfile == "" {
                // use file system of underlying OS
+               *goroot = filepath.Clean(*goroot) // normalize path separator
                fs = OS
                fsHttp = http.Dir(*goroot)
        } else {
-               // use file system specified via .zip file
+               // use file system specified via .zip file (path separator must be '/')
                rc, err := zip.OpenReader(*zipfile)
                if err != nil {
                        log.Fatalf("%s: %s\n", *zipfile, err)
                }
+               *goroot = path.Join("/", *goroot) // fsHttp paths are relative to '/'
                fs = NewZipFS(rc)
                fsHttp = NewHttpZipFS(rc, *goroot)
        }
index 868aa1f02f02e938bf7d599f6350687647e79089..27dc142f54063262f4469a0dcd73d033e13cba7c 100644 (file)
@@ -83,7 +83,8 @@ func zipPath(name string) string {
 func (fs *zipFS) stat(abspath string) (int, zipFI, os.Error) {
        i, exact := fs.list.lookup(abspath)
        if i < 0 {
-               return -1, zipFI{}, fmt.Errorf("file not found: %s", abspath)
+               // abspath has leading '/' stripped - print it explicitly
+               return -1, zipFI{}, fmt.Errorf("file not found: /%s", abspath)
        }
        _, name := path.Split(abspath)
        var file *zip.File