package getter import ( "fmt" "net/url" "regexp" "strings" ) // Note that we do not have an SSH-getter currently so this file serves // only to hold the detectSSH helper that is used by other detectors. // sshPattern matches SCP-like SSH patterns (user@host:path) var sshPattern = regexp.MustCompile("^(?:([^@]+)@)?([^:]+):/?(.+)$") // detectSSH determines if the src string matches an SSH-like URL and // converts it into a net.URL compatible string. This returns nil if the // string doesn't match the SSH pattern. // // This function is tested indirectly via detect_git_test.go func detectSSH(src string) (*url.URL, error) { matched := sshPattern.FindStringSubmatch(src) if matched == nil { return nil, nil } user := matched[1] host := matched[2] path := matched[3] qidx := strings.Index(path, "?") if qidx == -1 { qidx = len(path) } var u url.URL u.Scheme = "ssh" u.User = url.User(user) u.Host = host u.Path = path[0:qidx] if qidx < len(path) { q, err := url.ParseQuery(path[qidx+1:]) if err != nil { return nil, fmt.Errorf("error parsing GitHub SSH URL: %s", err) } u.RawQuery = q.Encode() } return &u, nil }