From f45719d227ed3d1bc455c961510e9c68ebe34eec Mon Sep 17 00:00:00 2001 From: GeertJohan Date: Sat, 5 Apr 2014 13:34:49 +0200 Subject: [PATCH 1/4] Strip out go. from clean package name. --- page.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/page.go b/page.go index c5eb832..e150d28 100644 --- a/page.go +++ b/page.go @@ -218,7 +218,7 @@ func renderPackagePage(resp http.ResponseWriter, req *http.Request, repo *Repo) sort.Sort(sort.Reverse(data.LatestVersions)) data.CleanPackageName = repo.PackageName - if strings.HasPrefix(data.CleanPackageName, "go-") { + if strings.HasPrefix(data.CleanPackageName, "go-") || strings.HasPrefix(data.CleanPackageName, "go.") { data.CleanPackageName = data.CleanPackageName[3:] } if strings.HasSuffix(data.CleanPackageName, "-go") { From 51bc41a12811827e9e492329e74cec6ac27a6cb3 Mon Sep 17 00:00:00 2001 From: GeertJohan Date: Sat, 5 Apr 2014 13:39:38 +0200 Subject: [PATCH 2/4] Update regexp patternNew to allow dot in package name --- main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main.go b/main.go index 664579a..4ec9782 100644 --- a/main.go +++ b/main.go @@ -117,7 +117,7 @@ func (repo *Repo) GopkgVersionRoot(version Version) string { } var patternOld = regexp.MustCompile(`^/(?:([a-z0-9][-a-z0-9]+)/)?((?:v0|v[1-9][0-9]*)(?:\.0|\.[1-9][0-9]*){0,2})/([a-zA-Z][-a-zA-Z0-9]*)(?:\.git)?((?:/[a-zA-Z][-a-zA-Z0-9]*)*)$`) -var patternNew = regexp.MustCompile(`^/(?:([a-zA-Z0-9][-a-zA-Z0-9]+)/)?([a-zA-Z][-a-zA-Z0-9]*)\.((?:v0|v[1-9][0-9]*)(?:\.0|\.[1-9][0-9]*){0,2})(?:\.git)?((?:/[a-zA-Z][-a-zA-Z0-9]*)*)$`) +var patternNew = regexp.MustCompile(`^/(?:([a-zA-Z0-9][-a-zA-Z0-9]+)/)?([a-zA-Z][.\-a-zA-Z0-9]*)\.((?:v0|v[1-9][0-9]*)(?:\.0|\.[1-9][0-9]*){0,2})(?:\.git)?((?:/[a-zA-Z][-a-zA-Z0-9]*)*)$`) func handler(resp http.ResponseWriter, req *http.Request) { if req.URL.Path == "/health-check" { From d0adad6501c1964c11568d4502c5ec7495d20aef Mon Sep 17 00:00:00 2001 From: GeertJohan Date: Sun, 6 Apr 2014 18:36:53 +0200 Subject: [PATCH 3/4] Rename field Repo.PackageName to Repo.Name --- main.go | 22 +++++++++++----------- page.go | 26 +++++++++++++------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/main.go b/main.go index 4ec9782..0c541af 100644 --- a/main.go +++ b/main.go @@ -69,7 +69,7 @@ go get {{.GopkgPath}} type Repo struct { User string - PackageName string + Name string SubPath string OldFormat bool MajorVersion Version @@ -79,9 +79,9 @@ type Repo struct { // GitHubRoot returns the repository root at GitHub, without a schema. func (repo *Repo) GitHubRoot() string { if repo.User == "" { - return "github.com/go-" + repo.PackageName + "/" + repo.PackageName + return "github.com/go-" + repo.Name + "/" + repo.Name } else { - return "github.com/" + repo.User + "/" + repo.PackageName + return "github.com/" + repo.User + "/" + repo.Name } } @@ -103,15 +103,15 @@ func (repo *Repo) GopkgVersionRoot(version Version) string { v := version.String() if repo.OldFormat { if repo.User == "" { - return "gopkg.in/" + v + "/" + repo.PackageName + return "gopkg.in/" + v + "/" + repo.Name } else { - return "gopkg.in/" + repo.User + "/" + v + "/" + repo.PackageName + return "gopkg.in/" + repo.User + "/" + v + "/" + repo.Name } } else { if repo.User == "" { - return "gopkg.in/" + repo.PackageName + "." + v + return "gopkg.in/" + repo.Name + "." + v } else { - return "gopkg.in/" + repo.User + "/" + repo.PackageName + "." + v + return "gopkg.in/" + repo.User + "/" + repo.Name + "." + v } } } @@ -152,10 +152,10 @@ func handler(resp http.ResponseWriter, req *http.Request) { } repo := &Repo{ - User: m[1], - PackageName: m[2], - SubPath: m[4], - OldFormat: oldFormat, + User: m[1], + Name: m[2], + SubPath: m[4], + OldFormat: oldFormat, } var ok bool diff --git a/page.go b/page.go index e150d28..c05b952 100644 --- a/page.go +++ b/page.go @@ -14,7 +14,7 @@ const packageTemplateString = ` - {{.Repo.PackageName}}.{{.Repo.MajorVersion}}{{.Repo.SubPath}} - {{.Repo.GopkgPath}} + {{.Repo.Name}}.{{.Repo.MajorVersion}}{{.Repo.SubPath}} - {{.Repo.GopkgPath}} @@ -129,7 +129,7 @@ const packageTemplateString = `

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

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

Refer to it as {{.CleanPackageName}}.{{end}} + {{if .CleanName}}

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

For more details, see the API documentation.

@@ -193,10 +193,10 @@ func init() { } 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 + Repo *Repo + LatestVersions VersionList // Contains only the latest version for each major + FullVersion Version // Version that the major requested resolves to + CleanName string } func renderPackagePage(resp http.ResponseWriter, req *http.Request, repo *Repo) { @@ -217,21 +217,21 @@ func renderPackagePage(resp http.ResponseWriter, req *http.Request, repo *Repo) } sort.Sort(sort.Reverse(data.LatestVersions)) - data.CleanPackageName = repo.PackageName - if strings.HasPrefix(data.CleanPackageName, "go-") || strings.HasPrefix(data.CleanPackageName, "go.") { - data.CleanPackageName = data.CleanPackageName[3:] + data.CleanName = repo.Name + if strings.HasPrefix(data.CleanName, "go-") || strings.HasPrefix(data.CleanName, "go.") { + data.CleanName = data.CleanName[3:] } - if strings.HasSuffix(data.CleanPackageName, "-go") { - data.CleanPackageName = data.CleanPackageName[:len(data.CleanPackageName)-3] + if strings.HasSuffix(data.CleanName, "-go") { + data.CleanName = data.CleanName[:len(data.CleanName)-3] } - for i, c := range data.CleanPackageName { + for i, c := range data.CleanName { if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' { continue } if i > 0 && (c == '_' || c >= '0' && c <= '9') { continue } - data.CleanPackageName = "" + data.CleanName = "" break } From c5b57c5f488c824117205fd62162693b4b4e62ce Mon Sep 17 00:00:00 2001 From: GeertJohan Date: Sun, 6 Apr 2014 19:25:50 +0200 Subject: [PATCH 4/4] Screenscrap package name from godoc.org --- page.go | 35 ++++++++++++++++------------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/page.go b/page.go index c05b952..4b3d170 100644 --- a/page.go +++ b/page.go @@ -3,11 +3,12 @@ package main import ( "fmt" "html/template" + "io/ioutil" "log" "net/http" "os" + "regexp" "sort" - "strings" ) const packageTemplateString = ` @@ -129,7 +130,7 @@ const packageTemplateString = `

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

import "{{.Repo.GopkgPath}}"
- {{if .CleanName}}

Refer to it as {{.CleanName}}.{{end}} + {{if .PackageName}}

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

For more details, see the API documentation.

@@ -196,9 +197,11 @@ type packageData struct { Repo *Repo LatestVersions VersionList // Contains only the latest version for each major FullVersion Version // Version that the major requested resolves to - CleanName string + PackageName string // Actual package identifier as specified in http://golang.org/ref/spec#PackageClause } +var regexpPackageName = regexp.MustCompile(`\

package ([\p{L}_][\pL\p{Nd}_]*)\`) + func renderPackagePage(resp http.ResponseWriter, req *http.Request, repo *Repo) { data := &packageData{ Repo: repo, @@ -217,25 +220,19 @@ func renderPackagePage(resp http.ResponseWriter, req *http.Request, repo *Repo) } sort.Sort(sort.Reverse(data.LatestVersions)) - data.CleanName = repo.Name - if strings.HasPrefix(data.CleanName, "go-") || strings.HasPrefix(data.CleanName, "go.") { - data.CleanName = data.CleanName[3:] - } - if strings.HasSuffix(data.CleanName, "-go") { - data.CleanName = data.CleanName[:len(data.CleanName)-3] - } - for i, c := range data.CleanName { - if c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' { - continue - } - if i > 0 && (c == '_' || c >= '0' && c <= '9') { - continue + godocResp, err := http.Get("http://godoc.org/" + repo.GopkgPath()) + if err == nil { + godocRespBytes, err := ioutil.ReadAll(godocResp.Body) + godocResp.Body.Close() + if err == nil { + matches := regexpPackageName.FindSubmatch(godocRespBytes) + if len(matches) == 2 { + data.PackageName = string(matches[1]) + } } - data.CleanName = "" - break } - err := packageTemplate.Execute(resp, data) + err = packageTemplate.Execute(resp, data) if err != nil { log.Printf("error executing tmplPackage: %s\n", err) }