From 2dbf5794f6fc00efca05a3c0e67b38000c8dda71 Mon Sep 17 00:00:00 2001 From: Chris Broadfoot Date: Tue, 4 Sep 2018 09:55:45 -0700 Subject: [PATCH] [release-branch.go1.11] godoc: migrate to App Engine flexible See bug for more details on exactly what was migrated. Notably: * No more Google-internal deployment scripts; see README.godoc-app and the Makefile for details. * Build tag "golangorg" is used for the godoc configuration used for golang.org. * Use of App Engine libraries replaced with GCP client libraries. * Redis is used to replace App Engine memcache. * Google analytics is controlled by an environment variable. * Regression tests have been migrated from Google-internal. * hg -> git hash map is moved from Google-internal. Updates golang/go#28893 Updates golang/go#27205 Change-Id: Ia0a983f239c50eda8be2363494c8b784f60c2c6d Reviewed-on: https://go-review.googlesource.com/133355 Reviewed-by: Brad Fitzpatrick Reviewed-on: https://go-review.googlesource.com/c/150599 --- cmd/godoc/Dockerfile.prod | 42 ++++++++ cmd/godoc/Makefile | 24 +++++ cmd/godoc/README.godoc-app | 67 ++++++++++-- cmd/godoc/app.prod.yaml | 30 +++--- cmd/godoc/appinit.go | 62 ++++++++++-- cmd/godoc/dl.go | 2 +- cmd/godoc/generate-index.bash | 14 +-- cmd/godoc/handlers.go | 5 +- cmd/godoc/hg-git-mapping.bin | Bin 0 -> 189416 bytes cmd/godoc/main.go | 2 +- cmd/godoc/play.go | 2 +- cmd/godoc/regtest.bash | 110 ++++++++++++++++++++ cmd/godoc/remotesearch.go | 2 +- godoc/appengine.go | 13 --- godoc/dl/dl.go | 121 +++++++++++----------- godoc/dl/dl_test.go | 2 - godoc/dl/tmpl.go | 2 - godoc/env/env.go | 41 ++++++++ godoc/page.go | 25 +++-- godoc/pres.go | 4 + godoc/proxy/proxy.go | 57 ++++++----- godoc/short/short.go | 79 ++++++++------- godoc/short/tmpl.go | 2 - godoc/static/godoc.html | 22 ++++ godoc/static/static.go | 2 +- internal/memcache/memcache.go | 157 +++++++++++++++++++++++++++++ internal/memcache/memcache_test.go | 83 +++++++++++++++ 27 files changed, 779 insertions(+), 193 deletions(-) create mode 100644 cmd/godoc/Dockerfile.prod create mode 100644 cmd/godoc/Makefile create mode 100644 cmd/godoc/hg-git-mapping.bin create mode 100755 cmd/godoc/regtest.bash delete mode 100644 godoc/appengine.go create mode 100644 godoc/env/env.go create mode 100644 internal/memcache/memcache.go create mode 100644 internal/memcache/memcache_test.go diff --git a/cmd/godoc/Dockerfile.prod b/cmd/godoc/Dockerfile.prod new file mode 100644 index 00000000..21fb92d8 --- /dev/null +++ b/cmd/godoc/Dockerfile.prod @@ -0,0 +1,42 @@ +# Builder +######### + +FROM golang:1.11 AS build + +RUN apt-get update && apt-get install -y \ + zip # required for generate-index.bash + +ENV GODOC_REF release-branch.go1.11 + +RUN go get -v -d \ + golang.org/x/net/context \ + google.golang.org/appengine \ + cloud.google.com/go/datastore \ + golang.org/x/build \ + github.com/gomodule/redigo/redis + +COPY . /go/src/golang.org/x/tools + +WORKDIR /go/src/golang.org/x/tools/cmd/godoc +RUN git clone --single-branch --depth=1 -b $GODOC_REF https://go.googlesource.com/go /docset +RUN GODOC_DOCSET=/docset ./generate-index.bash + +RUN go build -o /godoc -tags=golangorg golang.org/x/tools/cmd/godoc + + +# Final image +############# + +FROM gcr.io/distroless/base + +WORKDIR /app +COPY --from=build /godoc /app/ +COPY --from=build /go/src/golang.org/x/tools/cmd/godoc/hg-git-mapping.bin /app/ + +COPY --from=build /docset /goroot +ENV GOROOT /goroot + +COPY --from=build /go/src/golang.org/x/tools/cmd/godoc/index.split.* /app/ +ENV GODOC_INDEX_GLOB index.split.* + +CMD ["/app/godoc"] diff --git a/cmd/godoc/Makefile b/cmd/godoc/Makefile new file mode 100644 index 00000000..217515bb --- /dev/null +++ b/cmd/godoc/Makefile @@ -0,0 +1,24 @@ +# Copyright 2018 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. + +.PHONY: usage + +usage: + echo "See Makefile" + exit 1 + +docker-prod: Dockerfile.prod + cd ../..; docker build -f cmd/godoc/Dockerfile.prod --tag=gcr.io/golang-org/godoc:$(VERSION) . + +push-prod: docker-prod + docker push gcr.io/golang-org/godoc:$(VERSION) + +deploy-prod: push-prod + gcloud -q app deploy app.prod.yaml --project golang-org --no-promote --image-url gcr.io/golang-org/godoc:$(VERSION) + +get-latest-url: + @gcloud app versions list -s default --project golang-org --sort-by=~version.createTime --format='value(version.versionUrl)' --limit 1 | cut -f1 + +regtest: + ./regtest.bash $(shell make get-latest-url) diff --git a/cmd/godoc/README.godoc-app b/cmd/godoc/README.godoc-app index 94abf0cd..0bb81120 100644 --- a/cmd/godoc/README.godoc-app +++ b/cmd/godoc/README.godoc-app @@ -7,31 +7,78 @@ Prerequisites * Google Cloud SDK https://cloud.google.com/sdk/ +* Redis + * Go sources under $GOROOT * Godoc sources inside $GOPATH (go get -d golang.org/x/tools/cmd/godoc) -Running in dev_appserver.py ---------------------------- +Running locally, in production mode +----------------------------------- -Use dev_appserver.py to run the server in development mode: +Build the app: - dev_appserver.py app.dev.yaml + go build -tags golangorg -To run the server with generated zip file and search index: +Run the app: - ./generate-index.bash - dev_appserver.py app.prod.yaml + ./godoc godoc should come up at http://localhost:8080 -Use the --host and --port flags to listen on a different address. -To clean up the index files, use git: +Use the PORT environment variable to change the port: - git clean -xn # n is dry run, replace with f + PORT=8081 ./godoc +Running locally, in production mode, using Docker +------------------------------------------------- + +Build the app's Docker container: + + VERSION=$(git rev-parse HEAD) make docker-prod + +Make sure redis is running on port 6379: + + $ echo PING | nc localhost 6379 + +PONG + ^C + +Run the datastore emulator: + + gcloud beta emulators datastore start --project golang-org + +In another terminal window, run the container: + + $(gcloud beta emulators datastore env-init) + + docker run --rm \ + --net host \ + --env GODOC_REDIS_ADDR=localhost:6379 \ + --env DATASTORE_EMULATOR_HOST=$DATASTORE_EMULATOR_HOST \ + --env DATASTORE_PROJECT_ID=$DATASTORE_PROJECT_ID \ + gcr.io/golang-org/godoc + +godoc should come up at http://localhost:8080 + + +Deploying to golang.org +----------------------- + +Build the image, push it to gcr.io, and deploy to Flex: + + VERSION=$(git rev-parse HEAD) make deploy-prod + +Run regression tests: + + make regtest + +Go to the console to migrate traffic to the newly deployed version: + + https://console.cloud.google.com/appengine/versions?project=golang-org&serviceId=default&versionssize=50 + +Shut down any very old versions (keep at least one to roll back to, just in case). Troubleshooting --------------- diff --git a/cmd/godoc/app.prod.yaml b/cmd/godoc/app.prod.yaml index 6a18a647..832db097 100644 --- a/cmd/godoc/app.prod.yaml +++ b/cmd/godoc/app.prod.yaml @@ -1,18 +1,16 @@ -runtime: go -api_version: go1 -instance_class: F4_1G - -handlers: -- url: /s - script: _go_app - login: admin -- url: /dl/init - script: _go_app - login: admin -- url: /.* - script: _go_app +runtime: custom +env: flex env_variables: - GODOC_ZIP: godoc.zip - GODOC_ZIP_PREFIX: goroot - GODOC_INDEX_GLOB: 'index.split.*' + GODOC_PROD: true + # GODOC_ENFORCE_HOSTS: true # TODO(cbro): modify host filter to allow version-specific URLs (see issue 27205). + GODOC_REDIS_ADDR: 10.0.0.4:6379 # instance "gophercache" + GODOC_ANALYTICS: UA-11222381-2 + DATASTORE_PROJECT_ID: golang-org + +network: + name: golang + +resources: + cpu: 4 + memory_gb: 7.50 diff --git a/cmd/godoc/appinit.go b/cmd/godoc/appinit.go index eb1d9483..293ad52a 100644 --- a/cmd/godoc/appinit.go +++ b/cmd/godoc/appinit.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build appengine +// +build golangorg package main @@ -11,16 +11,20 @@ package main import ( "archive/zip" + "context" + "io" "log" "net/http" "os" "path" "regexp" "runtime" + "strings" "golang.org/x/tools/godoc" "golang.org/x/tools/godoc/dl" "golang.org/x/tools/godoc/proxy" + "golang.org/x/tools/godoc/redirect" "golang.org/x/tools/godoc/short" "golang.org/x/tools/godoc/static" "golang.org/x/tools/godoc/vfs" @@ -28,10 +32,13 @@ import ( "golang.org/x/tools/godoc/vfs/mapfs" "golang.org/x/tools/godoc/vfs/zipfs" - "google.golang.org/appengine" + "cloud.google.com/go/datastore" + "golang.org/x/tools/internal/memcache" ) -func init() { +func main() { + log.SetFlags(log.Lshortfile | log.LstdFlags) + var ( // .zip filename zipFilename = os.Getenv("GODOC_ZIP") @@ -44,7 +51,6 @@ func init() { indexFilenames = os.Getenv("GODOC_INDEX_GLOB") ) - enforceHosts = !appengine.IsDevAppServer() playEnabled = true log.Println("initializing godoc ...") @@ -85,17 +91,61 @@ func init() { pres.ShowExamples = true pres.DeclLinks = true pres.NotesRx = regexp.MustCompile("BUG") + pres.GoogleAnalytics = os.Getenv("GODOC_ANALYTICS") readTemplates(pres, true) + datastoreClient, memcacheClient := getClients() + + // NOTE(cbro): registerHandlers registers itself against DefaultServeMux. + // The mux returned has host enforcement, so it's important to register + // against this mux and not DefaultServeMux. mux := registerHandlers(pres) - dl.RegisterHandlers(mux) - short.RegisterHandlers(mux) + dl.RegisterHandlers(mux, datastoreClient, memcacheClient) + short.RegisterHandlers(mux, datastoreClient, memcacheClient) // Register /compile and /share handlers against the default serve mux // so that other app modules can make plain HTTP requests to those // hosts. (For reasons, HTTPS communication between modules is broken.) proxy.RegisterHandlers(http.DefaultServeMux) + http.HandleFunc("/_ah/health", func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "ok") + }) + + http.HandleFunc("/robots.txt", func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "User-agent: *\nDisallow: /search\n") + }) + + if err := redirect.LoadChangeMap("hg-git-mapping.bin"); err != nil { + log.Fatalf("LoadChangeMap: %v", err) + } + log.Println("godoc initialization complete") + + // TODO(cbro): add instrumentation via opencensus. + port := "8080" + if p := os.Getenv("PORT"); p != "" { // PORT is set by GAE flex. + port = p + } + log.Fatal(http.ListenAndServe(":"+port, nil)) +} + +func getClients() (*datastore.Client, *memcache.Client) { + ctx := context.Background() + + datastoreClient, err := datastore.NewClient(ctx, "") + if err != nil { + if strings.Contains(err.Error(), "missing project") { + log.Fatalf("Missing datastore project. Set the DATASTORE_PROJECT_ID env variable. Use `gcloud beta emulators datastore` to start a local datastore.") + } + log.Fatalf("datastore.NewClient: %v.", err) + } + + redisAddr := os.Getenv("GODOC_REDIS_ADDR") + if redisAddr == "" { + log.Fatalf("Missing redis server for godoc in production mode. set GODOC_REDIS_ADDR environment variable.") + } + memcacheClient := memcache.New(redisAddr) + return datastoreClient, memcacheClient } diff --git a/cmd/godoc/dl.go b/cmd/godoc/dl.go index 40e66584..edeecb8a 100644 --- a/cmd/godoc/dl.go +++ b/cmd/godoc/dl.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !appengine +// +build !golangorg package main diff --git a/cmd/godoc/generate-index.bash b/cmd/godoc/generate-index.bash index 38ac79ae..21b567a9 100755 --- a/cmd/godoc/generate-index.bash +++ b/cmd/godoc/generate-index.bash @@ -25,24 +25,24 @@ install() { } getArgs() { - if [ ! -v GOROOT ]; then - GOROOT="$(go env GOROOT)" - echo "GOROOT not set explicitly, using go env value instead" + if [ ! -v GODOC_DOCSET ]; then + GODOC_DOCSET="$(go env GOROOT)" + echo "GODOC_DOCSET not set explicitly, using GOROOT instead" fi # safety checks - if [ ! -d "$GOROOT" ]; then - error "$GOROOT is not a directory" + if [ ! -d "$GODOC_DOCSET" ]; then + error "$GODOC_DOCSET is not a directory" fi # reporting - echo "GOROOT = $GOROOT" + echo "GODOC_DOCSET = $GODOC_DOCSET" } makeZipfile() { echo "*** make $ZIPFILE" rm -f $ZIPFILE goroot - ln -s "$GOROOT" goroot + ln -s "$GODOC_DOCSET" goroot zip -q -r $ZIPFILE goroot/* # glob to ignore dotfiles (like .git) rm goroot } diff --git a/cmd/godoc/handlers.go b/cmd/godoc/handlers.go index a8447b37..4152a3ee 100644 --- a/cmd/godoc/handlers.go +++ b/cmd/godoc/handlers.go @@ -21,6 +21,7 @@ import ( "text/template" "golang.org/x/tools/godoc" + "golang.org/x/tools/godoc/env" "golang.org/x/tools/godoc/redirect" "golang.org/x/tools/godoc/vfs" ) @@ -30,8 +31,6 @@ var ( fs = vfs.NameSpace{} ) -var enforceHosts = false // set true in production on app engine - // hostEnforcerHandler redirects requests to "http://foo.golang.org/bar" // to "https://golang.org/bar". // It permits requests to the host "godoc-test.golang.org" for testing and @@ -41,7 +40,7 @@ type hostEnforcerHandler struct { } func (h hostEnforcerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if !enforceHosts { + if !env.EnforceHosts() { h.h.ServeHTTP(w, r) return } diff --git a/cmd/godoc/hg-git-mapping.bin b/cmd/godoc/hg-git-mapping.bin new file mode 100644 index 0000000000000000000000000000000000000000..3f6ca77bd4d0373a0bbc70f69350ae287f94c797 GIT binary patch literal 189416 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ℑ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 z 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

