Skip to content

Commit

Permalink
chore: gen project by adding branch name (#126)
Browse files Browse the repository at this point in the history
* chore: gen project by adding branch name

* chore: gen project by adding branch name
  • Loading branch information
qloog committed Jan 2, 2024
1 parent 3bfb1ae commit a5f51e0
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 0 deletions.
58 changes: 58 additions & 0 deletions cmd/eagle/internal/base/vcs_url.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package base

import (
"errors"
"net/url"
"regexp"
"strings"
)

var (
scpSyntaxRe = regexp.MustCompile(`^(\w+)@([\w.-]+):(.*)$`)
scheme = []string{"git", "https", "http", "git+ssh", "ssh", "file", "ftp", "ftps"}
)

// ParseVCSUrl ref https://github.com/golang/go/blob/master/src/cmd/go/internal/vcs/vcs.go
// see https://go-review.googlesource.com/c/go/+/12226/
// git url define https://git-scm.com/docs/git-clone#_git_urls
func ParseVCSUrl(repo string) (*url.URL, error) {
var (
repoURL *url.URL
err error
)

if m := scpSyntaxRe.FindStringSubmatch(repo); m != nil {
// Match SCP-like syntax and convert it to a URL.
// Eg, "git@github.com:user/repo" becomes
// "ssh://git@github.com/user/repo".
repoURL = &url.URL{
Scheme: "ssh",
User: url.User(m[1]),
Host: m[2],
Path: m[3],
}
} else {
if !strings.Contains(repo, "//") {
repo = "//" + repo
}
if strings.HasPrefix(repo, "//git@") {
repo = "ssh:" + repo
} else if strings.HasPrefix(repo, "//") {
repo = "https:" + repo
}
repoURL, err = url.Parse(repo)
if err != nil {
return nil, err
}
}

// Iterate over insecure schemes too, because this function simply
// reports the state of the repo. If we can't see insecure schemes then
// we can't report the actual repo URL.
for _, s := range scheme {
if repoURL.Scheme == s {
return repoURL, nil
}
}
return nil, errors.New("unable to parse repo url")
}
55 changes: 55 additions & 0 deletions cmd/eagle/internal/base/vcs_url_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package base

import (
"net"
"strings"
"testing"
)

func TestParseVCSUrl(t *testing.T) {
repos := []string{
// ssh://[user@]host.xz[:port]/path/to/repo.git/
"ssh://git@github.com:7875/go-eagle/eagle.git",
// git://host.xz[:port]/path/to/repo.git/
"git://github.com:7875/go-eagle/eagle.git",
// http[s]://host.xz[:port]/path/to/repo.git/
"https://github.com:7875/go-eagle/eagle.git",
// ftp[s]://host.xz[:port]/path/to/repo.git/
"ftps://github.com:7875/go-eagle/eagle.git",
//[user@]host.xz:path/to/repo.git/
"git@github.com:go-eagle/eagle.git",
// ssh://[user@]host.xz[:port]/~[user]/path/to/repo.git/
"ssh://git@github.com:7875/go-eagle/eagle.git",
// git://host.xz[:port]/~[user]/path/to/repo.git/
"git://github.com:7875/go-eagle/eagle.git",
//[user@]host.xz:/~[user]/path/to/repo.git/
"git@github.com:go-eagle/eagle.git",
///path/to/repo.git/
"~/go-eagle/eagle.git",
// file:///path/to/repo.git/
"file://~/go-eagle/eagle.git",
}
for _, repo := range repos {
url, err := ParseVCSUrl(repo)
if err != nil {
t.Fatal(repo, err)
}
urlPath := strings.TrimLeft(url.Path, "/")
if urlPath != "go-eagle/eagle.git" {
t.Fatal(repo, "parse url failed", urlPath)
}
}
}

func TestParseSsh(t *testing.T) {
repo := "ssh://git@github.com:7875/go-eagle/eagle.git"
url, err := ParseVCSUrl(repo)
if err != nil {
t.Fatal(err)
}
host, _, err := net.SplitHostPort(url.Host)
if err != nil {
host = url.Host
}
t.Log(host, url.Path)
}

0 comments on commit a5f51e0

Please sign in to comment.