mirror of
https://github.com/dutchcoders/transfer.sh.git
synced 2024-12-04 01:40:19 +01:00
98 lines
2.3 KiB
Go
98 lines
2.3 KiB
Go
|
// 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
|
||
|
}
|