From 76155cd29f9d2ad99199de14ca2cc2e7ae1830a7 Mon Sep 17 00:00:00 2001 From: Elvand-Lie Date: Mon, 10 Aug 2026 19:15:01 +0000 Subject: [PATCH] fix(git): avoid misclassifying GitLab repository URLs Signed-off-by: Elvand-Lie --- pkg/git/git.go | 27 ++++++++++++++++++--------- pkg/git/git_test.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/pkg/git/git.go b/pkg/git/git.go index 80fecddeae..6ec3591d25 100644 --- a/pkg/git/git.go +++ b/pkg/git/git.go @@ -7,6 +7,7 @@ import ( "strconv" "strings" + giturls "github.com/chainguard-dev/git-urls" "github.com/openshift-pipelines/pipelines-as-code/pkg/formatting" "knative.dev/func/pkg/git/github" @@ -37,16 +38,24 @@ func (sp SupportedProviders) PrettyString() string { return b.String() } -func GitProviderName(url string) (string, error) { - switch { - case strings.Contains(url, "github"): - return GitHubProvider, nil - case strings.Contains(url, "gitlab"): - return GitLabProvider, nil - case strings.Contains(url, "bitbucket-cloud"): - //return BitBucketProvider, nil +func GitProviderName(rawURL string) (string, error) { + parsedURL, err := giturls.ParseTransport(rawURL) + if err != nil { + parsedURL, err = giturls.ParseScp(rawURL) + } + if err == nil { + for _, label := range strings.Split(strings.ToLower(parsedURL.Hostname()), ".") { + switch label { + case GitHubProvider: + return GitHubProvider, nil + case GitLabProvider: + return GitLabProvider, nil + case BitBucketProvider: + //return BitBucketProvider, nil + } + } } - return "", fmt.Errorf("runtime for url %q is not supported, please use one of supported runtimes: %s", url, SupportedProvidersList.PrettyString()) + return "", fmt.Errorf("runtime for url %q is not supported, please use one of supported runtimes: %s", rawURL, SupportedProvidersList.PrettyString()) } // RepoOwnerAndNameFromUrl for input url returns repo owner and repo name diff --git a/pkg/git/git_test.go b/pkg/git/git_test.go index 1d3848f85a..3e9c30ac1f 100644 --- a/pkg/git/git_test.go +++ b/pkg/git/git_test.go @@ -73,6 +73,51 @@ func TestGitProviderName(t *testing.T) { wantProvider: GitLabProvider, wantErr: false, }, + { + name: "GitLab repository path contains GitHub", + url: "https://gitlab.com/foo/github-actions", + wantProvider: GitLabProvider, + wantErr: false, + }, + { + name: "GitHub repository path contains GitLab", + url: "https://github.com/foo/gitlab-runner", + wantProvider: GitHubProvider, + wantErr: false, + }, + { + name: "GitHub SSH", + url: "git@github.com:foo/bar.git", + wantProvider: GitHubProvider, + wantErr: false, + }, + { + name: "GitLab SCP repository path contains GitHub", + url: "git@gitlab.com:foo/github-actions.git", + wantProvider: GitLabProvider, + wantErr: false, + }, + { + name: "Provider name only in path - not supported", + url: "https://example.com/foo/github-actions", + wantErr: true, + }, + { + name: "Provider name only in username - not supported", + url: "https://github@example.com/foo/bar", + wantErr: true, + }, + { + name: "Provider name is not a complete host label - not supported", + url: "https://notgithub.example.com/foo/bar", + wantErr: true, + }, + { + name: "Uppercase GitLab host", + url: "https://GITLAB.COM/foo/bar", + wantProvider: GitLabProvider, + wantErr: false, + }, { name: "Bitbucket Cloud - not supported", url: "https://bitbucket.com/foo/bar",