mirror of
https://github.com/coder/coder.git
synced 2026-09-24 15:04:27 +08:00
feat: add GitLab support to coderd/externalauth/gitprovider
Fixes CODAGT-146 Add GitLab support to the gitprovider package for gitsync/chatd PR diff flows. This is a squashed stack of 3 PRs: #25651 - refactor(coderd/externalauth): prepare gitprovider for multi-provider support - Change gitprovider.New to return (Provider, error) - Extract shared helpers (parseRetryAfter, checkRateLimitError, countDiffLines, escapePathPreserveSlashes) from github.go - Update all callers (db2sdk, exp_chats, gitsync) for new signature - Add error logging for provider construction failures - Thread context through provider resolution #25652 - feat(coderd/externalauth/gitprovider): add GitLab provider - Implement full Provider interface: FetchPullRequestStatus, FetchPullRequestDiff, FetchBranchDiff, ResolveBranchPullRequest - Handle nested groups, forks, and self-hosted instances - Rate limit detection on both library and raw HTTP paths - URL parsing/building with NormalizePullRequestURL support - Unit tests covering error paths, URL parsing, state mapping - Document GitLab configuration and known limitations #25653 - test(coderd/externalauth/gitprovider): add GitLab VCR integration tests - FetchPullRequestStatus: 4 fixtures (open, conflicts, merged, closed) - FetchPullRequestDiff: 4 fixtures - FetchBranchDiff: 3 fixtures (open, deleted, fork) - ResolveBranchPullRequest: 3 fixtures - go-vcr cassettes with sanitized GitLab API responses
This commit is contained in:
@@ -117,13 +117,14 @@ type Config struct {
|
||||
CodeChallengeMethodsSupported []promoauth.Oauth2PKCEChallengeMethod
|
||||
}
|
||||
|
||||
// Git returns a Provider for this config if the provider type
|
||||
// is a supported git hosting provider. Returns nil for non-git
|
||||
// providers (e.g. Slack, JFrog).
|
||||
func (c *Config) Git(client *http.Client) gitprovider.Provider {
|
||||
// Git returns a Provider for this config if the provider type is a
|
||||
// supported git hosting provider. Returns (nil, nil) for non-git
|
||||
// providers (e.g. Slack, JFrog). Returns a non-nil error if provider
|
||||
// construction fails.
|
||||
func (c *Config) Git(client *http.Client) (gitprovider.Provider, error) {
|
||||
norm := strings.ToLower(c.Type)
|
||||
if !codersdk.EnhancedExternalAuthProvider(norm).Git() {
|
||||
return nil
|
||||
return nil, nil //nolint:nilnil // nil provider means non-git type, not an error
|
||||
}
|
||||
return gitprovider.New(norm, c.APIBaseURL, client)
|
||||
}
|
||||
@@ -957,6 +958,11 @@ func copyDefaultSettings(config *codersdk.ExternalAuthConfig, defaults codersdk.
|
||||
config.APIBaseURL = "https://api.github.com"
|
||||
case codersdk.EnhancedExternalAuthProviderGitLab:
|
||||
config.APIBaseURL = "https://gitlab.com/api/v4"
|
||||
if config.AuthURL != "" {
|
||||
if au, err := url.Parse(config.AuthURL); err == nil && !strings.EqualFold(au.Host, "gitlab.com") {
|
||||
config.APIBaseURL = au.Scheme + "://" + au.Host + "/api/v4"
|
||||
}
|
||||
}
|
||||
case codersdk.EnhancedExternalAuthProviderGitea:
|
||||
config.APIBaseURL = "https://gitea.com/api/v1"
|
||||
}
|
||||
@@ -1038,7 +1044,7 @@ func gitlabDefaults(config *codersdk.ExternalAuthConfig) codersdk.ExternalAuthCo
|
||||
DisplayName: "GitLab",
|
||||
DisplayIcon: "/icon/gitlab.svg",
|
||||
Regex: `^(https?://)?gitlab\.com(/.*)?$`,
|
||||
Scopes: []string{"write_repository"},
|
||||
Scopes: []string{"write_repository", "read_api"},
|
||||
CodeChallengeMethodsSupported: []string{string(promoauth.PKCEChallengeMethodSha256)},
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user