From 561a0d227296a0217f876fe34f86eac83772669f Mon Sep 17 00:00:00 2001 From: passionSeven Date: Wed, 22 Apr 2020 17:36:02 -0400 Subject: [PATCH] cmd/golangorg: generate major version list on Go project page This change builds on what was done in CL 229081, and uses the Go release history data from internal/history package to generate the list of major Go versions on the Go project page. This way, this page doesn't need to be manually edited when major Go releases are made. For golang/go#38488. For golang/go#29205. For golang/go#29206. Change-Id: Ie0b12707d828207173a54f0a1bc6a4ef69dcedef Reviewed-on: https://go-review.googlesource.com/c/website/+/229483 Run-TryBot: Dmitri Shuralyov TryBot-Result: Gobot Gobot Reviewed-by: Alexander Rakoczy --- cmd/golangorg/handlers.go | 21 ++++++ cmd/golangorg/project.go | 114 ++++++++++++++++++++++++++++++++ cmd/golangorg/regtest_test.go | 10 +++ cmd/golangorg/release.go | 2 +- content/static/doc/contrib.html | 16 +++-- content/static/static.go | 2 +- 6 files changed, 156 insertions(+), 9 deletions(-) create mode 100644 cmd/golangorg/project.go diff --git a/cmd/golangorg/handlers.go b/cmd/golangorg/handlers.go index d40c486a..1cafdcbd 100644 --- a/cmd/golangorg/handlers.go +++ b/cmd/golangorg/handlers.go @@ -87,6 +87,7 @@ func registerHandlers(pres *godoc.Presentation) *http.ServeMux { mux.Handle("/pkg/C/", redirect.Handler("/cmd/cgo/")) mux.HandleFunc("/fmt", fmtHandler) mux.Handle("/doc/devel/release.html", releaseHandler{ReleaseHistory: sortReleases(history.Releases)}) + handleRootAndSubtree(mux, "/project/", projectHandler{ReleaseHistory: sortMajorReleases(history.Releases)}, pres) redirect.Register(mux) http.Handle("/", hostEnforcerHandler{mux}) @@ -94,6 +95,26 @@ func registerHandlers(pres *godoc.Presentation) *http.ServeMux { return mux } +// handleRootAndSubtree registers a handler for the given pattern in mux. +// The handler selects between root or subtree handlers to handle requests. +// +// The root handler is used for requests with URL path equal to the pattern, +// and the subtree handler is used for all other requests matched by pattern. +// +// The pattern must have a trailing slash ('/'), otherwise handleRoot panics. +func handleRootAndSubtree(mux *http.ServeMux, path string, root, subtree http.Handler) { + if !strings.HasSuffix(path, "/") { + panic("handleRootAndSubtree must be used on patterns with a trailing slash ('/')") + } + mux.HandleFunc(path, func(w http.ResponseWriter, req *http.Request) { + if req.URL.Path == path { + root.ServeHTTP(w, req) + } else { + subtree.ServeHTTP(w, req) + } + }) +} + func readTemplate(name string) *template.Template { if pres == nil { panic("no global Presentation set yet") diff --git a/cmd/golangorg/project.go b/cmd/golangorg/project.go new file mode 100644 index 00000000..dd5e8d36 --- /dev/null +++ b/cmd/golangorg/project.go @@ -0,0 +1,114 @@ +// Copyright 2020 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 main + +import ( + "bytes" + "fmt" + "html/template" + "log" + "net/http" + "sort" + + "golang.org/x/tools/godoc" + "golang.org/x/tools/godoc/vfs" + "golang.org/x/website/internal/history" +) + +// projectHandler serves The Go Project page. +type projectHandler struct { + ReleaseHistory []MajorRelease // Pre-computed release history to display. +} + +func (h projectHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { + const relPath = "doc/contrib.html" + + src, err := vfs.ReadFile(fs, relPath) + if err != nil { + log.Printf("reading template %s: %v", relPath, err) + pres.ServeError(w, req, relPath, err) + return + } + + meta, src, err := extractMetadata(src) + if err != nil { + log.Printf("decoding metadata %s: %v", relPath, err) + pres.ServeError(w, req, relPath, err) + return + } + if !meta.Template { + err := fmt.Errorf("got non-template, want template") + log.Printf("unexpected metadata %s: %v", relPath, err) + pres.ServeError(w, req, relPath, err) + return + } + + page := godoc.Page{ + Title: meta.Title, + Subtitle: meta.Subtitle, + GoogleCN: googleCN(req), + } + data := projectTemplateData{ + Major: h.ReleaseHistory, + } + + // Evaluate as HTML template. + tmpl, err := template.New("").Parse(string(src)) + if err != nil { + log.Printf("parsing template %s: %v", relPath, err) + pres.ServeError(w, req, relPath, err) + return + } + var buf bytes.Buffer + if err := tmpl.Execute(&buf, data); err != nil { + log.Printf("executing template %s: %v", relPath, err) + pres.ServeError(w, req, relPath, err) + return + } + src = buf.Bytes() + + page.Body = src + pres.ServePage(w, page) +} + +// sortMajorReleases returns a sorted list of major Go releases, +// suitable to be displayed on the Go project page. +func sortMajorReleases(rs map[history.GoVer]history.Release) []MajorRelease { + var major []MajorRelease + for v, r := range rs { + if !v.IsMajor() { + continue + } + major = append(major, MajorRelease{ver: v, rel: r}) + } + sort.Slice(major, func(i, j int) bool { + if major[i].ver.X != major[j].ver.X { + return major[i].ver.X > major[j].ver.X + } + return major[i].ver.Y > major[j].ver.Y + }) + return major +} + +type projectTemplateData struct { + Major []MajorRelease +} + +// MajorRelease represents a major Go release entry as displayed on the Go project page. +type MajorRelease struct { + ver history.GoVer + rel history.Release +} + +// V returns the Go release version string, like "1.14", "1.14.1", "1.14.2", etc. +func (r MajorRelease) V() string { + return r.ver.String() +} + +// Date returns the date of the release, formatted for display on the Go project page. +func (r MajorRelease) Date() string { + d := r.rel.Date + return fmt.Sprintf("%s %d", d.Month, d.Year) +} diff --git a/cmd/golangorg/regtest_test.go b/cmd/golangorg/regtest_test.go index 58127d15..e2359905 100644 --- a/cmd/golangorg/regtest_test.go +++ b/cmd/golangorg/regtest_test.go @@ -128,6 +128,16 @@ func TestLiveServer(t *testing.T) { Path: "/doc/devel/release.html", Regexp: `go1\.14\.2\s+\(released 2020/04/08\)\s+includes\s+fixes to cgo, the go command, the runtime,`, }, + { + Message: "Go project page has an entry for Go 1.14", + Path: "/project/", + Substring: `
  • Go 1.14 (February 2020)
  • `, + }, + { + Message: "Go project subpath does not exist", + Path: "/project/notexist", + StatusCode: http.StatusNotFound, + }, } for _, tc := range substringTests { diff --git a/cmd/golangorg/release.go b/cmd/golangorg/release.go index 61def3f4..e21c4c2b 100644 --- a/cmd/golangorg/release.go +++ b/cmd/golangorg/release.go @@ -27,7 +27,7 @@ type releaseHandler struct { func (h releaseHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { const relPath = "doc/devel/release.html" - src, err := vfs.ReadFile(fs, "/doc/devel/release.html") + src, err := vfs.ReadFile(fs, relPath) if err != nil { log.Printf("reading template %s: %v", relPath, err) pres.ServeError(w, req, relPath, err) diff --git a/content/static/doc/contrib.html b/content/static/doc/contrib.html index f0a01c5f..663ea90c 100644 --- a/content/static/doc/contrib.html +++ b/content/static/doc/contrib.html @@ -1,6 +1,7 @@ @@ -34,12 +35,13 @@

    Release History

    A summary of the changes between Go releases. Notes for the major releases:

      -
    • Go 1.14 (February 2020)
    • -
    • Go 1.13 (September 2019)
    • -
    • Go 1.12 (February 2019)
    • -
    • Go 1.11 (August 2018)
    • -
    • Go 1.10 (February 2018)
    • -
    • Go 1.9 (August 2017)
    • + {{range .Major -}} +
    • Go {{.V}} ({{.Date}})
    • + {{end -}} + + {{- /* Entries for Go 1.9 and newer are generated using data in the internal/history package. */ -}} + {{- /* Entries for Go 1.8 and older are hand-written as raw HTML below. */ -}} +
    • Go 1.8 (February 2017)
    • Go 1.7 (August 2016)
    • Go 1.6 (February 2016)
    • diff --git a/content/static/static.go b/content/static/static.go index cf5eb6b6..0209af73 100644 --- a/content/static/static.go +++ b/content/static/static.go @@ -49,7 +49,7 @@ var Files = map[string]string{ "doc/conduct.html": "\x0a\x0a\x0a\x0aAbout\x0a\x0a

      \x0aOnline\x20communities\x20include\x20people\x20from\x20many\x20different\x20backgrounds.\x0aThe\x20Go\x20contributors\x20are\x20committed\x20to\x20providing\x20a\x20friendly,\x20safe\x20and\x20welcoming\x0aenvironment\x20for\x20all,\x20regardless\x20of\x20gender\x20identity\x20and\x20expression,\x20sexual\x20orientation,\x0adisabilities,\x20neurodiversity,\x20physical\x20appearance,\x20body\x20size,\x20ethnicity,\x20nationality,\x0arace,\x20age,\x20religion,\x20or\x20similar\x20personal\x20characteristics.\x0a

      \x0a\x0a

      \x0aThe\x20first\x20goal\x20of\x20the\x20Code\x20of\x20Conduct\x20is\x20to\x20specify\x20a\x20baseline\x20standard\x0aof\x20behavior\x20so\x20that\x20people\x20with\x20different\x20social\x20values\x20and\x20communication\x0astyles\x20can\x20talk\x20about\x20Go\x20effectively,\x20productively,\x20and\x20respectfully.\x0a

      \x0a\x0a

      \x0aThe\x20second\x20goal\x20is\x20to\x20provide\x20a\x20mechanism\x20for\x20resolving\x20conflicts\x20in\x20the\x0acommunity\x20when\x20they\x20arise.\x0a

      \x0a\x0a

      \x0aThe\x20third\x20goal\x20of\x20the\x20Code\x20of\x20Conduct\x20is\x20to\x20make\x20our\x20community\x20welcoming\x20to\x0apeople\x20from\x20different\x20backgrounds.\x0aDiversity\x20is\x20critical\x20to\x20the\x20project;\x20for\x20Go\x20to\x20be\x20successful,\x20it\x20needs\x0acontributors\x20and\x20users\x20from\x20all\x20backgrounds.\x0a(See\x20Go,\x20Open\x20Source,\x20Community.)\x0a

      \x0a\x0a

      \x0aWe\x20believe\x20that\x20healthy\x20debate\x20and\x20disagreement\x20are\x20essential\x20to\x20a\x20healthy\x20project\x20and\x20community.\x0aHowever,\x20it\x20is\x20never\x20ok\x20to\x20be\x20disrespectful.\x0aWe\x20value\x20diverse\x20opinions,\x20but\x20we\x20value\x20respectful\x20behavior\x20more.\x0a

      \x0a\x0aGopher\x20values\x0a\x0a

      \x0aThese\x20are\x20the\x20values\x20to\x20which\x20people\x20in\x20the\x20Go\x20community\x20(\xe2\x80\x9cGophers\xe2\x80\x9d)\x20should\x20aspire.\x0a

      \x0a\x0a
        \x0a
      • Be\x20friendly\x20and\x20welcoming\x0a
      • Be\x20patient\x0a\x20\x20\x20\x20
          \x0a\x20\x20\x20\x20
        • Remember\x20that\x20people\x20have\x20varying\x20communication\x20styles\x20and\x20that\x20not\x0a\x20\x20\x20\x20\x20\x20\x20\x20everyone\x20is\x20using\x20their\x20native\x20language.\x0a\x20\x20\x20\x20\x20\x20\x20\x20(Meaning\x20and\x20tone\x20can\x20be\x20lost\x20in\x20translation.)\x0a\x20\x20\x20\x20
        \x0a
      • Be\x20thoughtful\x0a\x20\x20\x20\x20
          \x0a\x20\x20\x20\x20
        • Productive\x20communication\x20requires\x20effort.\x0a\x20\x20\x20\x20\x20\x20\x20\x20Think\x20about\x20how\x20your\x20words\x20will\x20be\x20interpreted.\x0a\x20\x20\x20\x20
        • Remember\x20that\x20sometimes\x20it\x20is\x20best\x20to\x20refrain\x20entirely\x20from\x20commenting.\x0a\x20\x20\x20\x20
        \x0a
      • Be\x20respectful\x0a\x20\x20\x20\x20
          \x0a\x20\x20\x20\x20
        • In\x20particular,\x20respect\x20differences\x20of\x20opinion.\x0a\x20\x20\x20\x20
        \x0a
      • Be\x20charitable\x0a\x20\x20\x20\x20
          \x0a\x20\x20\x20\x20
        • Interpret\x20the\x20arguments\x20of\x20others\x20in\x20good\x20faith,\x20do\x20not\x20seek\x20to\x20disagree.\x0a\x20\x20\x20\x20
        • When\x20we\x20do\x20disagree,\x20try\x20to\x20understand\x20why.\x0a\x20\x20\x20\x20
        \x0a
      • Avoid\x20destructive\x20behavior:\x0a\x20\x20\x20\x20
          \x0a\x20\x20\x20\x20
        • Derailing:\x20stay\x20on\x20topic;\x20if\x20you\x20want\x20to\x20talk\x20about\x20something\x20else,\x0a\x20\x20\x20\x20\x20\x20\x20\x20start\x20a\x20new\x20conversation.\x0a\x20\x20\x20\x20
        • Unconstructive\x20criticism:\x20don't\x20merely\x20decry\x20the\x20current\x20state\x20of\x20affairs;\x0a\x20\x20\x20\x20\x20\x20\x20\x20offer\xe2\x80\x94or\x20at\x20least\x20solicit\xe2\x80\x94suggestions\x20as\x20to\x20how\x20things\x20may\x20be\x20improved.\x0a\x20\x20\x20\x20
        • Snarking\x20(pithy,\x20unproductive,\x20sniping\x20comments)\x0a\x20\x20\x20\x20
        • Discussing\x20potentially\x20offensive\x20or\x20sensitive\x20issues;\x0a\x20\x20\x20\x20\x20\x20\x20\x20this\x20all\x20too\x20often\x20leads\x20to\x20unnecessary\x20conflict.\x0a\x20\x20\x20\x20
        • Microaggressions:\x20brief\x20and\x20commonplace\x20verbal,\x20behavioral\x20and\x0a\x20\x20\x20\x20\x20\x20\x20\x20environmental\x20indignities\x20that\x20communicate\x20hostile,\x20derogatory\x20or\x20negative\x0a\x20\x20\x20\x20\x20\x20\x20\x20slights\x20and\x20insults\x20to\x20a\x20person\x20or\x20group.\x0a\x20\x20\x20\x20
        \x0a
      \x0a\x0a

      \x0aPeople\x20are\x20complicated.\x0aYou\x20should\x20expect\x20to\x20be\x20misunderstood\x20and\x20to\x20misunderstand\x20others;\x0awhen\x20this\x20inevitably\x20occurs,\x20resist\x20the\x20urge\x20to\x20be\x20defensive\x20or\x20assign\x20blame.\x0aTry\x20not\x20to\x20take\x20offense\x20where\x20no\x20offense\x20was\x20intended.\x0aGive\x20people\x20the\x20benefit\x20of\x20the\x20doubt.\x0aEven\x20if\x20the\x20intent\x20was\x20to\x20provoke,\x20do\x20not\x20rise\x20to\x20it.\x0aIt\x20is\x20the\x20responsibility\x20of\x20all\x20parties\x20to\x20de-escalate\x20conflict\x20when\x20it\x20arises.\x0a

      \x0a\x0aCode\x20of\x20Conduct\x0a\x0aOur\x20Pledge\x0a\x0a

      In\x20the\x20interest\x20of\x20fostering\x20an\x20open\x20and\x20welcoming\x20environment,\x20we\x20as\x0acontributors\x20and\x20maintainers\x20pledge\x20to\x20making\x20participation\x20in\x20our\x20project\x20and\x0aour\x20community\x20a\x20harassment-free\x20experience\x20for\x20everyone,\x20regardless\x20of\x20age,\x20body\x0asize,\x20disability,\x20ethnicity,\x20gender\x20identity\x20and\x20expression,\x20level\x20of\x0aexperience,\x20education,\x20socio-economic\x20status,\x20nationality,\x20personal\x20appearance,\x0arace,\x20religion,\x20or\x20sexual\x20identity\x20and\x20orientation.

      \x0a\x0aOur\x20Standards\x0a\x0a

      Examples\x20of\x20behavior\x20that\x20contributes\x20to\x20creating\x20a\x20positive\x20environment\x0ainclude:

      \x0a\x0a
        \x0a
      • Using\x20welcoming\x20and\x20inclusive\x20language
      • \x0a
      • Being\x20respectful\x20of\x20differing\x20viewpoints\x20and\x20experiences
      • \x0a
      • Gracefully\x20accepting\x20constructive\x20criticism
      • \x0a
      • Focusing\x20on\x20what\x20is\x20best\x20for\x20the\x20community
      • \x0a
      • Showing\x20empathy\x20towards\x20other\x20community\x20members
      • \x0a
      \x0a\x0a

      Examples\x20of\x20unacceptable\x20behavior\x20by\x20participants\x20include:

      \x0a\x0a
        \x0a
      • The\x20use\x20of\x20sexualized\x20language\x20or\x20imagery\x20and\x20unwelcome\x20sexual\x20attention\x20or\x0aadvances
      • \x0a
      • Trolling,\x20insulting/derogatory\x20comments,\x20and\x20personal\x20or\x20political\x20attacks
      • \x0a
      • Public\x20or\x20private\x20harassment
      • \x0a
      • Publishing\x20others’\x20private\x20information,\x20such\x20as\x20a\x20physical\x20or\x20electronic\x0aaddress,\x20without\x20explicit\x20permission
      • \x0a
      • Other\x20conduct\x20which\x20could\x20reasonably\x20be\x20considered\x20inappropriate\x20in\x20a\x0aprofessional\x20setting
      • \x0a
      \x0a\x0aOur\x20Responsibilities\x0a\x0a

      Project\x20maintainers\x20are\x20responsible\x20for\x20clarifying\x20the\x20standards\x20of\x20acceptable\x0abehavior\x20and\x20are\x20expected\x20to\x20take\x20appropriate\x20and\x20fair\x20corrective\x20action\x20in\x0aresponse\x20to\x20any\x20instances\x20of\x20unacceptable\x20behavior.

      \x0a\x0a

      Project\x20maintainers\x20have\x20the\x20right\x20and\x20responsibility\x20to\x20remove,\x20edit,\x20or\x20reject\x0acomments,\x20commits,\x20code,\x20wiki\x20edits,\x20issues,\x20and\x20other\x20contributions\x20that\x20are\x0anot\x20aligned\x20to\x20this\x20Code\x20of\x20Conduct,\x20or\x20to\x20ban\x20temporarily\x20or\x20permanently\x20any\x0acontributor\x20for\x20other\x20behaviors\x20that\x20they\x20deem\x20inappropriate,\x20threatening,\x0aoffensive,\x20or\x20harmful.

      \x0a\x0aScope\x0a\x0a

      This\x20Code\x20of\x20Conduct\x20applies\x20both\x20within\x20project\x20spaces\x20and\x20in\x20public\x20spaces\x0awhen\x20an\x20individual\x20is\x20representing\x20the\x20project\x20or\x20its\x20community.\x20Examples\x20of\x0arepresenting\x20a\x20project\x20or\x20community\x20include\x20using\x20an\x20official\x20project\x20e-mail\x0aaddress,\x20posting\x20via\x20an\x20official\x20social\x20media\x20account,\x20or\x20acting\x20as\x20an\x20appointed\x0arepresentative\x20at\x20an\x20online\x20or\x20offline\x20event.\x20Representation\x20of\x20a\x20project\x20may\x20be\x0afurther\x20defined\x20and\x20clarified\x20by\x20project\x20maintainers.

      \x0a\x0a

      This\x20Code\x20of\x20Conduct\x20also\x20applies\x20outside\x20the\x20project\x20spaces\x20when\x20the\x20Project\x0aStewards\x20have\x20a\x20reasonable\x20belief\x20that\x20an\x20individual’s\x20behavior\x20may\x20have\x20a\x0anegative\x20impact\x20on\x20the\x20project\x20or\x20its\x20community.

      \x0a\x0aConflict\x20Resolution\x0a\x0a

      We\x20do\x20not\x20believe\x20that\x20all\x20conflict\x20is\x20bad;\x20healthy\x20debate\x20and\x20disagreement\x0aoften\x20yield\x20positive\x20results.\x20However,\x20it\x20is\x20never\x20okay\x20to\x20be\x20disrespectful\x20or\x0ato\x20engage\x20in\x20behavior\x20that\x20violates\x20the\x20project\xe2\x80\x99s\x20code\x20of\x20conduct.

      \x0a\x0a

      If\x20you\x20see\x20someone\x20violating\x20the\x20code\x20of\x20conduct,\x20you\x20are\x20encouraged\x20to\x20address\x0athe\x20behavior\x20directly\x20with\x20those\x20involved.\x20Many\x20issues\x20can\x20be\x20resolved\x20quickly\x0aand\x20easily,\x20and\x20this\x20gives\x20people\x20more\x20control\x20over\x20the\x20outcome\x20of\x20their\x0adispute.\x20If\x20you\x20are\x20unable\x20to\x20resolve\x20the\x20matter\x20for\x20any\x20reason,\x20or\x20if\x20the\x0abehavior\x20is\x20threatening\x20or\x20harassing,\x20report\x20it.\x20We\x20are\x20dedicated\x20to\x20providing\x0aan\x20environment\x20where\x20participants\x20feel\x20welcome\x20and\x20safe.

      \x0a\x0aReports\x20should\x20be\x20directed\x20to\x20Carmen\x20Andoh\x20and\x20Van\x20Riper,\x20the\x0aGo\x20Project\x20Stewards,\x20at\x20conduct@golang.org.\x0aIt\x20is\x20the\x20Project\x20Stewards\xe2\x80\x99\x20duty\x20to\x0areceive\x20and\x20address\x20reported\x20violations\x20of\x20the\x20code\x20of\x20conduct.\x20They\x20will\x20then\x0awork\x20with\x20a\x20committee\x20consisting\x20of\x20representatives\x20from\x20the\x20Open\x20Source\x0aPrograms\x20Office\x20and\x20the\x20Google\x20Open\x20Source\x20Strategy\x20team.\x20If\x20for\x20any\x20reason\x20you\x0aare\x20uncomfortable\x20reaching\x20out\x20the\x20Project\x20Stewards,\x20please\x20email\x0athe\x20Google\x20Open\x20Source\x20Programs\x20Office\x20at\x20opensource@google.com.

      \x0a\x0a

      We\x20will\x20investigate\x20every\x20complaint,\x20but\x20you\x20may\x20not\x20receive\x20a\x20direct\x20response.\x0aWe\x20will\x20use\x20our\x20discretion\x20in\x20determining\x20when\x20and\x20how\x20to\x20follow\x20up\x20on\x20reported\x0aincidents,\x20which\x20may\x20range\x20from\x20not\x20taking\x20action\x20to\x20permanent\x20expulsion\x20from\x0athe\x20project\x20and\x20project-sponsored\x20spaces.\x20We\x20will\x20notify\x20the\x20accused\x20of\x20the\x0areport\x20and\x20provide\x20them\x20an\x20opportunity\x20to\x20discuss\x20it\x20before\x20any\x20action\x20is\x20taken.\x0aThe\x20identity\x20of\x20the\x20reporter\x20will\x20be\x20omitted\x20from\x20the\x20details\x20of\x20the\x20report\x0asupplied\x20to\x20the\x20accused.\x20In\x20potentially\x20harmful\x20situations,\x20such\x20as\x20ongoing\x0aharassment\x20or\x20threats\x20to\x20anyone’s\x20safety,\x20we\x20may\x20take\x20action\x20without\x20notice.

      \x0a\x0aAttribution\x0a\x0a

      This\x20Code\x20of\x20Conduct\x20is\x20adapted\x20from\x20the\x20Contributor\x20Covenant,\x20version\x201.4,\x0aavailable\x20at\x0ahttps://www.contributor-covenant.org/version/1/4/code-of-conduct.html

      \x0a\x0aSummary\x0a\x0a
        \x0a
      • Treat\x20everyone\x20with\x20respect\x20and\x20kindness.\x0a
      • Be\x20thoughtful\x20in\x20how\x20you\x20communicate.\x0a
      • Don\xe2\x80\x99t\x20be\x20destructive\x20or\x20inflammatory.\x0a
      • If\x20you\x20encounter\x20an\x20issue,\x20please\x20mail\x20conduct@golang.org.\x0a
      \x0a", - "doc/contrib.html": "\x0a\x0a\x0a\x0a\x0a\x0a

      \x0aGo\x20is\x20an\x20open\x20source\x20project\x20developed\x20by\x20a\x20team\x20at\x0aGoogle\x20and\x20many\x0acontributors\x20from\x20the\x20open\x20source\x20community.\x0a

      \x0a\x0a

      \x0aGo\x20is\x20distributed\x20under\x20a\x20BSD-style\x20license.\x0a

      \x0a\x0aAnnouncements\x20Mailing\x20List\x0a

      \x0aA\x20low\x20traffic\x20mailing\x20list\x20for\x20important\x20announcements,\x20such\x20as\x20new\x20releases.\x0a

      \x0a

      \x0aWe\x20encourage\x20all\x20Go\x20users\x20to\x20subscribe\x20to\x0agolang-announce.\x0a

      \x0a\x0a\x0aVersion\x20history\x0a\x0aRelease\x20History\x0a\x0a

      A\x20summary\x20of\x20the\x20changes\x20between\x20Go\x20releases.\x20Notes\x20for\x20the\x20major\x20releases:

      \x0a\x0a
        \x0a\x09
      • Go\x201.14\x20(February\x202020)
      • \x0a\x09
      • Go\x201.13\x20(September\x202019)
      • \x0a\x09
      • Go\x201.12\x20(February\x202019)
      • \x0a\x09
      • Go\x201.11\x20(August\x202018)
      • \x0a\x09
      • Go\x201.10\x20(February\x202018)
      • \x0a\x09
      • Go\x201.9\x20(August\x202017)
      • \x0a\x09
      • Go\x201.8\x20(February\x202017)
      • \x0a\x09
      • Go\x201.7\x20(August\x202016)
      • \x0a\x09
      • Go\x201.6\x20(February\x202016)
      • \x0a\x09
      • Go\x201.5\x20(August\x202015)
      • \x0a\x09
      • Go\x201.4\x20(December\x202014)
      • \x0a\x09
      • Go\x201.3\x20(June\x202014)
      • \x0a\x09
      • Go\x201.2\x20(December\x202013)
      • \x0a\x09
      • Go\x201.1\x20(May\x202013)
      • \x0a\x09
      • Go\x201\x20(March\x202012)
      • \x0a
      \x0a\x0aGo\x201\x20and\x20the\x20Future\x20of\x20Go\x20Programs\x0a

      \x0aWhat\x20Go\x201\x20defines\x20and\x20the\x20backwards-compatibility\x20guarantees\x20one\x20can\x20expect\x20as\x0aGo\x201\x20matures.\x0a

      \x0a\x0a\x0aDeveloper\x20Resources\x0a\x0aSource\x20Code\x0a

      Check\x20out\x20the\x20Go\x20source\x20code.

      \x0a\x0aDiscussion\x20Mailing\x20List\x0a

      \x0aA\x20mailing\x20list\x20for\x20general\x20discussion\x20of\x20Go\x20programming.\x0a

      \x0a

      \x0aQuestions\x20about\x20using\x20Go\x20or\x20announcements\x20relevant\x20to\x20other\x20Go\x20users\x20should\x20be\x20sent\x20to\x0agolang-nuts.\x0a

      \x0a\x0aDeveloper\x20and\x0aCode\x20Review\x20Mailing\x20List\x0a

      The\x20golang-dev\x0amailing\x20list\x20is\x20for\x20discussing\x20code\x20changes\x20to\x20the\x20Go\x20project.\x0aThe\x20golang-codereviews\x0amailing\x20list\x20is\x20for\x20actual\x20reviewing\x20of\x20the\x20code\x20changes\x20(CLs).

      \x0a\x0aCheckins\x20Mailing\x20List\x0a

      A\x20mailing\x20list\x20that\x20receives\x20a\x20message\x20summarizing\x20each\x20checkin\x20to\x20the\x20Go\x20repository.

      \x0a\x0aBuild\x20Status\x0a

      View\x20the\x20status\x20of\x20Go\x20builds\x20across\x20the\x20supported\x20operating\x0asystems\x20and\x20architectures.

      \x0a\x0a\x0aHow\x20you\x20can\x20help\x0a\x0a

      Reporting\x20issues

      \x0a\x0a

      \x0aIf\x20you\x20spot\x20bugs,\x20mistakes,\x20or\x20inconsistencies\x20in\x20the\x20Go\x20project's\x20code\x20or\x0adocumentation,\x20please\x20let\x20us\x20know\x20by\x0afiling\x20a\x20ticket\x0aon\x20our\x20issue\x20tracker.\x0a(Of\x20course,\x20you\x20should\x20check\x20it's\x20not\x20an\x20existing\x20issue\x20before\x20creating\x0aa\x20new\x20one.)\x0a

      \x0a\x0a

      \x0aWe\x20pride\x20ourselves\x20on\x20being\x20meticulous;\x20no\x20issue\x20is\x20too\x20small.\x0a

      \x0a\x0a

      \x0aSecurity-related\x20issues\x20should\x20be\x20reported\x20to\x0asecurity@golang.org.
      \x0aSee\x20the\x20security\x20policy\x20for\x20more\x20details.\x0a

      \x0a\x0a

      \x0aCommunity-related\x20issues\x20should\x20be\x20reported\x20to\x0aconduct@golang.org.
      \x0aSee\x20the\x20Code\x20of\x20Conduct\x20for\x20more\x20details.\x0a

      \x0a\x0a

      Contributing\x20code\x20&\x20documentation

      \x0a\x0a

      \x0aGo\x20is\x20an\x20open\x20source\x20project\x20and\x20we\x20welcome\x20contributions\x20from\x20the\x20community.\x0a

      \x0a

      \x0aTo\x20get\x20started,\x20read\x20these\x20contribution\x0aguidelines\x20for\x20information\x20on\x20design,\x20testing,\x20and\x20our\x20code\x20review\x20process.\x0a

      \x0a

      \x0aCheck\x20the\x20tracker\x20for\x0aopen\x20issues\x20that\x20interest\x20you.\x20Those\x20labeled\x0ahelp\x20wanted\x0aare\x20particularly\x20in\x20need\x20of\x20outside\x20help.\x0a

      \x0a", + "doc/contrib.html": "\x0a\x0a\x0a\x0a\x0a\x0a

      \x0aGo\x20is\x20an\x20open\x20source\x20project\x20developed\x20by\x20a\x20team\x20at\x0aGoogle\x20and\x20many\x0acontributors\x20from\x20the\x20open\x20source\x20community.\x0a

      \x0a\x0a

      \x0aGo\x20is\x20distributed\x20under\x20a\x20BSD-style\x20license.\x0a

      \x0a\x0aAnnouncements\x20Mailing\x20List\x0a

      \x0aA\x20low\x20traffic\x20mailing\x20list\x20for\x20important\x20announcements,\x20such\x20as\x20new\x20releases.\x0a

      \x0a

      \x0aWe\x20encourage\x20all\x20Go\x20users\x20to\x20subscribe\x20to\x0agolang-announce.\x0a

      \x0a\x0a\x0aVersion\x20history\x0a\x0aRelease\x20History\x0a\x0a

      A\x20summary\x20of\x20the\x20changes\x20between\x20Go\x20releases.\x20Notes\x20for\x20the\x20major\x20releases:

      \x0a\x0a
        \x0a\x09{{range\x20.Major\x20-}}\x0a\x09
      • Go\x20{{.V}}\x20({{.Date}})
      • \x0a\x09{{end\x20-}}\x0a\x0a\x09{{-\x20/*\x20Entries\x20for\x20Go\x201.9\x20and\x20newer\x20are\x20generated\x20using\x20data\x20in\x20the\x20internal/history\x20package.\x20*/\x20-}}\x0a\x09{{-\x20/*\x20Entries\x20for\x20Go\x201.8\x20and\x20older\x20are\x20hand-written\x20as\x20raw\x20HTML\x20below.\x20*/\x20-}}\x0a\x0a\x09
      • Go\x201.8\x20(February\x202017)
      • \x0a\x09
      • Go\x201.7\x20(August\x202016)
      • \x0a\x09
      • Go\x201.6\x20(February\x202016)
      • \x0a\x09
      • Go\x201.5\x20(August\x202015)
      • \x0a\x09
      • Go\x201.4\x20(December\x202014)
      • \x0a\x09
      • Go\x201.3\x20(June\x202014)
      • \x0a\x09
      • Go\x201.2\x20(December\x202013)
      • \x0a\x09
      • Go\x201.1\x20(May\x202013)
      • \x0a\x09
      • Go\x201\x20(March\x202012)
      • \x0a
      \x0a\x0aGo\x201\x20and\x20the\x20Future\x20of\x20Go\x20Programs\x0a

      \x0aWhat\x20Go\x201\x20defines\x20and\x20the\x20backwards-compatibility\x20guarantees\x20one\x20can\x20expect\x20as\x0aGo\x201\x20matures.\x0a

      \x0a\x0a\x0aDeveloper\x20Resources\x0a\x0aSource\x20Code\x0a

      Check\x20out\x20the\x20Go\x20source\x20code.

      \x0a\x0aDiscussion\x20Mailing\x20List\x0a

      \x0aA\x20mailing\x20list\x20for\x20general\x20discussion\x20of\x20Go\x20programming.\x0a

      \x0a

      \x0aQuestions\x20about\x20using\x20Go\x20or\x20announcements\x20relevant\x20to\x20other\x20Go\x20users\x20should\x20be\x20sent\x20to\x0agolang-nuts.\x0a

      \x0a\x0aDeveloper\x20and\x0aCode\x20Review\x20Mailing\x20List\x0a

      The\x20golang-dev\x0amailing\x20list\x20is\x20for\x20discussing\x20code\x20changes\x20to\x20the\x20Go\x20project.\x0aThe\x20golang-codereviews\x0amailing\x20list\x20is\x20for\x20actual\x20reviewing\x20of\x20the\x20code\x20changes\x20(CLs).

      \x0a\x0aCheckins\x20Mailing\x20List\x0a

      A\x20mailing\x20list\x20that\x20receives\x20a\x20message\x20summarizing\x20each\x20checkin\x20to\x20the\x20Go\x20repository.

      \x0a\x0aBuild\x20Status\x0a

      View\x20the\x20status\x20of\x20Go\x20builds\x20across\x20the\x20supported\x20operating\x0asystems\x20and\x20architectures.

      \x0a\x0a\x0aHow\x20you\x20can\x20help\x0a\x0a

      Reporting\x20issues

      \x0a\x0a

      \x0aIf\x20you\x20spot\x20bugs,\x20mistakes,\x20or\x20inconsistencies\x20in\x20the\x20Go\x20project's\x20code\x20or\x0adocumentation,\x20please\x20let\x20us\x20know\x20by\x0afiling\x20a\x20ticket\x0aon\x20our\x20issue\x20tracker.\x0a(Of\x20course,\x20you\x20should\x20check\x20it's\x20not\x20an\x20existing\x20issue\x20before\x20creating\x0aa\x20new\x20one.)\x0a

      \x0a\x0a

      \x0aWe\x20pride\x20ourselves\x20on\x20being\x20meticulous;\x20no\x20issue\x20is\x20too\x20small.\x0a

      \x0a\x0a

      \x0aSecurity-related\x20issues\x20should\x20be\x20reported\x20to\x0asecurity@golang.org.
      \x0aSee\x20the\x20security\x20policy\x20for\x20more\x20details.\x0a

      \x0a\x0a

      \x0aCommunity-related\x20issues\x20should\x20be\x20reported\x20to\x0aconduct@golang.org.
      \x0aSee\x20the\x20Code\x20of\x20Conduct\x20for\x20more\x20details.\x0a

      \x0a\x0a

      Contributing\x20code\x20&\x20documentation

      \x0a\x0a

      \x0aGo\x20is\x20an\x20open\x20source\x20project\x20and\x20we\x20welcome\x20contributions\x20from\x20the\x20community.\x0a

      \x0a

      \x0aTo\x20get\x20started,\x20read\x20these\x20contribution\x0aguidelines\x20for\x20information\x20on\x20design,\x20testing,\x20and\x20our\x20code\x20review\x20process.\x0a

      \x0a

      \x0aCheck\x20the\x20tracker\x20for\x0aopen\x20issues\x20that\x20interest\x20you.\x20Those\x20labeled\x0ahelp\x20wanted\x0aare\x20particularly\x20in\x20need\x20of\x20outside\x20help.\x0a

      \x0a", "doc/copyright.html": "\x0a\x0a

      \x0a\x20\x20Except\x20as\x0a\x20\x20noted,\x20the\x20contents\x20of\x20this\x0a\x20\x20site\x20are\x20licensed\x20under\x20the\x0a\x20\x20Creative\x20Commons\x20Attribution\x203.0\x20License,\x0a\x20\x20and\x20code\x20is\x20licensed\x20under\x20a\x20BSD\x20license.\x0a

      \x0a",