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  }