package main import ( "fmt" "html/template" "log" "net/http" "os" "sort" "strings" ) const packageTemplateString = ` {{.Repo.PackageName}}.{{.Repo.MajorVersion}}{{.Repo.SubPath}} - {{.Repo.GopkgPath}}

Getting started

To get the package, execute:

go get {{.Repo.GopkgPath}}

To import this package, add the following line to your code:

import "{{.Repo.GopkgPath}}"
{{if .CleanPackageName}}

Refer to it as {{.CleanPackageName}}.{{end}}

For more details, see the API documentation.

Versions

{{ if .LatestVersions }} {{ range .LatestVersions }}
v{{.Major}}{{.}}
{{ end }} {{ else }}
v0master
{{ end }}
` var packageTemplate *template.Template func gopkgVersionRoot(repo *Repo, version Version) string { return repo.GopkgVersionRoot(version) } var packageFuncs = template.FuncMap{ "gopkgVersionRoot": gopkgVersionRoot, } func init() { var err error packageTemplate, err = template.New("page").Funcs(packageFuncs).Parse(packageTemplateString) if err != nil { fmt.Fprintf(os.Stderr, "fatal: parsing package template failed: %s\n", err) os.Exit(1) } } type packageData struct { Repo *Repo LatestVersions VersionList // Contains only the latest version for each major FullVersion Version // Version that the major requested resolves to CleanPackageName string } func renderPackagePage(resp http.ResponseWriter, req *http.Request, repo *Repo) { data := &packageData{ Repo: repo, } latestVersionsMap := make(map[int]Version) for _, v := range repo.AllVersions { v2, exists := latestVersionsMap[v.Major] if !exists || v2.Less(v) { latestVersionsMap[v.Major] = v } } data.FullVersion = latestVersionsMap[repo.MajorVersion.Major] data.LatestVersions = make(VersionList, 0, len(latestVersionsMap)) for _, v := range latestVersionsMap { data.LatestVersions = append(data.LatestVersions, v) } sort.Sort(sort.Reverse(data.LatestVersions)) data.CleanPackageName = repo.PackageName if strings.HasPrefix(data.CleanPackageName, "go-") { data.CleanPackageName = data.CleanPackageName[3:] } if strings.HasSuffix(data.CleanPackageName, "-go") { data.CleanPackageName = data.CleanPackageName[:len(data.CleanPackageName)-3] } for i, c := range data.CleanPackageName { if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' { continue } if i > 0 && (c == '_' || c >= '0' && c <= '9') { continue } data.CleanPackageName = "" break } err := packageTemplate.Execute(resp, data) if err != nil { log.Printf("error executing tmplPackage: %s\n", err) } }