|
- // Copyright 2013 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 or at
- // https://developers.google.com/open-source/licenses/bsd.
-
- package main
-
- import (
- "net/url"
- "path"
- "regexp"
- "strings"
- )
-
- func importPathFromGoogleBrowse(m []string) string {
- project := m[1]
- dir := m[2]
- if dir == "" {
- dir = "/"
- } else if dir[len(dir)-1] == '/' {
- dir = dir[:len(dir)-1]
- }
- subrepo := ""
- if len(m[3]) > 0 {
- v, _ := url.ParseQuery(m[3][1:])
- subrepo = v.Get("repo")
- if len(subrepo) > 0 {
- subrepo = "." + subrepo
- }
- }
- if strings.HasPrefix(m[4], "#hg%2F") {
- d, _ := url.QueryUnescape(m[4][len("#hg%2f"):])
- if i := strings.IndexRune(d, '%'); i >= 0 {
- d = d[:i]
- }
- dir = dir + "/" + d
- }
- return "code.google.com/p/" + project + subrepo + dir
- }
-
- var browsePatterns = []struct {
- pat *regexp.Regexp
- fn func([]string) string
- }{
- {
- // GitHub tree browser.
- regexp.MustCompile(`^https?://(github\.com/[^/]+/[^/]+)(?:/tree/[^/]+(/.*))?$`),
- func(m []string) string { return m[1] + m[2] },
- },
- {
- // GitHub file browser.
- regexp.MustCompile(`^https?://(github\.com/[^/]+/[^/]+)/blob/[^/]+/(.*)$`),
- func(m []string) string {
- d := path.Dir(m[2])
- if d == "." {
- return m[1]
- }
- return m[1] + "/" + d
- },
- },
- {
- // GitHub issues, pulls, etc.
- regexp.MustCompile(`^https?://(github\.com/[^/]+/[^/]+)(.*)$`),
- func(m []string) string { return m[1] },
- },
- {
- // Bitbucket source borwser.
- regexp.MustCompile(`^https?://(bitbucket\.org/[^/]+/[^/]+)(?:/src/[^/]+(/[^?]+)?)?`),
- func(m []string) string { return m[1] + m[2] },
- },
- {
- // Google Project Hosting source browser.
- regexp.MustCompile(`^http:/+code\.google\.com/p/([^/]+)/source/browse(/[^?#]*)?(\?[^#]*)?(#.*)?$`),
- importPathFromGoogleBrowse,
- },
- {
- // Launchpad source browser.
- regexp.MustCompile(`^https?:/+bazaar\.(launchpad\.net/.*)/files$`),
- func(m []string) string { return m[1] },
- },
- {
- regexp.MustCompile(`^https?://(.+)$`),
- func(m []string) string { return strings.Trim(m[1], "/") },
- },
- }
-
- // isBrowserURL returns importPath and true if URL looks like a URL for a VCS
- // source browser.
- func isBrowseURL(s string) (importPath string, ok bool) {
- for _, c := range browsePatterns {
- if m := c.pat.FindStringSubmatch(s); m != nil {
- return c.fn(m), true
- }
- }
- return "", false
- }
|