package url import ( "regexp" ) var ( isSchemeRegExp = regexp.MustCompile(`^[^:]+://`) // Ref: https://github.com/git/git/blob/master/Documentation/urls.txt#L37 scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P[^@]+)@)?(?P[^:\s]+):(?:(?P[0-9]{1,5}):)?(?P[^\\].*)$`) ) // MatchesScheme returns true if the given string matches a URL-like // format scheme. func MatchesScheme(url string) bool { return isSchemeRegExp.MatchString(url) } // MatchesScpLike returns true if the given string matches an SCP-like // format scheme. func MatchesScpLike(url string) bool { return scpLikeUrlRegExp.MatchString(url) } // FindScpLikeComponents returns the user, host, port and path of the // given SCP-like URL. func FindScpLikeComponents(url string) (user, host, port, path string) { m := scpLikeUrlRegExp.FindStringSubmatch(url) return m[1], m[2], m[3], m[4] } // IsLocalEndpoint returns true if the given URL string specifies a // local file endpoint. For example, on a Linux machine, // `/home/user/src/go-git` would match as a local endpoint, but // `https://github.com/src-d/go-git` would not. func IsLocalEndpoint(url string) bool { return !MatchesScheme(url) && !MatchesScpLike(url) }