ggPlc9I&)calYOu75b$J_npnRv~d%6f2t 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

gOBrFXPSLO3vpnu`uJt}BAhMk zDA_Vngo_4F=$f`a!GQz4-_FTB#evY^=MT)D;^Gm1ZFfBZ&WJcsM8*hk+7;gym50i3 zroCpR!@hES)Rt9!)$chjQoCwiG+K%C!b|9Px4yz@gX+DzR2y)H@-rL1Y0@4#)WqpGQ7jT;6f9wLX+KhoV%=6DP+kHoS&hpt$Fwt&htAN zJ|G##nJdWA$UPG{kbYP2Y3XmA!Mj?i`s_C@2wRcgyY~;y?zgqA^7(@U$4YK5vYW;w z^VDy6=|VU+^S|CUPY4$+QjSJk2%JV6w0`t*jzfD|3W8+_N$!P)-T%oD^djfCDTeb1 zv5(4)DPRF1Qry^3z>p`n`|SUjMlK@wdyK-f$`=zX&YaF<(Ncn0mlj@TFgGptBKXuq zp9)d5RA2o>HeYTAE^5FGj9Vw81- zfHW2+gvDPa_}ZmOr-p73g7{?MtnO{1cj(NZt8oq?x*N039>^tx`SuL)>pX&6dAgwr zzfZ7b7Y4Ko^9kNy0sUjeBZ8%C8h=plF(GKW<*hVbLD1)CE9vP!Cj{TV@gALcNpPoc z;&;BjBsddE)>j_X5W>%Qrd^`n5S`h+Ex@a{1hX{XY6J5l(R4y&==Hpv;GIf-__(Ko zpxqwNbYIs^0AD!CjhVd!^KiLeWaR+C2`(0{9UCG9ExnTW^S={9zeg(daz6->FY-_! zeUgyKRn=fD2~n-MrH2{>33l=P%FTOWg5J6RbU`CZaNm`OshZ#fZ&#*QhyzK`XPq~~ zK2jtXv>V)|FHO=dDTM3o5kbNsiw= z=_19YBpq(C*J@NGIr%z2ivKE-`mL|8d#qL=nX2JpH9a+wW#_&vvv&o_9(adG_N$XX zLH1kUznUcLPhbIg>KUew(aEM-OttB6nMbo)F{PTWNbE)_~Y&afpJp{4I;s68a@yJWU!l@}=%tzdqhJU|K# zZS--lXOqCdmhMVNHYwh!I8$@~Fe#MTQujwbaBh8MasPvJekPK%q}|`d zL^8=ay4+Mt=Pb!R^tY+f;VdcK(lQ=BnN2eNzTetZ&Lf#pAJ!g=ze6&+^mZcqa!9dI z$=P~I9?ACzbW#lBlj#!!(&SSUk7zJm|Aw@;plNS{%ld zlBF1dpXC+}%2Tu^D?_I&fRZRkxsT=nl<=;vgS@38rQas+mUmK>;%<4ZwcSdC5-A>4 zN}tlAID;cCHlr&kz6SHPV+fs+ATbU{k<}FQlyki4jx|&~{^0P|Ij>Td$v9y0SC?Yg zxW2Qxy`G|38B>6^o+sjFOtD*8v-#{f_OF+gOqo!O+MU(w>P;#7 zs|yih56mcn<98Bd}pj@wSZuW%GaJ2*ZiOpT$q zsZT8Ia_1;}X4e_BIEqhTHf1IMQHuT;513CE3uXB=R{!(SKG67u%&#d~YqE-g_4*{!AcnQ^KP-iGwE| z{kcJj3sB@~yZt3~}Qp%jB)*0M{b6faH5hh)E^*lRkUBDZTPp={24+QK&! zzwu5VguJ2B5|zfIIYNrlIHY5uUQfLonT)?PQ%^D8=%gu?3beIz4mF<6Z1)(H%*3VV_Q7W_VeOQz+K}mE~mC" + +set -e + +addr="$(echo $1 | sed -e 's/\/$//')" +if [ -z "$addr" ]; then + echo "usage: $0 " 1>&2 + echo "example: $0 https://20180928t023837-dot-golang-org.appspot.com/" 1>&2 + exit 1 +fi + +set -u + +# fetch url, check the response with a regexp. +fetch() { + curl -s "${addr}$1" | grep "$2" > /dev/null +} +fatal() { + log "$1" + exit 1 +} +log() { + echo "$1" 1>&2 +} +logn() { + echo -n "$1" 1>&2 +} + +log "Checking FAQ..." +fetch /doc/faq 'What is the purpose of the project' || { + fatal "FAQ did not match." +} + +log "Checking package listing..." +fetch /pkg/ 'Package tar' || { + fatal "package listing page did not match." +} + +log "Checking os package..." +fetch /pkg/os/ 'func Open' || { + fatal "os package page did not match." +} + +log "Checking robots.txt..." +fetch /robots.txt 'Disallow: /search' || { + fatal "robots.txt did not match." +} + +log "Checking /change/ redirect..." +fetch /change/75944e2e3a63 'bdb10cf' || { + fatal "/change/ direct did not match." +} + +log "Checking /dl/ page has data..." +fetch /dl/ 'go1.11.windows-amd64.msi' || { + fatal "/dl/ did not match." +} + +log "Checking /dl/?mode=json page has data..." +fetch /dl/?mode=json 'go1.11.windows-amd64.msi' || { + fatal "/dl/?mode=json did not match." +} + +log "Checking shortlinks (/s/go2design)..." +fetch /s/go2design 'proposal.*Found' || { + fatal "/s/go2design did not match." +} + +log "Checking analytics on pages..." +ga_id="UA-11222381-2" +fetch / $ga_id || fatal "/ missing GA." +fetch /dl/ $ga_id || fatal "/dl/ missing GA." +fetch /project/ $ga_id || fatal "/project missing GA." +fetch /pkg/context/ $ga_id || fatal "/pkg/context missing GA." + +log "Checking search..." +fetch /search?q=IsDir 'src/os/types.go' || { + fatal "search result did not match." +} + +log "Checking compile service..." +compile="curl -s ${addr}/compile" + +p="package main; func main() { print(6*7); }" +$compile --data-urlencode "body=$p" | tee /tmp/compile.out | grep '^{"compile_errors":"","output":"42"}$' > /dev/null || { + cat /tmp/compile.out + fatal "compile service output did not match." +} + +$compile --data-urlencode "body=//empty" | tee /tmp/compile.out | grep "expected 'package', found 'EOF'" > /dev/null || { + cat /tmp/compile.out + fatal "compile service error output did not match." +} + +# Check API version 2 +d="version=2&body=package+main%3Bimport+(%22fmt%22%3B%22time%22)%3Bfunc+main()%7Bfmt.Print(%22A%22)%3Btime.Sleep(time.Second)%3Bfmt.Print(%22B%22)%7D" +$compile --data "$d" | grep '^{"Errors":"","Events":\[{"Message":"A","Kind":"stdout","Delay":0},{"Message":"B","Kind":"stdout","Delay":1000000000}\]}$' > /dev/null || { + fatal "compile service v2 output did not match." +} + +log "All OK" diff --git a/cmd/godoc/remotesearch.go b/cmd/godoc/remotesearch.go index f01d5c7a..6f27d0b3 100644 --- a/cmd/godoc/remotesearch.go +++ b/cmd/godoc/remotesearch.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build !appengine +// +build !golangorg package main diff --git a/godoc/appengine.go b/godoc/appengine.go deleted file mode 100644 index fe5e6875..00000000 --- a/godoc/appengine.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2015 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. - -// +build appengine - -package godoc - -import "google.golang.org/appengine" - -func init() { - onAppengine = !appengine.IsDevAppServer() -} diff --git a/godoc/dl/dl.go b/godoc/dl/dl.go index 83bb21ec..edc09aa3 100644 --- a/godoc/dl/dl.go +++ b/godoc/dl/dl.go @@ -2,8 +2,6 @@ // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. -// +build appengine - // Package dl implements a simple downloads frontend server. // // It accepts HTTP POST requests to create a new download metadata entity, and @@ -19,6 +17,7 @@ import ( "html" "html/template" "io" + "log" "net/http" "regexp" "sort" @@ -27,11 +26,10 @@ import ( "sync" "time" + "cloud.google.com/go/datastore" "golang.org/x/net/context" - "google.golang.org/appengine" - "google.golang.org/appengine/datastore" - "google.golang.org/appengine/log" - "google.golang.org/appengine/memcache" + "golang.org/x/tools/godoc/env" + "golang.org/x/tools/internal/memcache" ) const ( @@ -40,11 +38,21 @@ const ( cacheDuration = time.Hour ) -func RegisterHandlers(mux *http.ServeMux) { - mux.HandleFunc("/dl", getHandler) - mux.HandleFunc("/dl/", getHandler) // also serves listHandler - mux.HandleFunc("/dl/upload", uploadHandler) - mux.HandleFunc("/dl/init", initHandler) +type server struct { + datastore *datastore.Client + memcache *memcache.CodecClient +} + +func RegisterHandlers(mux *http.ServeMux, dc *datastore.Client, mc *memcache.Client) { + s := server{dc, mc.WithCodec(memcache.Gob)} + mux.HandleFunc("/dl", s.getHandler) + mux.HandleFunc("/dl/", s.getHandler) // also serves listHandler + mux.HandleFunc("/dl/upload", s.uploadHandler) + + // NOTE(cbro): this only needs to be run once per project, + // and should be behind an admin login. + // TODO(cbro): move into a locally-run program? or remove? + // mux.HandleFunc("/dl/init", initHandler) } // File represents a file on the golang.org downloads page. @@ -191,26 +199,25 @@ var ( templateFuncs = template.FuncMap{"pretty": pretty} ) -func listHandler(w http.ResponseWriter, r *http.Request) { +func (h server) listHandler(w http.ResponseWriter, r *http.Request) { if r.Method != "GET" { http.Error(w, "method not allowed", http.StatusMethodNotAllowed) return } - var ( - c = appengine.NewContext(r) - d listTemplateData - ) - if _, err := memcache.Gob.Get(c, cacheKey, &d); err != nil { - if err == memcache.ErrCacheMiss { - log.Debugf(c, "cache miss") - } else { - log.Errorf(c, "cache get error: %v", err) + ctx := r.Context() + var d listTemplateData + + if err := h.memcache.Get(ctx, cacheKey, &d); err != nil { + if err != memcache.ErrCacheMiss { + log.Printf("ERROR cache get error: %v", err) + // NOTE(cbro): continue to hit datastore if the memcache is down. } var fs []File - _, err := datastore.NewQuery("File").Ancestor(rootKey(c)).GetAll(c, &fs) - if err != nil { - log.Errorf(c, "error listing: %v", err) + q := datastore.NewQuery("File").Ancestor(rootKey) + if _, err := h.datastore.GetAll(ctx, q, &fs); err != nil { + log.Printf("ERROR error listing: %v", err) + http.Error(w, "Could not get download page. Try again in a few minutes.", 500) return } d.Stable, d.Unstable, d.Archive = filesToReleases(fs) @@ -219,8 +226,8 @@ func listHandler(w http.ResponseWriter, r *http.Request) { } item := &memcache.Item{Key: cacheKey, Object: &d, Expiration: cacheDuration} - if err := memcache.Gob.Set(c, item); err != nil { - log.Errorf(c, "cache set error: %v", err) + if err := h.memcache.Set(ctx, item); err != nil { + log.Printf("ERROR cache set error: %v", err) } } @@ -229,13 +236,13 @@ func listHandler(w http.ResponseWriter, r *http.Request) { enc := json.NewEncoder(w) enc.SetIndent("", " ") if err := enc.Encode(d.Stable); err != nil { - log.Errorf(c, "failed rendering JSON for releases: %v", err) + log.Printf("ERROR rendering JSON for releases: %v", err) } return } if err := listTemplate.ExecuteTemplate(w, "root", d); err != nil { - log.Errorf(c, "error executing template: %v", err) + log.Printf("ERROR executing template: %v", err) } } @@ -383,12 +390,12 @@ func parseVersion(v string) (maj, min int, tail string) { return } -func uploadHandler(w http.ResponseWriter, r *http.Request) { +func (h server) uploadHandler(w http.ResponseWriter, r *http.Request) { if r.Method != "POST" { http.Error(w, "method not allowed", http.StatusMethodNotAllowed) return } - c := appengine.NewContext(r) + ctx := r.Context() // Authenticate using a user token (same as gomote). user := r.FormValue("user") @@ -396,7 +403,7 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) { http.Error(w, "bad user", http.StatusForbidden) return } - if r.FormValue("key") != userKey(c, user) { + if r.FormValue("key") != h.userKey(ctx, user) { http.Error(w, "bad key", http.StatusForbidden) return } @@ -404,7 +411,7 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) { var f File defer r.Body.Close() if err := json.NewDecoder(r.Body).Decode(&f); err != nil { - log.Errorf(c, "error decoding upload JSON: %v", err) + log.Printf("ERROR decoding upload JSON: %v", err) http.Error(w, "Something broke", http.StatusInternalServerError) return } @@ -415,19 +422,19 @@ func uploadHandler(w http.ResponseWriter, r *http.Request) { if f.Uploaded.IsZero() { f.Uploaded = time.Now() } - k := datastore.NewKey(c, "File", f.Filename, 0, rootKey(c)) - if _, err := datastore.Put(c, k, &f); err != nil { - log.Errorf(c, "putting File entity: %v", err) + k := datastore.NameKey("File", f.Filename, rootKey) + if _, err := h.datastore.Put(ctx, k, &f); err != nil { + log.Printf("ERROR File entity: %v", err) http.Error(w, "could not put File entity", http.StatusInternalServerError) return } - if err := memcache.Delete(c, cacheKey); err != nil { - log.Errorf(c, "cache delete error: %v", err) + if err := h.memcache.Delete(ctx, cacheKey); err != nil { + log.Printf("ERROR delete error: %v", err) } io.WriteString(w, "OK") } -func getHandler(w http.ResponseWriter, r *http.Request) { +func (h server) getHandler(w http.ResponseWriter, r *http.Request) { // For go get golang.org/dl/go1.x.y, we need to serve the // same meta tags at /dl for cmd/go to validate against /dl/go1.x.y: if r.URL.Path == "/dl" && (r.Method == "GET" || r.Method == "HEAD") && r.FormValue("go-get") == "1" { @@ -444,7 +451,7 @@ func getHandler(w http.ResponseWriter, r *http.Request) { name := strings.TrimPrefix(r.URL.Path, "/dl/") if name == "" { - listHandler(w, r) + h.listHandler(w, r) return } if fileRe.MatchString(name) { @@ -486,10 +493,10 @@ func validUser(user string) bool { return false } -func userKey(c context.Context, user string) string { - h := hmac.New(md5.New, []byte(secret(c))) - h.Write([]byte("user-" + user)) - return fmt.Sprintf("%x", h.Sum(nil)) +func (h server) userKey(c context.Context, user string) string { + hash := hmac.New(md5.New, []byte(h.secret(c))) + hash.Write([]byte("user-" + user)) + return fmt.Sprintf("%x", hash.Sum(nil)) } var ( @@ -497,18 +504,18 @@ var ( goGetRe = regexp.MustCompile(`^go[0-9a-z.]+\.[0-9a-z.-]+$`) ) -func initHandler(w http.ResponseWriter, r *http.Request) { +func (h server) initHandler(w http.ResponseWriter, r *http.Request) { var fileRoot struct { Root string } - c := appengine.NewContext(r) - k := rootKey(c) - err := datastore.RunInTransaction(c, func(c context.Context) error { - err := datastore.Get(c, k, &fileRoot) + ctx := r.Context() + k := rootKey + _, err := h.datastore.RunInTransaction(ctx, func(tx *datastore.Transaction) error { + err := tx.Get(k, &fileRoot) if err != nil && err != datastore.ErrNoSuchEntity { return err } - _, err = datastore.Put(c, k, &fileRoot) + _, err = tx.Put(k, &fileRoot) return err }, nil) if err != nil { @@ -519,9 +526,7 @@ func initHandler(w http.ResponseWriter, r *http.Request) { } // rootKey is the ancestor of all File entities. -func rootKey(c context.Context) *datastore.Key { - return datastore.NewKey(c, "FileRoot", "root", 0, nil) -} +var rootKey = datastore.NameKey("FileRoot", "root", nil) // pretty returns a human-readable version of the given OS, Arch, or Kind. func pretty(s string) string { @@ -559,11 +564,11 @@ type builderKey struct { Secret string } -func (k *builderKey) Key(c context.Context) *datastore.Key { - return datastore.NewKey(c, "BuilderKey", "root", 0, nil) +func (k *builderKey) Key() *datastore.Key { + return datastore.NameKey("BuilderKey", "root", nil) } -func secret(c context.Context) string { +func (h server) secret(ctx context.Context) string { // check with rlock theKey.RLock() k := theKey.Secret @@ -580,18 +585,18 @@ func secret(c context.Context) string { } // fill - if err := datastore.Get(c, theKey.Key(c), &theKey.builderKey); err != nil { + if err := h.datastore.Get(ctx, theKey.Key(), &theKey.builderKey); err != nil { if err == datastore.ErrNoSuchEntity { // If the key is not stored in datastore, write it. // This only happens at the beginning of a new deployment. // The code is left here for SDK use and in case a fresh // deployment is ever needed. "gophers rule" is not the // real key. - if !appengine.IsDevAppServer() { + if env.IsProd() { panic("lost key from datastore") } theKey.Secret = "gophers rule" - datastore.Put(c, theKey.Key(c), &theKey.builderKey) + h.datastore.Put(ctx, theKey.Key(), &theKey.builderKey) return theKey.Secret } panic("cannot load builder key: " + err.Error()) diff --git a/godoc/dl/dl_test.go b/godoc/dl/dl_test.go index 3f61fe9e..2cdc1aa9 100644 --- a/godoc/dl/dl_test.go +++ b/godoc/dl/dl_test.go @@ -2,8 +2,6 @@ // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. -// +build appengine - package dl import ( diff --git a/godoc/dl/tmpl.go b/godoc/dl/tmpl.go index 47ef9f49..d086b696 100644 --- a/godoc/dl/tmpl.go +++ b/godoc/dl/tmpl.go @@ -2,8 +2,6 @@ // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. -// +build appengine - package dl // TODO(adg): refactor this to use the tools/godoc/static template. diff --git a/godoc/env/env.go b/godoc/env/env.go new file mode 100644 index 00000000..e1f55cd3 --- /dev/null +++ b/godoc/env/env.go @@ -0,0 +1,41 @@ +// Copyright 2018 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. + +// Package env provides environment information for the godoc server running on +// golang.org. +package env + +import ( + "log" + "os" + "strconv" +) + +var ( + isProd = boolEnv("GODOC_PROD") + enforceHosts = boolEnv("GODOC_ENFORCE_HOSTS") +) + +// IsProd reports whether the server is running in its production configuration +// on golang.org. +func IsProd() bool { + return isProd +} + +// EnforceHosts reports whether host filtering should be enforced. +func EnforceHosts() bool { + return enforceHosts +} + +func boolEnv(key string) bool { + v := os.Getenv(key) + if v == "" { + return false + } + b, err := strconv.ParseBool(v) + if err != nil { + log.Fatalf("environment variable %s (%q) must be a boolean", key, v) + } + return b +} diff --git a/godoc/page.go b/godoc/page.go index 10e86e5c..819af557 100644 --- a/godoc/page.go +++ b/godoc/page.go @@ -10,6 +10,8 @@ import ( "path/filepath" "runtime" "strings" + + "golang.org/x/tools/godoc/env" ) // Page describes the contents of the top-level godoc webpage. @@ -22,10 +24,11 @@ type Page struct { Body []byte GoogleCN bool // page is being served from golang.google.cn - // filled in by servePage - SearchBox bool - Playground bool - Version string + // filled in by ServePage + SearchBox bool + Playground bool + Version string + GoogleAnalytics string } func (p *Presentation) ServePage(w http.ResponseWriter, page Page) { @@ -35,6 +38,7 @@ func (p *Presentation) ServePage(w http.ResponseWriter, page Page) { page.SearchBox = p.Corpus.IndexEnabled page.Playground = p.ShowPlayground page.Version = runtime.Version() + page.GoogleAnalytics = p.GoogleAnalytics applyTemplateToResponseWriter(w, p.GodocHTML, page) } @@ -49,20 +53,19 @@ func (p *Presentation) ServeError(w http.ResponseWriter, r *http.Request, relpat } } p.ServePage(w, Page{ - Title: "File " + relpath, - Subtitle: relpath, - Body: applyTemplate(p.ErrorHTML, "errorHTML", err), - GoogleCN: googleCN(r), + Title: "File " + relpath, + Subtitle: relpath, + Body: applyTemplate(p.ErrorHTML, "errorHTML", err), + GoogleCN: googleCN(r), + GoogleAnalytics: p.GoogleAnalytics, }) } -var onAppengine = false // overridden in appengine.go when on app engine - func googleCN(r *http.Request) bool { if r.FormValue("googlecn") != "" { return true } - if !onAppengine { + if !env.IsProd() { return false } if strings.HasSuffix(r.Host, ".cn") { diff --git a/godoc/pres.go b/godoc/pres.go index de23c756..b0077fd5 100644 --- a/godoc/pres.go +++ b/godoc/pres.go @@ -92,6 +92,10 @@ type Presentation struct { // body for displaying search results. SearchResults []SearchResultFunc + // GoogleAnalytics optionally adds Google Analytics via the provided + // tracking ID to each page. + GoogleAnalytics string + initFuncMapOnce sync.Once funcMap template.FuncMap templateFuncs template.FuncMap diff --git a/godoc/proxy/proxy.go b/godoc/proxy/proxy.go index cdac3bf5..f3023727 100644 --- a/godoc/proxy/proxy.go +++ b/godoc/proxy/proxy.go @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// +build appengine - // Package proxy proxies requests to the playground's compile and share handlers. // It is designed to run only on the instance of godoc that serves golang.org. package proxy @@ -13,6 +11,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "log" "net/http" "net/http/httputil" "net/url" @@ -20,12 +19,18 @@ import ( "time" "golang.org/x/net/context" - - "google.golang.org/appengine" - "google.golang.org/appengine/log" - "google.golang.org/appengine/urlfetch" + "golang.org/x/tools/godoc/env" ) +const playgroundURL = "https://play.golang.org" + +var proxy *httputil.ReverseProxy + +func init() { + target, _ := url.Parse(playgroundURL) + proxy = httputil.NewSingleHostReverseProxy(target) +} + type Request struct { Body string } @@ -41,8 +46,6 @@ type Event struct { Delay time.Duration // time to wait before printing Message } -const playgroundURL = "https://play.golang.org" - const expires = 7 * 24 * time.Hour // 1 week var cacheControlHeader = fmt.Sprintf("public, max-age=%d", int(expires.Seconds())) @@ -57,21 +60,17 @@ func compile(w http.ResponseWriter, r *http.Request) { return } - ctx := appengine.NewContext(r) + ctx := r.Context() body := r.FormValue("body") res := &Response{} req := &Request{Body: body} if err := makeCompileRequest(ctx, req, res); err != nil { - log.Errorf(ctx, "compile error: %v", err) + log.Printf("ERROR compile error: %v", err) http.Error(w, "Internal Server Error", http.StatusInternalServerError) return } - expiresTime := time.Now().Add(expires).UTC() - w.Header().Set("Expires", expiresTime.Format(time.RFC1123)) - w.Header().Set("Cache-Control", cacheControlHeader) - var out interface{} switch r.FormValue("version") { case "2": @@ -82,9 +81,17 @@ func compile(w http.ResponseWriter, r *http.Request) { Output string `json:"output"` }{res.Errors, flatten(res.Events)} } - if err := json.NewEncoder(w).Encode(out); err != nil { - log.Errorf(ctx, "encoding response: %v", err) + b, err := json.Marshal(out) + if err != nil { + log.Printf("ERROR encoding response: %v", err) + http.Error(w, "Internal Server Error", http.StatusInternalServerError) + return } + + expiresTime := time.Now().Add(expires).UTC() + w.Header().Set("Expires", expiresTime.Format(time.RFC1123)) + w.Header().Set("Cache-Control", cacheControlHeader) + w.Write(b) } // makePlaygroundRequest sends the given Request to the playground compile @@ -94,17 +101,22 @@ func makeCompileRequest(ctx context.Context, req *Request, res *Response) error if err != nil { return fmt.Errorf("marshalling request: %v", err) } - r, err := urlfetch.Client(ctx).Post(playgroundURL+"/compile", "application/json", bytes.NewReader(reqJ)) + hReq, _ := http.NewRequest("POST", playgroundURL+"/compile", bytes.NewReader(reqJ)) + hReq.Header.Set("Content-Type", "application/json") + hReq = hReq.WithContext(ctx) + + r, err := http.DefaultClient.Do(hReq) if err != nil { return fmt.Errorf("making request: %v", err) } defer r.Body.Close() + if r.StatusCode != http.StatusOK { b, _ := ioutil.ReadAll(r.Body) return fmt.Errorf("bad status: %v body:\n%s", r.Status, b) } - err = json.NewDecoder(r.Body).Decode(res) - if err != nil { + + if err := json.NewDecoder(r.Body).Decode(res); err != nil { return fmt.Errorf("unmarshalling response: %v", err) } return nil @@ -124,17 +136,14 @@ func share(w http.ResponseWriter, r *http.Request) { http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden) return } - target, _ := url.Parse(playgroundURL) - p := httputil.NewSingleHostReverseProxy(target) - p.Transport = &urlfetch.Transport{Context: appengine.NewContext(r)} - p.ServeHTTP(w, r) + proxy.ServeHTTP(w, r) } func googleCN(r *http.Request) bool { if r.FormValue("googlecn") != "" { return true } - if appengine.IsDevAppServer() { + if !env.IsProd() { return false } if strings.HasSuffix(r.Host, ".cn") { diff --git a/godoc/short/short.go b/godoc/short/short.go index 44d3c936..da710eb3 100644 --- a/godoc/short/short.go +++ b/godoc/short/short.go @@ -2,8 +2,6 @@ // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. -// +build appengine - // Package short implements a simple URL shortener, serving an administrative // interface at /s and shortened urls from /s/key. // It is designed to run only on the instance of godoc that serves golang.org. @@ -15,16 +13,15 @@ import ( "errors" "fmt" "html/template" + "io" + "log" "net/http" "net/url" "regexp" + "cloud.google.com/go/datastore" "golang.org/x/net/context" - - "google.golang.org/appengine" - "google.golang.org/appengine/datastore" - "google.golang.org/appengine/log" - "google.golang.org/appengine/memcache" + "golang.org/x/tools/internal/memcache" "google.golang.org/appengine/user" ) @@ -41,17 +38,32 @@ type Link struct { var validKey = regexp.MustCompile(`^[a-zA-Z0-9-_.]+$`) -func RegisterHandlers(mux *http.ServeMux) { - mux.HandleFunc(prefix, adminHandler) - mux.HandleFunc(prefix+"/", linkHandler) +type server struct { + datastore *datastore.Client + memcache *memcache.CodecClient +} + +func RegisterHandlers(mux *http.ServeMux, dc *datastore.Client, mc *memcache.Client) { + s := server{dc, mc.WithCodec(memcache.JSON)} + mux.HandleFunc(prefix+"/", s.linkHandler) + + // TODO(cbro): move storage of the links to a text file in Gerrit. + // Disable the admin handler until that happens, since GAE Flex doesn't support + // the "google.golang.org/appengine/user" package. + // See golang.org/issue/27205#issuecomment-418673218 + // mux.HandleFunc(prefix, adminHandler) + mux.HandleFunc(prefix, func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusForbidden) + io.WriteString(w, "Link creation temporarily unavailable. See golang.org/issue/27205.") + }) } // linkHandler services requests to short URLs. // http://golang.org/s/key // It consults memcache and datastore for the Link for key. // It then sends a redirects or an error message. -func linkHandler(w http.ResponseWriter, r *http.Request) { - c := appengine.NewContext(r) +func (h server) linkHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() key := r.URL.Path[len(prefix)+1:] if !validKey.MatchString(key) { @@ -60,16 +72,15 @@ func linkHandler(w http.ResponseWriter, r *http.Request) { } var link Link - _, err := memcache.JSON.Get(c, cacheKey(key), &link) - if err != nil { - k := datastore.NewKey(c, kind, key, 0, nil) - err = datastore.Get(c, k, &link) + if err := h.memcache.Get(ctx, cacheKey(key), &link); err != nil { + k := datastore.NameKey(kind, key, nil) + err = h.datastore.Get(ctx, k, &link) switch err { case datastore.ErrNoSuchEntity: http.Error(w, "not found", http.StatusNotFound) return default: // != nil - log.Errorf(c, "%q: %v", key, err) + log.Printf("ERROR %q: %v", key, err) http.Error(w, "internal server error", http.StatusInternalServerError) return case nil: @@ -77,8 +88,8 @@ func linkHandler(w http.ResponseWriter, r *http.Request) { Key: cacheKey(key), Object: &link, } - if err := memcache.JSON.Set(c, item); err != nil { - log.Warningf(c, "%q: %v", key, err) + if err := h.memcache.Set(ctx, item); err != nil { + log.Printf("WARNING %q: %v", key, err) } } } @@ -89,10 +100,10 @@ func linkHandler(w http.ResponseWriter, r *http.Request) { var adminTemplate = template.Must(template.New("admin").Parse(templateHTML)) // adminHandler serves an administrative interface. -func adminHandler(w http.ResponseWriter, r *http.Request) { - c := appengine.NewContext(r) +func (h server) adminHandler(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() - if !user.IsAdmin(c) { + if !user.IsAdmin(ctx) { http.Error(w, "forbidden", http.StatusForbidden) return } @@ -104,24 +115,24 @@ func adminHandler(w http.ResponseWriter, r *http.Request) { switch r.FormValue("do") { case "Add": newLink = &Link{key, r.FormValue("target")} - doErr = putLink(c, newLink) + doErr = h.putLink(ctx, newLink) case "Delete": - k := datastore.NewKey(c, kind, key, 0, nil) - doErr = datastore.Delete(c, k) + k := datastore.NameKey(kind, key, nil) + doErr = h.datastore.Delete(ctx, k) default: http.Error(w, "unknown action", http.StatusBadRequest) } - err := memcache.Delete(c, cacheKey(key)) + err := h.memcache.Delete(ctx, cacheKey(key)) if err != nil && err != memcache.ErrCacheMiss { - log.Warningf(c, "%q: %v", key, err) + log.Printf("WARNING %q: %v", key, err) } } var links []*Link - _, err := datastore.NewQuery(kind).Order("Key").GetAll(c, &links) - if err != nil { + q := datastore.NewQuery(kind).Order("Key") + if _, err := h.datastore.GetAll(ctx, q, &links); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) - log.Errorf(c, "%v", err) + log.Printf("ERROR %v", err) return } @@ -150,20 +161,20 @@ func adminHandler(w http.ResponseWriter, r *http.Request) { Error error }{baseURL, prefix, links, newLink, doErr} if err := adminTemplate.Execute(w, &data); err != nil { - log.Criticalf(c, "adminTemplate: %v", err) + log.Printf("ERROR adminTemplate: %v", err) } } // putLink validates the provided link and puts it into the datastore. -func putLink(c context.Context, link *Link) error { +func (h server) putLink(ctx context.Context, link *Link) error { if !validKey.MatchString(link.Key) { return errors.New("invalid key; must match " + validKey.String()) } if _, err := url.Parse(link.Target); err != nil { return fmt.Errorf("bad target: %v", err) } - k := datastore.NewKey(c, kind, link.Key, 0, nil) - _, err := datastore.Put(c, k, link) + k := datastore.NameKey(kind, link.Key, nil) + _, err := h.datastore.Put(ctx, k, link) return err } diff --git a/godoc/short/tmpl.go b/godoc/short/tmpl.go index 95e4c2a8..66f5401e 100644 --- a/godoc/short/tmpl.go +++ b/godoc/short/tmpl.go @@ -2,8 +2,6 @@ // Use of this source code is governed by the Apache 2.0 // license that can be found in the LICENSE file. -// +build appengine - package short const templateHTML = ` diff --git a/godoc/static/godoc.html b/godoc/static/godoc.html index 6c7889f0..2688b166 100644 --- a/godoc/static/godoc.html +++ b/godoc/static/godoc.html @@ -15,6 +15,19 @@ {{end}} +{{with .GoogleAnalytics}} + +{{end}} @@ -112,6 +125,15 @@ and code is licensed under a BSD license.
+{{if .GoogleAnalytics}} + +{{end}} diff --git a/godoc/static/static.go b/godoc/static/static.go index 33f59931..eb9493cd 100644 --- a/godoc/static/static.go +++ b/godoc/static/static.go @@ -51,7 +51,7 @@ var Files = map[string]string{ "example.html": "\x0a\x09\x0a\x09\x09\xe2\x96\xb9\x20Example{{example_suffix\x20.Name}}

\x0a\x09\x0a\x09\x0a\x09\x09\xe2\x96\xbe\x20Example{{example_suffix\x20.Name}}

\x0a\x09\x09{{with\x20.Doc}}

{{html\x20.}}

{{end}}\x0a\x09\x09{{$output\x20:=\x20.Output}}\x0a\x09\x09{{with\x20.Play}}\x0a\x09\x09\x09\x0a\x09\x09\x09\x09{{html\x20.}}\x0a\x09\x09\x09\x09
{{html\x20$output}}
\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x09\x09Run\x0a\x09\x09\x09\x09\x09Format\x0a\x09\x09\x09\x09\x09{{if\x20not\x20$.GoogleCN}}\x0a\x09\x09\x09\x09\x09Share\x0a\x09\x09\x09\x09\x09{{end}}\x0a\x09\x09\x09\x09\x0a\x09\x09\x09\x0a\x09\x09{{else}}\x0a\x09\x09\x09

Code:

\x0a\x09\x09\x09{{.Code}}\x0a\x09\x09\x09{{with\x20.Output}}\x0a\x09\x09\x09

Output:

\x0a\x09\x09\x09{{html\x20.}}\x0a\x09\x09\x09{{end}}\x0a\x09\x09{{end}}\x0a\x09\x0a\x0a", - "godoc.html": "\x0a\x0a\x0a\x0a\x0a\x0a{{with\x20.Tabtitle}}\x0a\x20\x20{{html\x20.}}\x20-\x20The\x20Go\x20Programming\x20Language\x0a{{else}}\x0a\x20\x20The\x20Go\x20Programming\x20Language\x0a{{end}}\x0a\x0a{{if\x20.SearchBox}}\x0a\x0a{{end}}\x0a\x0a\x0a\x0a\x0a\x0a\x0a{{if\x20.Playground}}\x0a\x0a{{end}}\x0a{{with\x20.Version}}{{end}}\x0a\x0a\x0a\x0a\x0a\x0a...\x0a\x0a\x0a\x0aThe\x20Go\x20Programming\x20Language\x0aGo\x0a▽\x0a\x0a\x0aDocuments\x0aPackages\x0aThe\x20Project\x0aHelp\x0a{{if\x20not\x20.GoogleCN}}\x0aBlog\x0a{{end}}\x0a{{if\x20.Playground}}\x0aPlay\x0a{{end}}\x0asubmit\x20search\x0a\x0a\x0a\x0a\x0a\x0a{{if\x20.Playground}}\x0a\x0a\x09package\x20main\x0a\x0aimport\x20\"fmt\"\x0a\x0afunc\x20main()\x20{\x0a\x09fmt.Println(\"Hello,\x20\xe4\xb8\x96\xe7\x95\x8c\")\x0a}\x0a\x09\x0a\x09\x0a\x09\x09Run\x0a\x09\x09Format\x0a\x09\x09{{if\x20not\x20$.GoogleCN}}\x0a\x09\x09Share\x0a\x09\x09{{end}}\x0a\x09\x0a\x0a{{end}}\x0a\x0a\x0a\x0a\x0a{{if\x20or\x20.Title\x20.SrcPath}}\x0a\x20\x20

\x0a\x20\x20\x20\x20{{html\x20.Title}}\x0a\x20\x20\x20\x20{{html\x20.SrcPath\x20|\x20srcBreadcrumb}}\x0a\x20\x20

\x0a{{end}}\x0a\x0a{{with\x20.Subtitle}}\x0a\x20\x20

{{html\x20.}}

\x0a{{end}}\x0a\x0a{{with\x20.SrcPath}}\x0a\x20\x20

\x0a\x20\x20\x20\x20Documentation:\x20{{html\x20.\x20|\x20srcToPkgLink}}\x0a\x20\x20

\x0a{{end}}\x0a\x0a{{/*\x20The\x20Table\x20of\x20Contents\x20is\x20automatically\x20inserted\x20in\x20this\x20
.\x0a\x20\x20\x20\x20\x20Do\x20not\x20delete\x20this\x20
.\x20*/}}\x0a
\x0a\x0a{{/*\x20Body\x20is\x20HTML-escaped\x20elsewhere\x20*/}}\x0a{{printf\x20\"%s\"\x20.Body}}\x0a\x0a\x0aBuild\x20version\x20{{html\x20.Version}}.
\x0aExcept\x20as\x20noted,\x0athe\x20content\x20of\x20this\x20page\x20is\x20licensed\x20under\x20the\x0aCreative\x20Commons\x20Attribution\x203.0\x20License,\x0aand\x20code\x20is\x20licensed\x20under\x20a\x20BSD\x20license.
\x0aTerms\x20of\x20Service\x20|\x0aPrivacy\x20Policy\x0a
\x0a\x0a\x0a\x0a\x0a\x0a\x0a", + "godoc.html": "\x0a\x0a\x0a\x0a\x0a\x0a{{with\x20.Tabtitle}}\x0a\x20\x20{{html\x20.}}\x20-\x20The\x20Go\x20Programming\x20Language\x0a{{else}}\x0a\x20\x20The\x20Go\x20Programming\x20Language\x0a{{end}}\x0a\x0a{{if\x20.SearchBox}}\x0a\x0a{{end}}\x0a\x0a\x0a{{with\x20.GoogleAnalytics}}\x0a\x0avar\x20_gaq\x20=\x20_gaq\x20||\x20[];\x0a_gaq.push([\"_setAccount\",\x20\"{{.}}\"]);\x0awindow.trackPageview\x20=\x20function()\x20{\x0a\x20\x20_gaq.push([\"_trackPageview\",\x20location.pathname+location.hash]);\x0a};\x0awindow.trackPageview();\x0awindow.trackEvent\x20=\x20function(category,\x20action,\x20opt_label,\x20opt_value,\x20opt_noninteraction)\x20{\x0a\x20\x20_gaq.push([\"_trackEvent\",\x20category,\x20action,\x20opt_label,\x20opt_value,\x20opt_noninteraction]);\x0a};\x0a\x0a{{end}}\x0a\x0a\x0a\x0a\x0a{{if\x20.Playground}}\x0a\x0a{{end}}\x0a{{with\x20.Version}}{{end}}\x0a\x0a\x0a\x0a\x0a\x0a...\x0a\x0a\x0a\x0aThe\x20Go\x20Programming\x20Language\x0aGo\x0a▽\x0a\x0a\x0aDocuments\x0aPackages\x0aThe\x20Project\x0aHelp\x0a{{if\x20not\x20.GoogleCN}}\x0aBlog\x0a{{end}}\x0a{{if\x20.Playground}}\x0aPlay\x0a{{end}}\x0asubmit\x20search\x0a\x0a\x0a\x0a\x0a\x0a{{if\x20.Playground}}\x0a\x0a\x09package\x20main\x0a\x0aimport\x20\"fmt\"\x0a\x0afunc\x20main()\x20{\x0a\x09fmt.Println(\"Hello,\x20\xe4\xb8\x96\xe7\x95\x8c\")\x0a}\x0a\x09\x0a\x09\x0a\x09\x09Run\x0a\x09\x09Format\x0a\x09\x09{{if\x20not\x20$.GoogleCN}}\x0a\x09\x09Share\x0a\x09\x09{{end}}\x0a\x09\x0a\x0a{{end}}\x0a\x0a\x0a\x0a\x0a{{if\x20or\x20.Title\x20.SrcPath}}\x0a\x20\x20

\x0a\x20\x20\x20\x20{{html\x20.Title}}\x0a\x20\x20\x20\x20{{html\x20.SrcPath\x20|\x20srcBreadcrumb}}\x0a\x20\x20

\x0a{{end}}\x0a\x0a{{with\x20.Subtitle}}\x0a\x20\x20

{{html\x20.}}

\x0a{{end}}\x0a\x0a{{with\x20.SrcPath}}\x0a\x20\x20

\x0a\x20\x20\x20\x20Documentation:\x20{{html\x20.\x20|\x20srcToPkgLink}}\x0a\x20\x20

\x0a{{end}}\x0a\x0a{{/*\x20The\x20Table\x20of\x20Contents\x20is\x20automatically\x20inserted\x20in\x20this\x20
.\x0a\x20\x20\x20\x20\x20Do\x20not\x20delete\x20this\x20
.\x20*/}}\x0a
\x0a\x0a{{/*\x20Body\x20is\x20HTML-escaped\x20elsewhere\x20*/}}\x0a{{printf\x20\"%s\"\x20.Body}}\x0a\x0a\x0aBuild\x20version\x20{{html\x20.Version}}.
\x0aExcept\x20as\x20noted,\x0athe\x20content\x20of\x20this\x20page\x20is\x20licensed\x20under\x20the\x0aCreative\x20Commons\x20Attribution\x203.0\x20License,\x0aand\x20code\x20is\x20licensed\x20under\x20a\x20BSD\x20license.
\x0aTerms\x20of\x20Service\x20|\x0aPrivacy\x20Policy\x0a
\x0a\x0a\x0a\x0a{{with\x20.GoogleAnalytics}}\x0a\x0a(function()\x20{\x0a\x20\x20var\x20ga\x20=\x20document.createElement(\"script\");\x20ga.type\x20=\x20\"text/javascript\";\x20ga.async\x20=\x20true;\x0a\x20\x20ga.src\x20=\x20(\"https:\"\x20==\x20document.location.protocol\x20?\x20\"https://ssl\"\x20:\x20\"http://www\")\x20+\x20\".google-analytics.com/ga.js\";\x0a\x20\x20var\x20s\x20=\x20document.getElementsByTagName(\"script\")[0];\x20s.parentNode.insertBefore(ga,\x20s);\x0a})();\x0a\x0a{{end}}\x0a\x0a\x0a\x0a", "godocs.js": "//\x20Copyright\x202012\x20The\x20Go\x20Authors.\x20All\x20rights\x20reserved.\x0a//\x20Use\x20of\x20this\x20source\x20code\x20is\x20governed\x20by\x20a\x20BSD-style\x0a//\x20license\x20that\x20can\x20be\x20found\x20in\x20the\x20LICENSE\x20file.\x0a\x0a/*\x20A\x20little\x20code\x20to\x20ease\x20navigation\x20of\x20these\x20documents.\x0a\x20*\x0a\x20*\x20On\x20window\x20load\x20we:\x0a\x20*\x20\x20+\x20Generate\x20a\x20table\x20of\x20contents\x20(generateTOC)\x0a\x20*\x20\x20+\x20Bind\x20foldable\x20sections\x20(bindToggles)\x0a\x20*\x20\x20+\x20Bind\x20links\x20to\x20foldable\x20sections\x20(bindToggleLinks)\x0a\x20*/\x0a\x0a(function()\x20{\x0a'use\x20strict';\x0a\x0a//\x20Mobile-friendly\x20topbar\x20menu\x0a$(function()\x20{\x0a\x20\x20var\x20menu\x20=\x20$('#menu');\x0a\x20\x20var\x20menuButton\x20=\x20$('#menu-button');\x0a\x20\x20var\x20menuButtonArrow\x20=\x20$('#menu-button-arrow');\x0a\x20\x20menuButton.click(function(event)\x20{\x0a\x20\x20\x20\x20menu.toggleClass('menu-visible');\x0a\x20\x20\x20\x20menuButtonArrow.toggleClass('vertical-flip');\x0a\x20\x20\x20\x20event.preventDefault();\x0a\x20\x20\x20\x20return\x20false;\x0a\x20\x20});\x0a});\x0a\x0a/*\x20Generates\x20a\x20table\x20of\x20contents:\x20looks\x20for\x20h2\x20and\x20h3\x20elements\x20and\x20generates\x0a\x20*\x20links.\x20\"Decorates\"\x20the\x20element\x20with\x20id==\"nav\"\x20with\x20this\x20table\x20of\x20contents.\x0a\x20*/\x0afunction\x20generateTOC()\x20{\x0a\x20\x20if\x20($('#manual-nav').length\x20>\x200)\x20{\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20nav\x20=\x20$('#nav');\x0a\x20\x20if\x20(nav.length\x20===\x200)\x20{\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20toc_items\x20=\x20[];\x0a\x20\x20$(nav).nextAll('h2,\x20h3').each(function()\x20{\x0a\x20\x20\x20\x20var\x20node\x20=\x20this;\x0a\x20\x20\x20\x20if\x20(node.id\x20==\x20'')\x0a\x20\x20\x20\x20\x20\x20node.id\x20=\x20'tmp_'\x20+\x20toc_items.length;\x0a\x20\x20\x20\x20var\x20link\x20=\x20$('').attr('href',\x20'#'\x20+\x20node.id).text($(node).text());\x0a\x20\x20\x20\x20var\x20item;\x0a\x20\x20\x20\x20if\x20($(node).is('h2'))\x20{\x0a\x20\x20\x20\x20\x20\x20item\x20=\x20$('
');\x0a\x20\x20\x20\x20}\x20else\x20{\x20//\x20h3\x0a\x20\x20\x20\x20\x20\x20item\x20=\x20$('');\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20item.append(link);\x0a\x20\x20\x20\x20toc_items.push(item);\x0a\x20\x20});\x0a\x20\x20if\x20(toc_items.length\x20<=\x201)\x20{\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20dl1\x20=\x20$('
');\x0a\x20\x20var\x20dl2\x20=\x20$('
');\x0a\x0a\x20\x20var\x20split_index\x20=\x20(toc_items.length\x20/\x202)\x20+\x201;\x0a\x20\x20if\x20(split_index\x20<\x208)\x20{\x0a\x20\x20\x20\x20split_index\x20=\x20toc_items.length;\x0a\x20\x20}\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20split_index;\x20i++)\x20{\x0a\x20\x20\x20\x20dl1.append(toc_items[i]);\x0a\x20\x20}\x0a\x20\x20for\x20(/*\x20keep\x20using\x20i\x20*/;\x20i\x20<\x20toc_items.length;\x20i++)\x20{\x0a\x20\x20\x20\x20dl2.append(toc_items[i]);\x0a\x20\x20}\x0a\x0a\x20\x20var\x20tocTable\x20=\x20$('').appendTo(nav);\x0a\x20\x20var\x20tocBody\x20=\x20$('').appendTo(tocTable);\x0a\x20\x20var\x20tocRow\x20=\x20$('').appendTo(tocBody);\x0a\x0a\x20\x20//\x201st\x20column\x0a\x20\x20$('').appendTo(tocRow).append(dl1);\x0a\x20\x20//\x202nd\x20column\x0a\x20\x20$('').appendTo(tocRow).append(dl2);\x0a}\x0a\x0afunction\x20bindToggle(el)\x20{\x0a\x20\x20$('.toggleButton',\x20el).click(function()\x20{\x0a\x20\x20\x20\x20if\x20($(this).closest(\".toggle,\x20.toggleVisible\")[0]\x20!=\x20el)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20Only\x20trigger\x20the\x20closest\x20toggle\x20header.\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20if\x20($(el).is('.toggle'))\x20{\x0a\x20\x20\x20\x20\x20\x20$(el).addClass('toggleVisible').removeClass('toggle');\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20$(el).addClass('toggle').removeClass('toggleVisible');\x0a\x20\x20\x20\x20}\x0a\x20\x20});\x0a}\x0a\x0afunction\x20bindToggles(selector)\x20{\x0a\x20\x20$(selector).each(function(i,\x20el)\x20{\x0a\x20\x20\x20\x20bindToggle(el);\x0a\x20\x20});\x0a}\x0a\x0afunction\x20bindToggleLink(el,\x20prefix)\x20{\x0a\x20\x20$(el).click(function()\x20{\x0a\x20\x20\x20\x20var\x20href\x20=\x20$(el).attr('href');\x0a\x20\x20\x20\x20var\x20i\x20=\x20href.indexOf('#'+prefix);\x0a\x20\x20\x20\x20if\x20(i\x20<\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20var\x20id\x20=\x20'#'\x20+\x20prefix\x20+\x20href.slice(i+1+prefix.length);\x0a\x20\x20\x20\x20if\x20($(id).is('.toggle'))\x20{\x0a\x20\x20\x20\x20\x20\x20$(id).find('.toggleButton').first().click();\x0a\x20\x20\x20\x20}\x0a\x20\x20});\x0a}\x0afunction\x20bindToggleLinks(selector,\x20prefix)\x20{\x0a\x20\x20$(selector).each(function(i,\x20el)\x20{\x0a\x20\x20\x20\x20bindToggleLink(el,\x20prefix);\x0a\x20\x20});\x0a}\x0a\x0afunction\x20setupDropdownPlayground()\x20{\x0a\x20\x20if\x20(!$('#page').is('.wide'))\x20{\x0a\x20\x20\x20\x20return;\x20//\x20don't\x20show\x20on\x20front\x20page\x0a\x20\x20}\x0a\x20\x20var\x20button\x20=\x20$('#playgroundButton');\x0a\x20\x20var\x20div\x20=\x20$('#playground');\x0a\x20\x20var\x20setup\x20=\x20false;\x0a\x20\x20button.toggle(function()\x20{\x0a\x20\x20\x20\x20button.addClass('active');\x0a\x20\x20\x20\x20div.show();\x0a\x20\x20\x20\x20if\x20(setup)\x20{\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20setup\x20=\x20true;\x0a\x20\x20\x20\x20playground({\x0a\x20\x20\x20\x20\x20\x20'codeEl':\x20$('.code',\x20div),\x0a\x20\x20\x20\x20\x20\x20'outputEl':\x20$('.output',\x20div),\x0a\x20\x20\x20\x20\x20\x20'runEl':\x20$('.run',\x20div),\x0a\x20\x20\x20\x20\x20\x20'fmtEl':\x20$('.fmt',\x20div),\x0a\x20\x20\x20\x20\x20\x20'shareEl':\x20$('.share',\x20div),\x0a\x20\x20\x20\x20\x20\x20'shareRedirect':\x20'//play.golang.org/p/'\x0a\x20\x20\x20\x20});\x0a\x20\x20},\x0a\x20\x20function()\x20{\x0a\x20\x20\x20\x20button.removeClass('active');\x0a\x20\x20\x20\x20div.hide();\x0a\x20\x20});\x0a\x20\x20button.show();\x0a\x20\x20$('#menu').css('min-width',\x20'+=60');\x0a}\x0a\x0afunction\x20setupInlinePlayground()\x20{\x0a\x09'use\x20strict';\x0a\x09//\x20Set\x20up\x20playground\x20when\x20each\x20element\x20is\x20toggled.\x0a\x09$('div.play').each(function\x20(i,\x20el)\x20{\x0a\x09\x09//\x20Set\x20up\x20playground\x20for\x20this\x20example.\x0a\x09\x09var\x20setup\x20=\x20function()\x20{\x0a\x09\x09\x09var\x20code\x20=\x20$('.code',\x20el);\x0a\x09\x09\x09playground({\x0a\x09\x09\x09\x09'codeEl':\x20\x20\x20code,\x0a\x09\x09\x09\x09'outputEl':\x20$('.output',\x20el),\x0a\x09\x09\x09\x09'runEl':\x20\x20\x20\x20$('.run',\x20el),\x0a\x09\x09\x09\x09'fmtEl':\x20\x20\x20\x20$('.fmt',\x20el),\x0a\x09\x09\x09\x09'shareEl':\x20\x20$('.share',\x20el),\x0a\x09\x09\x09\x09'shareRedirect':\x20'//play.golang.org/p/'\x0a\x09\x09\x09});\x0a\x0a\x09\x09\x09//\x20Make\x20the\x20code\x20textarea\x20resize\x20to\x20fit\x20content.\x0a\x09\x09\x09var\x20resize\x20=\x20function()\x20{\x0a\x09\x09\x09\x09code.height(0);\x0a\x09\x09\x09\x09var\x20h\x20=\x20code[0].scrollHeight;\x0a\x09\x09\x09\x09code.height(h+20);\x20//\x20minimize\x20bouncing.\x0a\x09\x09\x09\x09code.closest('.input').height(h);\x0a\x09\x09\x09};\x0a\x09\x09\x09code.on('keydown',\x20resize);\x0a\x09\x09\x09code.on('keyup',\x20resize);\x0a\x09\x09\x09code.keyup();\x20//\x20resize\x20now.\x0a\x09\x09};\x0a\x0a\x09\x09//\x20If\x20example\x20already\x20visible,\x20set\x20up\x20playground\x20now.\x0a\x09\x09if\x20($(el).is(':visible'))\x20{\x0a\x09\x09\x09setup();\x0a\x09\x09\x09return;\x0a\x09\x09}\x0a\x0a\x09\x09//\x20Otherwise,\x20set\x20up\x20playground\x20when\x20example\x20is\x20expanded.\x0a\x09\x09var\x20built\x20=\x20false;\x0a\x09\x09$(el).closest('.toggle').click(function()\x20{\x0a\x09\x09\x09//\x20Only\x20set\x20up\x20once.\x0a\x09\x09\x09if\x20(!built)\x20{\x0a\x09\x09\x09\x09setup();\x0a\x09\x09\x09\x09built\x20=\x20true;\x0a\x09\x09\x09}\x0a\x09\x09});\x0a\x09});\x0a}\x0a\x0a//\x20fixFocus\x20tries\x20to\x20put\x20focus\x20to\x20div#page\x20so\x20that\x20keyboard\x20navigation\x20works.\x0afunction\x20fixFocus()\x20{\x0a\x20\x20var\x20page\x20=\x20$('div#page');\x0a\x20\x20var\x20topbar\x20=\x20$('div#topbar');\x0a\x20\x20page.css('outline',\x200);\x20//\x20disable\x20outline\x20when\x20focused\x0a\x20\x20page.attr('tabindex',\x20-1);\x20//\x20and\x20set\x20tabindex\x20so\x20that\x20it\x20is\x20focusable\x0a\x20\x20$(window).resize(function\x20(evt)\x20{\x0a\x20\x20\x20\x20//\x20only\x20focus\x20page\x20when\x20the\x20topbar\x20is\x20at\x20fixed\x20position\x20(that\x20is,\x20it's\x20in\x0a\x20\x20\x20\x20//\x20front\x20of\x20page,\x20and\x20keyboard\x20event\x20will\x20go\x20to\x20the\x20former\x20by\x20default.)\x0a\x20\x20\x20\x20//\x20by\x20focusing\x20page,\x20keyboard\x20event\x20will\x20go\x20to\x20page\x20so\x20that\x20up/down\x20arrow,\x0a\x20\x20\x20\x20//\x20space,\x20etc.\x20will\x20work\x20as\x20expected.\x0a\x20\x20\x20\x20if\x20(topbar.css('position')\x20==\x20\"fixed\")\x0a\x20\x20\x20\x20\x20\x20page.focus();\x0a\x20\x20}).resize();\x0a}\x0a\x0afunction\x20toggleHash()\x20{\x0a\x20\x20var\x20id\x20=\x20window.location.hash.substring(1);\x0a\x20\x20//\x20Open\x20all\x20of\x20the\x20toggles\x20for\x20a\x20particular\x20hash.\x0a\x20\x20var\x20els\x20=\x20$(\x0a\x20\x20\x20\x20document.getElementById(id),\x0a\x20\x20\x20\x20$('a[name]').filter(function()\x20{\x0a\x20\x20\x20\x20\x20\x20return\x20$(this).attr('name')\x20==\x20id;\x0a\x20\x20\x20\x20})\x0a\x20\x20);\x0a\x0a\x20\x20while\x20(els.length)\x20{\x0a\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20els.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20var\x20el\x20=\x20$(els[i]);\x0a\x20\x20\x20\x20\x20\x20if\x20(el.is('.toggle'))\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.find('.toggleButton').first().click();\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20els\x20=\x20el.parent();\x0a\x20\x20}\x0a}\x0a\x0afunction\x20personalizeInstallInstructions()\x20{\x0a\x20\x20var\x20prefix\x20=\x20'?download=';\x0a\x20\x20var\x20s\x20=\x20window.location.search;\x0a\x20\x20if\x20(s.indexOf(prefix)\x20!=\x200)\x20{\x0a\x20\x20\x20\x20//\x20No\x20'download'\x20query\x20string;\x20detect\x20\"test\"\x20instructions\x20from\x20User\x20Agent.\x0a\x20\x20\x20\x20if\x20(navigator.platform.indexOf('Win')\x20!=\x20-1)\x20{\x0a\x20\x20\x20\x20\x20\x20$('.testUnix').hide();\x0a\x20\x20\x20\x20\x20\x20$('.testWindows').show();\x0a\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20$('.testUnix').show();\x0a\x20\x20\x20\x20\x20\x20$('.testWindows').hide();\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20filename\x20=\x20s.substr(prefix.length);\x0a\x20\x20var\x20filenameRE\x20=\x20/^go1\\.\\d+(\\.\\d+)?([a-z0-9]+)?\\.([a-z0-9]+)(-[a-z0-9]+)?(-osx10\\.[68])?\\.([a-z.]+)$/;\x0a\x20\x20var\x20m\x20=\x20filenameRE.exec(filename);\x0a\x20\x20if\x20(!m)\x20{\x0a\x20\x20\x20\x20//\x20Can't\x20interpret\x20file\x20name;\x20bail.\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x20\x20$('.downloadFilename').text(filename);\x0a\x20\x20$('.hideFromDownload').hide();\x0a\x0a\x20\x20var\x20os\x20=\x20m[3];\x0a\x20\x20var\x20ext\x20=\x20m[6];\x0a\x20\x20if\x20(ext\x20!=\x20'tar.gz')\x20{\x0a\x20\x20\x20\x20$('#tarballInstructions').hide();\x0a\x20\x20}\x0a\x20\x20if\x20(os\x20!=\x20'darwin'\x20||\x20ext\x20!=\x20'pkg')\x20{\x0a\x20\x20\x20\x20$('#darwinPackageInstructions').hide();\x0a\x20\x20}\x0a\x20\x20if\x20(os\x20!=\x20'windows')\x20{\x0a\x20\x20\x20\x20$('#windowsInstructions').hide();\x0a\x20\x20\x20\x20$('.testUnix').show();\x0a\x20\x20\x20\x20$('.testWindows').hide();\x0a\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20if\x20(ext\x20!=\x20'msi')\x20{\x0a\x20\x20\x20\x20\x20\x20$('#windowsInstallerInstructions').hide();\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20if\x20(ext\x20!=\x20'zip')\x20{\x0a\x20\x20\x20\x20\x20\x20$('#windowsZipInstructions').hide();\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20$('.testUnix').hide();\x0a\x20\x20\x20\x20$('.testWindows').show();\x0a\x20\x20}\x0a\x0a\x20\x20var\x20download\x20=\x20\"https://dl.google.com/go/\"\x20+\x20filename;\x0a\x0a\x20\x20var\x20message\x20=\x20$(''+\x0a\x20\x20\x20\x20'Your\x20download\x20should\x20begin\x20shortly.\x20'+\x0a\x20\x20\x20\x20'If\x20it\x20does\x20not,\x20click\x20this\x20link.

');\x0a\x20\x20message.find('a').attr('href',\x20download);\x0a\x20\x20message.insertAfter('#nav');\x0a\x0a\x20\x20window.location\x20=\x20download;\x0a}\x0a\x0afunction\x20updateVersionTags()\x20{\x0a\x20\x20var\x20v\x20=\x20window.goVersion;\x0a\x20\x20if\x20(/^go[0-9.]+$/.test(v))\x20{\x0a\x20\x20\x20\x20$(\".versionTag\").empty().text(v);\x0a\x20\x20\x20\x20$(\".whereTag\").hide();\x0a\x20\x20}\x0a}\x0a\x0afunction\x20addPermalinks()\x20{\x0a\x20\x20function\x20addPermalink(source,\x20parent)\x20{\x0a\x20\x20\x20\x20var\x20id\x20=\x20source.attr(\"id\");\x0a\x20\x20\x20\x20if\x20(id\x20==\x20\"\"\x20||\x20id.indexOf(\"tmp_\")\x20===\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20Auto-generated\x20permalink.\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20if\x20(parent.find(\">\x20.permalink\").length)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20Already\x20attached.\x0a\x20\x20\x20\x20\x20\x20return;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20parent.append(\"\x20\").append($(\"¶\").attr(\"href\",\x20\"#\"\x20+\x20id));\x0a\x20\x20}\x0a\x0a\x20\x20$(\"#page\x20.container\").find(\"h2[id],\x20h3[id]\").each(function()\x20{\x0a\x20\x20\x20\x20var\x20el\x20=\x20$(this);\x0a\x20\x20\x20\x20addPermalink(el,\x20el);\x0a\x20\x20});\x0a\x0a\x20\x20$(\"#page\x20.container\").find(\"dl[id]\").each(function()\x20{\x0a\x20\x20\x20\x20var\x20el\x20=\x20$(this);\x0a\x20\x20\x20\x20//\x20Add\x20the\x20anchor\x20to\x20the\x20\"dt\"\x20element.\x0a\x20\x20\x20\x20addPermalink(el,\x20el.find(\">\x20dt\").first());\x0a\x20\x20});\x0a}\x0a\x0a$(\".js-expandAll\").click(function()\x20{\x0a\x20\x20if\x20($(this).hasClass(\"collapsed\"))\x20{\x0a\x20\x20\x20\x20toggleExamples('toggle');\x0a\x20\x20\x20\x20$(this).text(\"(Collapse\x20All)\");\x0a\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20toggleExamples('toggleVisible');\x0a\x20\x20\x20\x20$(this).text(\"(Expand\x20All)\");\x0a\x20\x20}\x0a\x20\x20$(this).toggleClass(\"collapsed\")\x0a});\x0a\x0afunction\x20toggleExamples(className)\x20{\x0a\x20\x20//\x20We\x20need\x20to\x20explicitly\x20iterate\x20through\x20divs\x20starting\x20with\x20\"example_\"\x0a\x20\x20//\x20to\x20avoid\x20toggling\x20Overview\x20and\x20Index\x20collapsibles.\x0a\x20\x20$(\"[id^='example_']\").each(function()\x20{\x0a\x20\x20\x20\x20//\x20Check\x20for\x20state\x20and\x20click\x20it\x20only\x20if\x20required.\x0a\x20\x20\x20\x20if\x20($(this).hasClass(className))\x20{\x0a\x20\x20\x20\x20\x20\x20$(this).find('.toggleButton').first().click();\x0a\x20\x20\x20\x20}\x0a\x20\x20});\x0a}\x0a\x0a$(document).ready(function()\x20{\x0a\x20\x20generateTOC();\x0a\x20\x20addPermalinks();\x0a\x20\x20bindToggles(\".toggle\");\x0a\x20\x20bindToggles(\".toggleVisible\");\x0a\x20\x20bindToggleLinks(\".exampleLink\",\x20\"example_\");\x0a\x20\x20bindToggleLinks(\".overviewLink\",\x20\"\");\x0a\x20\x20bindToggleLinks(\".examplesLink\",\x20\"\");\x0a\x20\x20bindToggleLinks(\".indexLink\",\x20\"\");\x0a\x20\x20setupDropdownPlayground();\x0a\x20\x20setupInlinePlayground();\x0a\x20\x20fixFocus();\x0a\x20\x20setupTypeInfo();\x0a\x20\x20setupCallgraphs();\x0a\x20\x20toggleHash();\x0a\x20\x20personalizeInstallInstructions();\x0a\x20\x20updateVersionTags();\x0a\x0a\x20\x20//\x20godoc.html\x20defines\x20window.initFuncs\x20in\x20the\x20\x20tag,\x20and\x20root.html\x20and\x0a\x20\x20//\x20codewalk.js\x20push\x20their\x20on-page-ready\x20functions\x20to\x20the\x20list.\x0a\x20\x20//\x20We\x20execute\x20those\x20functions\x20here,\x20to\x20avoid\x20loading\x20jQuery\x20until\x20the\x20page\x0a\x20\x20//\x20content\x20is\x20loaded.\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20window.initFuncs.length;\x20i++)\x20window.initFuncs[i]();\x0a});\x0a\x0a//\x20--\x20analysis\x20---------------------------------------------------------\x0a\x0a//\x20escapeHTML\x20returns\x20HTML\x20for\x20s,\x20with\x20metacharacters\x20quoted.\x0a//\x20It\x20is\x20safe\x20for\x20use\x20in\x20both\x20elements\x20and\x20attributes\x0a//\x20(unlike\x20the\x20\"set\x20innerText,\x20read\x20innerHTML\"\x20trick).\x0afunction\x20escapeHTML(s)\x20{\x0a\x20\x20\x20\x20return\x20s.replace(/&/g,\x20'&').\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20replace(/\\\"/g,\x20'"').\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20replace(/\\'/g,\x20''').\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20replace(//g,\x20'>');\x0a}\x0a\x0a//\x20makeAnchor\x20returns\x20HTML\x20for\x20an\x20\x20element,\x20given\x20an\x20anchorJSON\x20object.\x0afunction\x20makeAnchor(json)\x20{\x0a\x20\x20var\x20html\x20=\x20escapeHTML(json.Text);\x0a\x20\x20if\x20(json.Href\x20!=\x20\"\")\x20{\x0a\x20\x20\x20\x20\x20\x20html\x20=\x20\"\"\x20+\x20html\x20+\x20\"\";\x0a\x20\x20}\x0a\x20\x20return\x20html;\x0a}\x0a\x0afunction\x20showLowFrame(html)\x20{\x0a\x20\x20var\x20lowframe\x20=\x20document.getElementById('lowframe');\x0a\x20\x20lowframe.style.height\x20=\x20\"200px\";\x0a\x20\x20lowframe.innerHTML\x20=\x20\"\"\x20+\x20html\x20+\x20\"

\\n\"\x20+\x0a\x20\x20\x20\x20\x20\x20\"\xe2\x9c\x98\"\x0a};\x0a\x0adocument.hideLowFrame\x20=\x20function()\x20{\x0a\x20\x20var\x20lowframe\x20=\x20document.getElementById('lowframe');\x0a\x20\x20lowframe.style.height\x20=\x20\"0px\";\x0a}\x0a\x0a//\x20onClickCallers\x20is\x20the\x20onclick\x20action\x20for\x20the\x20'func'\x20tokens\x20of\x20a\x0a//\x20function\x20declaration.\x0adocument.onClickCallers\x20=\x20function(index)\x20{\x0a\x20\x20var\x20data\x20=\x20document.ANALYSIS_DATA[index]\x0a\x20\x20if\x20(data.Callers.length\x20==\x201\x20&&\x20data.Callers[0].Sites.length\x20==\x201)\x20{\x0a\x20\x20\x20\x20document.location\x20=\x20data.Callers[0].Sites[0].Href;\x20//\x20jump\x20to\x20sole\x20caller\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20html\x20=\x20\"Callers\x20of\x20\"\x20+\x20escapeHTML(data.Callee)\x20+\x20\":
\\n\";\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20data.Callers.length;\x20i++)\x20{\x0a\x20\x20\x20\x20var\x20caller\x20=\x20data.Callers[i];\x0a\x20\x20\x20\x20html\x20+=\x20\"\"\x20+\x20escapeHTML(caller.Func)\x20+\x20\"\";\x0a\x20\x20\x20\x20var\x20sites\x20=\x20caller.Sites;\x0a\x20\x20\x20\x20if\x20(sites\x20!=\x20null\x20&&\x20sites.length\x20>\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20html\x20+=\x20\"\x20at\x20line\x20\";\x0a\x20\x20\x20\x20\x20\x20for\x20(var\x20j\x20=\x200;\x20j\x20<\x20sites.length;\x20j++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(j\x20>\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20\",\x20\";\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20\"\"\x20+\x20makeAnchor(sites[j])\x20+\x20\"\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20html\x20+=\x20\"
\\n\";\x0a\x20\x20}\x0a\x20\x20showLowFrame(html);\x0a};\x0a\x0a//\x20onClickCallees\x20is\x20the\x20onclick\x20action\x20for\x20the\x20'('\x20token\x20of\x20a\x20function\x20call.\x0adocument.onClickCallees\x20=\x20function(index)\x20{\x0a\x20\x20var\x20data\x20=\x20document.ANALYSIS_DATA[index]\x0a\x20\x20if\x20(data.Callees.length\x20==\x201)\x20{\x0a\x20\x20\x20\x20document.location\x20=\x20data.Callees[0].Href;\x20//\x20jump\x20to\x20sole\x20callee\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20html\x20=\x20\"Callees\x20of\x20this\x20\"\x20+\x20escapeHTML(data.Descr)\x20+\x20\":
\\n\";\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20data.Callees.length;\x20i++)\x20{\x0a\x20\x20\x20\x20html\x20+=\x20\"\"\x20+\x20makeAnchor(data.Callees[i])\x20+\x20\"
\\n\";\x0a\x20\x20}\x0a\x20\x20showLowFrame(html);\x0a};\x0a\x0a//\x20onClickTypeInfo\x20is\x20the\x20onclick\x20action\x20for\x20identifiers\x20declaring\x20a\x20named\x20type.\x0adocument.onClickTypeInfo\x20=\x20function(index)\x20{\x0a\x20\x20var\x20data\x20=\x20document.ANALYSIS_DATA[index];\x0a\x20\x20var\x20html\x20=\x20\"Type\x20\"\x20+\x20data.Name\x20+\x20\":\x20\"\x20+\x0a\x20\x20\"      (size=\"\x20+\x20data.Size\x20+\x20\",\x20align=\"\x20+\x20data.Align\x20+\x20\")
\\n\";\x0a\x20\x20html\x20+=\x20implementsHTML(data);\x0a\x20\x20html\x20+=\x20methodsetHTML(data);\x0a\x20\x20showLowFrame(html);\x0a};\x0a\x0a//\x20implementsHTML\x20returns\x20HTML\x20for\x20the\x20implements\x20relation\x20of\x20the\x0a//\x20specified\x20TypeInfoJSON\x20value.\x0afunction\x20implementsHTML(info)\x20{\x0a\x20\x20var\x20html\x20=\x20\"\";\x0a\x20\x20if\x20(info.ImplGroups\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20info.ImplGroups.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20var\x20group\x20=\x20info.ImplGroups[i];\x0a\x20\x20\x20\x20\x20\x20var\x20x\x20=\x20\"\"\x20+\x20escapeHTML(group.Descr)\x20+\x20\"\x20\";\x0a\x20\x20\x20\x20\x20\x20for\x20(var\x20j\x20=\x200;\x20j\x20<\x20group.Facts.length;\x20j++)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20var\x20fact\x20=\x20group.Facts[j];\x0a\x20\x20\x20\x20\x20\x20\x20\x20var\x20y\x20=\x20\"\"\x20+\x20makeAnchor(fact.Other)\x20+\x20\"\";\x0a\x20\x20\x20\x20\x20\x20\x20\x20if\x20(fact.ByKind\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20escapeHTML(fact.ByKind)\x20+\x20\"\x20type\x20\"\x20+\x20y\x20+\x20\"\x20implements\x20\"\x20+\x20x;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20x\x20+\x20\"\x20implements\x20\"\x20+\x20y;\x0a\x20\x20\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20\x20\x20\x20\x20html\x20+=\x20\"
\\n\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x20\x20return\x20html;\x0a}\x0a\x0a\x0a//\x20methodsetHTML\x20returns\x20HTML\x20for\x20the\x20methodset\x20of\x20the\x20specified\x0a//\x20TypeInfoJSON\x20value.\x0afunction\x20methodsetHTML(info)\x20{\x0a\x20\x20var\x20html\x20=\x20\"\";\x0a\x20\x20if\x20(info.Methods\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20info.Methods.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20html\x20+=\x20\"\"\x20+\x20makeAnchor(info.Methods[i])\x20+\x20\"
\\n\";\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x20\x20return\x20html;\x0a}\x0a\x0a//\x20onClickComm\x20is\x20the\x20onclick\x20action\x20for\x20channel\x20\"make\"\x20and\x20\"<-\"\x0a//\x20send/receive\x20tokens.\x0adocument.onClickComm\x20=\x20function(index)\x20{\x0a\x20\x20var\x20ops\x20=\x20document.ANALYSIS_DATA[index].Ops\x0a\x20\x20if\x20(ops.length\x20==\x201)\x20{\x0a\x20\x20\x20\x20document.location\x20=\x20ops[0].Op.Href;\x20//\x20jump\x20to\x20sole\x20element\x0a\x20\x20\x20\x20return;\x0a\x20\x20}\x0a\x0a\x20\x20var\x20html\x20=\x20\"Operations\x20on\x20this\x20channel:
\\n\";\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20ops.length;\x20i++)\x20{\x0a\x20\x20\x20\x20html\x20+=\x20makeAnchor(ops[i].Op)\x20+\x20\"\x20by\x20\"\x20+\x20escapeHTML(ops[i].Fn)\x20+\x20\"
\\n\";\x0a\x20\x20}\x0a\x20\x20if\x20(ops.length\x20==\x200)\x20{\x0a\x20\x20\x20\x20html\x20+=\x20\"(none)
\\n\";\x0a\x20\x20}\x0a\x20\x20showLowFrame(html);\x0a};\x0a\x0a$(window).load(function()\x20{\x0a\x20\x20\x20\x20//\x20Scroll\x20window\x20so\x20that\x20first\x20selection\x20is\x20visible.\x0a\x20\x20\x20\x20//\x20(This\x20means\x20we\x20don't\x20need\x20to\x20emit\x20id='L%d'\x20spans\x20for\x20each\x20line.)\x0a\x20\x20\x20\x20//\x20TODO(adonovan):\x20ideally,\x20scroll\x20it\x20so\x20that\x20it's\x20under\x20the\x20pointer,\x0a\x20\x20\x20\x20//\x20but\x20I\x20don't\x20know\x20how\x20to\x20get\x20the\x20pointer\x20y\x20coordinate.\x0a\x20\x20\x20\x20var\x20elts\x20=\x20document.getElementsByClassName(\"selection\");\x0a\x20\x20\x20\x20if\x20(elts.length\x20>\x200)\x20{\x0a\x09elts[0].scrollIntoView()\x0a\x20\x20\x20\x20}\x0a});\x0a\x0a//\x20setupTypeInfo\x20populates\x20the\x20\"Implements\"\x20and\x20\"Method\x20set\"\x20toggle\x20for\x0a//\x20each\x20type\x20in\x20the\x20package\x20doc.\x0afunction\x20setupTypeInfo()\x20{\x0a\x20\x20for\x20(var\x20i\x20in\x20document.ANALYSIS_DATA)\x20{\x0a\x20\x20\x20\x20var\x20data\x20=\x20document.ANALYSIS_DATA[i];\x0a\x0a\x20\x20\x20\x20var\x20el\x20=\x20document.getElementById(\"implements-\"\x20+\x20i);\x0a\x20\x20\x20\x20if\x20(el\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20el\x20!=\x20null\x20=>\x20data\x20is\x20TypeInfoJSON.\x0a\x20\x20\x20\x20\x20\x20if\x20(data.ImplGroups\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.innerHTML\x20=\x20implementsHTML(data);\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.parentNode.parentNode.style.display\x20=\x20\"block\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x0a\x20\x20\x20\x20var\x20el\x20=\x20document.getElementById(\"methodset-\"\x20+\x20i);\x0a\x20\x20\x20\x20if\x20(el\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20//\x20el\x20!=\x20null\x20=>\x20data\x20is\x20TypeInfoJSON.\x0a\x20\x20\x20\x20\x20\x20if\x20(data.Methods\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.innerHTML\x20=\x20methodsetHTML(data);\x0a\x20\x20\x20\x20\x20\x20\x20\x20el.parentNode.parentNode.style.display\x20=\x20\"block\";\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a}\x0a\x0afunction\x20setupCallgraphs()\x20{\x0a\x20\x20if\x20(document.CALLGRAPH\x20==\x20null)\x20{\x0a\x20\x20\x20\x20return\x0a\x20\x20}\x0a\x20\x20document.getElementById(\"pkg-callgraph\").style.display\x20=\x20\"block\";\x0a\x0a\x20\x20var\x20treeviews\x20=\x20document.getElementsByClassName(\"treeview\");\x0a\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20treeviews.length;\x20i++)\x20{\x0a\x20\x20\x20\x20var\x20tree\x20=\x20treeviews[i];\x0a\x20\x20\x20\x20if\x20(tree.id\x20==\x20null\x20||\x20tree.id.indexOf(\"callgraph-\")\x20!=\x200)\x20{\x0a\x20\x20\x20\x20\x20\x20continue;\x0a\x20\x20\x20\x20}\x0a\x20\x20\x20\x20var\x20id\x20=\x20tree.id.substring(\"callgraph-\".length);\x0a\x20\x20\x20\x20$(tree).treeview({collapsed:\x20true,\x20animated:\x20\"fast\"});\x0a\x20\x20\x20\x20document.cgAddChildren(tree,\x20tree,\x20[id]);\x0a\x20\x20\x20\x20tree.parentNode.parentNode.style.display\x20=\x20\"block\";\x0a\x20\x20}\x0a}\x0a\x0adocument.cgAddChildren\x20=\x20function(tree,\x20ul,\x20indices)\x20{\x0a\x20\x20if\x20(indices\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20for\x20(var\x20i\x20=\x200;\x20i\x20<\x20indices.length;\x20i++)\x20{\x0a\x20\x20\x20\x20\x20\x20var\x20li\x20=\x20cgAddChild(tree,\x20ul,\x20document.CALLGRAPH[indices[i]]);\x0a\x20\x20\x20\x20\x20\x20if\x20(i\x20==\x20indices.length\x20-\x201)\x20{\x0a\x20\x20\x20\x20\x20\x20\x20\x20$(li).addClass(\"last\");\x0a\x20\x20\x20\x20\x20\x20}\x0a\x20\x20\x20\x20}\x0a\x20\x20}\x0a\x20\x20$(tree).treeview({animated:\x20\"fast\",\x20add:\x20ul});\x0a}\x0a\x0a//\x20cgAddChild\x20adds\x20an\x20
  • \x20element\x20for\x20document.CALLGRAPH\x20node\x20cgn\x20to\x0a//\x20the\x20parent\x20
      \x20element\x20ul.\x20tree\x20is\x20the\x20tree's\x20root\x20
        \x20element.\x0afunction\x20cgAddChild(tree,\x20ul,\x20cgn)\x20{\x0a\x20\x20\x20var\x20li\x20=\x20document.createElement(\"li\");\x0a\x20\x20\x20ul.appendChild(li);\x0a\x20\x20\x20li.className\x20=\x20\"closed\";\x0a\x0a\x20\x20\x20var\x20code\x20=\x20document.createElement(\"code\");\x0a\x0a\x20\x20\x20if\x20(cgn.Callees\x20!=\x20null)\x20{\x0a\x20\x20\x20\x20\x20$(li).addClass(\"expandable\");\x0a\x0a\x20\x20\x20\x20\x20//\x20Event\x20handlers\x20and\x20innerHTML\x20updates\x20don't\x20play\x20nicely\x20together,\x0a\x20\x20\x20\x20\x20//\x20hence\x20all\x20this\x20explicit\x20DOM\x20manipulation.\x0a\x20\x20\x20\x20\x20var\x20hitarea\x20=\x20document.createElement(\"div\");\x0a\x20\x20\x20\x20\x20hitarea.className\x20=\x20\"hitarea\x20expandable-hitarea\";\x0a\x20\x20\x20\x20\x20li.appendChild(hitarea);\x0a\x0a\x20\x20\x20\x20\x20li.appendChild(code);\x0a\x0a\x20\x20\x20\x20\x20var\x20childUL\x20=\x20document.createElement(\"ul\");\x0a\x20\x20\x20\x20\x20li.appendChild(childUL);\x0a\x20\x20\x20\x20\x20childUL.setAttribute('style',\x20\"display:\x20none;\");\x0a\x0a\x20\x20\x20\x20\x20var\x20onClick\x20=\x20function()\x20{\x0a\x20\x20\x20\x20\x20\x20\x20document.cgAddChildren(tree,\x20childUL,\x20cgn.Callees);\x0a\x20\x20\x20\x20\x20\x20\x20hitarea.removeEventListener('click',\x20onClick)\x0a\x20\x20\x20\x20\x20};\x0a\x20\x20\x20\x20\x20hitarea.addEventListener('click',\x20onClick);\x0a\x0a\x20\x20\x20}\x20else\x20{\x0a\x20\x20\x20\x20\x20li.appendChild(code);\x0a\x20\x20\x20}\x0a\x20\x20\x20code.innerHTML\x20+=\x20\" \"\x20+\x20makeAnchor(cgn.Func);\x0a\x20\x20\x20return\x20li\x0a}\x0a\x0a})();\x0a", diff --git a/internal/memcache/memcache.go b/internal/memcache/memcache.go new file mode 100644 index 00000000..25d5a623 --- /dev/null +++ b/internal/memcache/memcache.go @@ -0,0 +1,157 @@ +// Copyright 2018 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. + +// Package memcache provides a minimally compatible interface for +// google.golang.org/appengine/memcache +// and stores the data in Redis (e.g., via Cloud Memorystore). +package memcache + +import ( + "bytes" + "context" + "encoding/gob" + "encoding/json" + "errors" + "time" + + "github.com/gomodule/redigo/redis" +) + +var ErrCacheMiss = errors.New("memcache: cache miss") + +func New(addr string) *Client { + const maxConns = 20 + + pool := redis.NewPool(func() (redis.Conn, error) { + return redis.Dial("tcp", addr) + }, maxConns) + + return &Client{ + pool: pool, + } +} + +type Client struct { + pool *redis.Pool +} + +type CodecClient struct { + client *Client + codec Codec +} + +type Item struct { + Key string + Value []byte + Object interface{} // Used with Codec. + Expiration time.Duration // Read-only. +} + +func (c *Client) WithCodec(codec Codec) *CodecClient { + return &CodecClient{ + c, codec, + } +} + +func (c *Client) Delete(ctx context.Context, key string) error { + conn, err := c.pool.GetContext(ctx) + if err != nil { + return err + } + defer conn.Close() + + _, err = conn.Do("DEL", key) + return err +} + +func (c *CodecClient) Delete(ctx context.Context, key string) error { + return c.client.Delete(ctx, key) +} + +func (c *Client) Set(ctx context.Context, item *Item) error { + if item.Value == nil { + return errors.New("nil item value") + } + return c.set(ctx, item.Key, item.Value, item.Expiration) +} + +func (c *CodecClient) Set(ctx context.Context, item *Item) error { + if item.Object == nil { + return errors.New("nil object value") + } + b, err := c.codec.Marshal(item.Object) + if err != nil { + return err + } + return c.client.set(ctx, item.Key, b, item.Expiration) +} + +func (c *Client) set(ctx context.Context, key string, value []byte, expiration time.Duration) error { + conn, err := c.pool.GetContext(ctx) + if err != nil { + return err + } + defer conn.Close() + + if expiration == 0 { + _, err := conn.Do("SET", key, value) + return err + } + + // NOTE(cbro): redis does not support expiry in units more granular than a second. + exp := int64(expiration.Seconds()) + if exp == 0 { + // Redis doesn't allow a zero expiration, delete the key instead. + _, err := conn.Do("DEL", key) + return err + } + + _, err = conn.Do("SETEX", key, exp, value) + return err +} + +// Get gets the item. +func (c *Client) Get(ctx context.Context, key string) ([]byte, error) { + conn, err := c.pool.GetContext(ctx) + if err != nil { + return nil, err + } + defer conn.Close() + + b, err := redis.Bytes(conn.Do("GET", key)) + if err == redis.ErrNil { + err = ErrCacheMiss + } + return b, err +} + +func (c *CodecClient) Get(ctx context.Context, key string, v interface{}) error { + b, err := c.client.Get(ctx, key) + if err != nil { + return err + } + return c.codec.Unmarshal(b, v) +} + +var ( + Gob = Codec{gobMarshal, gobUnmarshal} + JSON = Codec{json.Marshal, json.Unmarshal} +) + +type Codec struct { + Marshal func(interface{}) ([]byte, error) + Unmarshal func([]byte, interface{}) error +} + +func gobMarshal(v interface{}) ([]byte, error) { + var buf bytes.Buffer + if err := gob.NewEncoder(&buf).Encode(v); err != nil { + return nil, err + } + return buf.Bytes(), nil +} + +func gobUnmarshal(data []byte, v interface{}) error { + return gob.NewDecoder(bytes.NewBuffer(data)).Decode(v) +} diff --git a/internal/memcache/memcache_test.go b/internal/memcache/memcache_test.go new file mode 100644 index 00000000..74f6ade6 --- /dev/null +++ b/internal/memcache/memcache_test.go @@ -0,0 +1,83 @@ +// Copyright 2018 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. + +package memcache + +import ( + "context" + "os" + "testing" + "time" +) + +func getClient(t *testing.T) *Client { + t.Helper() + + addr := os.Getenv("GOLANG_REDIS_ADDR") + if addr == "" { + t.Skip("skipping because GOLANG_REDIS_ADDR is unset") + } + + return New(addr) +} + +func TestCacheMiss(t *testing.T) { + c := getClient(t) + ctx := context.Background() + + if _, err := c.Get(ctx, "doesnotexist"); err != ErrCacheMiss { + t.Errorf("got %v; want ErrCacheMiss", err) + } +} + +func TestExpiry(t *testing.T) { + c := getClient(t).WithCodec(Gob) + ctx := context.Background() + + key := "testexpiry" + + firstTime := time.Now() + err := c.Set(ctx, &Item{ + Key: key, + Object: firstTime, + Expiration: 3500 * time.Millisecond, // NOTE: check that non-rounded expiries work. + }) + if err != nil { + t.Fatalf("Set: %v", err) + } + + var newTime time.Time + if err := c.Get(ctx, key, &newTime); err != nil { + t.Fatalf("Get: %v", err) + } + if !firstTime.Equal(newTime) { + t.Errorf("Get: got value %v, want %v", newTime, firstTime) + } + + time.Sleep(4 * time.Second) + + if err := c.Get(ctx, key, &newTime); err != ErrCacheMiss { + t.Errorf("Get: got %v, want ErrCacheMiss", err) + } +} + +func TestShortExpiry(t *testing.T) { + c := getClient(t).WithCodec(Gob) + ctx := context.Background() + + key := "testshortexpiry" + + err := c.Set(ctx, &Item{ + Key: key, + Value: []byte("ok"), + Expiration: time.Millisecond, + }) + if err != nil { + t.Fatalf("Set: %v", err) + } + + if err := c.Get(ctx, key, nil); err != ErrCacheMiss { + t.Errorf("GetBytes: got %v, want ErrCacheMiss", err) + } +}