github.com/abdfnx/gh-api@v0.0.0-20210414084727-f5432eec23b8/git/url.go (about) 1 package git 2 3 import ( 4 "net/url" 5 "strings" 6 ) 7 8 func IsURL(u string) bool { 9 return strings.HasPrefix(u, "git@") || isSupportedProtocol(u) 10 } 11 12 func isSupportedProtocol(u string) bool { 13 return strings.HasPrefix(u, "ssh:") || 14 strings.HasPrefix(u, "git+ssh:") || 15 strings.HasPrefix(u, "git:") || 16 strings.HasPrefix(u, "http:") || 17 strings.HasPrefix(u, "https:") 18 } 19 20 func isPossibleProtocol(u string) bool { 21 return isSupportedProtocol(u) || 22 strings.HasPrefix(u, "ftp:") || 23 strings.HasPrefix(u, "ftps:") || 24 strings.HasPrefix(u, "file:") 25 } 26 27 // ParseURL normalizes git remote urls 28 func ParseURL(rawURL string) (u *url.URL, err error) { 29 if !isPossibleProtocol(rawURL) && 30 strings.ContainsRune(rawURL, ':') && 31 // not a Windows path 32 !strings.ContainsRune(rawURL, '\\') { 33 // support scp-like syntax for ssh protocol 34 rawURL = "ssh://" + strings.Replace(rawURL, ":", "/", 1) 35 } 36 37 u, err = url.Parse(rawURL) 38 if err != nil { 39 return 40 } 41 42 if u.Scheme == "git+ssh" { 43 u.Scheme = "ssh" 44 } 45 46 if u.Scheme != "ssh" { 47 return 48 } 49 50 if strings.HasPrefix(u.Path, "//") { 51 u.Path = strings.TrimPrefix(u.Path, "/") 52 } 53 54 if idx := strings.Index(u.Host, ":"); idx >= 0 { 55 u.Host = u.Host[0:idx] 56 } 57 58 return 59 }