| package url |
| |
| import ( |
| "regexp" |
| ) |
| |
| var ( |
| isSchemeRegExp = regexp.MustCompile(`^[^:]+://`) |
| scpLikeUrlRegExp = regexp.MustCompile(`^(?:(?P<user>[^@]+)@)?(?P<host>[^:\s]+):(?:(?P<port>[0-9]{1,5})/)?(?P<path>[^\\].*)$`) |
| ) |
| |
| // 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) |
| } |