Skip to content

Commit

Permalink
feat(detector): provide a detector for repository hosted on GitLab.com (
Browse files Browse the repository at this point in the history
  • Loading branch information
davinkevin authored Sep 16, 2020
1 parent 81f79b4 commit 437601e
Show file tree
Hide file tree
Showing 4 changed files with 94 additions and 0 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ is built-in by default:
file URLs.
* GitHub URLs, such as "github.com/mitchellh/vagrant" are automatically
changed to Git protocol over HTTP.
* GitLab URLs, such as "gitlab.com/inkscape/inkscape" are automatically
changed to Git protocol over HTTP.
* BitBucket URLs, such as "bitbucket.org/mitchellh/vagrant" are automatically
changed to a Git or mercurial protocol using the BitBucket API.

Expand Down
1 change: 1 addition & 0 deletions detect.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ var Detectors []Detector
func init() {
Detectors = []Detector{
new(GitHubDetector),
new(GitLabDetector),
new(GitDetector),
new(BitBucketDetector),
new(S3Detector),
Expand Down
47 changes: 47 additions & 0 deletions detect_gitlab.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package getter

import (
"fmt"
"net/url"
"strings"
)

// GitLabDetector implements Detector to detect GitLab URLs and turn
// them into URLs that the Git Getter can understand.
type GitLabDetector struct{}

func (d *GitLabDetector) Detect(src, _ string) (string, bool, error) {
if len(src) == 0 {
return "", false, nil
}

if strings.HasPrefix(src, "gitlab.com/") {
return d.detectHTTP(src)
}

return "", false, nil
}

func (d *GitLabDetector) detectHTTP(src string) (string, bool, error) {
parts := strings.Split(src, "/")
if len(parts) < 3 {
return "", false, fmt.Errorf(
"GitLab URLs should be gitlab.com/username/repo")
}

urlStr := fmt.Sprintf("https://%s", strings.Join(parts[:3], "/"))
repoUrl, err := url.Parse(urlStr)
if err != nil {
return "", true, fmt.Errorf("error parsing GitLab URL: %s", err)
}

if !strings.HasSuffix(repoUrl.Path, ".git") {
repoUrl.Path += ".git"
}

if len(parts) > 3 {
repoUrl.Path += "//" + strings.Join(parts[3:], "/")
}

return "git::" + repoUrl.String(), true, nil
}
44 changes: 44 additions & 0 deletions detect_gitlab_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package getter

import (
"testing"
)

func TestGitLabDetector(t *testing.T) {
cases := []struct {
Input string
Output string
}{
// HTTP
{"gitlab.com/hashicorp/foo", "git::https://gitlab.com/hashicorp/foo.git"},
{"gitlab.com/hashicorp/foo.git", "git::https://gitlab.com/hashicorp/foo.git"},
{
"gitlab.com/hashicorp/foo/bar",
"git::https://gitlab.com/hashicorp/foo.git//bar",
},
{
"gitlab.com/hashicorp/foo?foo=bar",
"git::https://gitlab.com/hashicorp/foo.git?foo=bar",
},
{
"gitlab.com/hashicorp/foo.git?foo=bar",
"git::https://gitlab.com/hashicorp/foo.git?foo=bar",
},
}

pwd := "/pwd"
f := new(GitLabDetector)
for i, tc := range cases {
output, ok, err := f.Detect(tc.Input, pwd)
if err != nil {
t.Fatalf("err: %s", err)
}
if !ok {
t.Fatal("not ok")
}

if output != tc.Output {
t.Fatalf("%d: bad: %#v", i, output)
}
}
}

0 comments on commit 437601e

Please sign in to comment.