diff --git a/main.go b/main.go index 664579a..b6cb387 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,21 +103,21 @@ 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 } } } 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" { @@ -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 6ea7c2b..8ce1a66 100644 --- a/page.go +++ b/page.go @@ -4,19 +4,20 @@ import ( "encoding/json" "fmt" "html/template" + "io/ioutil" "log" "net/http" "net/url" "os" + "regexp" "sort" - "strings" ) const packageTemplateString = ` - {{.Repo.PackageName}}.{{.Repo.MajorVersion}}{{.Repo.SubPath}} - {{.Repo.GopkgPath}} + {{.Repo.Name}}.{{.Repo.MajorVersion}}{{.Repo.SubPath}} - {{.Repo.GopkgPath}} @@ -138,7 +139,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 .PackageName}}

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

For more details, see the API documentation.

@@ -202,11 +203,11 @@ 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 - Synopsis string + Repo *Repo + LatestVersions VersionList // Contains only the latest version for each major + FullVersion Version // Version that the major requested resolves to + PackageName string // Actual package identifier as specified in http://golang.org/ref/spec#PackageClause + Synopsis string } // SearchResults is used with the godoc.org search API @@ -217,6 +218,8 @@ type SearchResults struct { } `json:"results"` } +var regexpPackageName = regexp.MustCompile(`

package ([\p{L}_][\p{L}\p{Nd}_]*)

`) + func renderPackagePage(resp http.ResponseWriter, req *http.Request, repo *Repo) { data := &packageData{ Repo: repo, @@ -237,23 +240,16 @@ func renderPackagePage(resp http.ResponseWriter, req *http.Request, repo *Repo) } sort.Sort(sort.Reverse(data.LatestVersions)) - // find clean package name - 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 + 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.CleanPackageName = "" - break } // retrieve synopsis