diff options
author | amine <hilalyamine@gmail.com> | 2019-12-10 20:30:29 +0100 |
---|---|---|
committer | amine <hilalyamine@gmail.com> | 2019-12-10 21:05:55 +0100 |
commit | f6b4830c0b68f3b5c616236bc9d51943765c8b4a (patch) | |
tree | 324f36a49d1a26253bb1fc1ecc923d50aaed2912 | |
parent | f1ed857cbd3a253d77b31c0c896fdc4ade40844f (diff) | |
download | git-bug-f6b4830c0b68f3b5c616236bc9d51943765c8b4a.tar.gz |
bridge/gitlab: support self-hosted GitLab instance
-rw-r--r-- | bridge/core/bridge.go | 1 | ||||
-rw-r--r-- | bridge/github/config.go | 4 | ||||
-rw-r--r-- | bridge/gitlab/config.go | 18 | ||||
-rw-r--r-- | bridge/gitlab/export.go | 14 | ||||
-rw-r--r-- | bridge/gitlab/export_test.go | 20 | ||||
-rw-r--r-- | bridge/gitlab/gitlab.go | 17 | ||||
-rw-r--r-- | bridge/gitlab/import.go | 6 | ||||
-rw-r--r-- | bridge/gitlab/import_test.go | 3 | ||||
-rw-r--r-- | bridge/launchpad/config.go | 3 | ||||
-rw-r--r-- | commands/bridge_configure.go | 1 | ||||
-rw-r--r-- | doc/man/git-bug-bridge-configure.1 | 4 | ||||
-rw-r--r-- | doc/md/git-bug_bridge_configure.md | 1 | ||||
-rw-r--r-- | misc/bash_completion/git-bug | 4 | ||||
-rw-r--r-- | misc/powershell_completion/git-bug | 2 | ||||
-rw-r--r-- | misc/zsh_completion/git-bug | 1 |
15 files changed, 84 insertions, 15 deletions
diff --git a/bridge/core/bridge.go b/bridge/core/bridge.go index 9a46e7b1..c6731ff9 100644 --- a/bridge/core/bridge.go +++ b/bridge/core/bridge.go @@ -35,6 +35,7 @@ type BridgeParams struct { Owner string Project string URL string + BaseURL string CredPrefix string TokenRaw string } diff --git a/bridge/github/config.go b/bridge/github/config.go index a74e7f6b..bc26a2fc 100644 --- a/bridge/github/config.go +++ b/bridge/github/config.go @@ -44,6 +44,10 @@ var ( ) func (g *Github) Configure(repo *cache.RepoCache, params core.BridgeParams) (core.Configuration, error) { + if params.BaseURL != "" { + fmt.Println("warning: --base-url is ineffective for a Github bridge") + } + conf := make(core.Configuration) var err error diff --git a/bridge/gitlab/config.go b/bridge/gitlab/config.go index 7bc2e577..99c27836 100644 --- a/bridge/gitlab/config.go +++ b/bridge/gitlab/config.go @@ -42,6 +42,10 @@ func (g *Gitlab) Configure(repo *cache.RepoCache, params core.BridgeParams) (cor return nil, fmt.Errorf("you must provide a project URL to configure this bridge with a token") } + if params.URL == "" { + params.URL = defaultBaseURL + } + var url string // get project url @@ -56,6 +60,10 @@ func (g *Gitlab) Configure(repo *cache.RepoCache, params core.BridgeParams) (cor } } + if !strings.HasPrefix(url, params.BaseURL) { + return nil, fmt.Errorf("base URL (%s) doesn't match the project URL (%s)", params.BaseURL, url) + } + user, err := repo.GetUserIdentity() if err != nil { return nil, err @@ -87,13 +95,14 @@ func (g *Gitlab) Configure(repo *cache.RepoCache, params core.BridgeParams) (cor } // validate project url and get its ID - id, err := validateProjectURL(url, token) + id, err := validateProjectURL(params.BaseURL, url, token) if err != nil { return nil, errors.Wrap(err, "project validation") } conf[core.ConfigKeyTarget] = target conf[keyProjectID] = strconv.Itoa(id) + conf[keyGitlabBaseUrl] = params.BaseURL err = g.ValidateConfig(conf) if err != nil { @@ -302,13 +311,16 @@ func getValidGitlabRemoteURLs(remotes map[string]string) []string { return urls } -func validateProjectURL(url string, token *auth.Token) (int, error) { +func validateProjectURL(baseURL, url string, token *auth.Token) (int, error) { projectPath, err := getProjectPath(url) if err != nil { return 0, err } - client := buildClient(token) + client, err := buildClient(baseURL, token) + if err != nil { + return 0, err + } project, _, err := client.Projects.GetProject(projectPath, &gitlab.GetProjectOptions{}) if err != nil { diff --git a/bridge/gitlab/export.go b/bridge/gitlab/export.go index 373cf637..d42ef1cd 100644 --- a/bridge/gitlab/export.go +++ b/bridge/gitlab/export.go @@ -62,7 +62,11 @@ func (ge *gitlabExporter) cacheAllClient(repo repository.RepoConfig) error { for _, cred := range creds { if _, ok := ge.identityClient[cred.UserId()]; !ok { - client := buildClient(creds[0].(*auth.Token)) + client, err := buildClient(ge.conf[keyGitlabBaseUrl], creds[0].(*auth.Token)) + if err != nil { + return err + } + ge.identityClient[cred.UserId()] = client } } @@ -133,6 +137,7 @@ func (ge *gitlabExporter) exportBug(ctx context.Context, b *cache.BugCache, sinc var err error var bugGitlabID int var bugGitlabIDString string + var GitlabBaseUrl string var bugCreationId string // Special case: @@ -153,6 +158,12 @@ func (ge *gitlabExporter) exportBug(ctx context.Context, b *cache.BugCache, sinc // get gitlab bug ID gitlabID, ok := snapshot.GetCreateMetadata(metaKeyGitlabId) if ok { + gitlabBaseUrl, ok := snapshot.GetCreateMetadata(metaKeyGitlabBaseUrl) + if ok && gitlabBaseUrl != ge.conf[gitlabBaseUrl] { + out <- core.NewExportNothing(b.Id(), "skipping issue imported from another Gitlab instance") + return + } + projectID, ok := snapshot.GetCreateMetadata(metaKeyGitlabProject) if !ok { err := fmt.Errorf("expected to find gitlab project id") @@ -199,6 +210,7 @@ func (ge *gitlabExporter) exportBug(ctx context.Context, b *cache.BugCache, sinc metaKeyGitlabId: idString, metaKeyGitlabUrl: url, metaKeyGitlabProject: ge.repositoryID, + metaKeyGitlabBaseUrl: GitlabBaseUrl, }, ) if err != nil { diff --git a/bridge/gitlab/export_test.go b/bridge/gitlab/export_test.go index 645e2d76..d16defd0 100644 --- a/bridge/gitlab/export_test.go +++ b/bridge/gitlab/export_test.go @@ -188,7 +188,8 @@ func TestPushPull(t *testing.T) { // initialize exporter exporter := &gitlabExporter{} err = exporter.Init(backend, core.Configuration{ - keyProjectID: strconv.Itoa(projectID), + keyProjectID: strconv.Itoa(projectID), + keyGitlabBaseUrl: "https://gitlab.com/", }) require.NoError(t, err) @@ -215,7 +216,8 @@ func TestPushPull(t *testing.T) { importer := &gitlabImporter{} err = importer.Init(backend, core.Configuration{ - keyProjectID: strconv.Itoa(projectID), + keyProjectID: strconv.Itoa(projectID), + keyGitlabBaseUrl: "https://gitlab.com/", }) require.NoError(t, err) @@ -280,7 +282,11 @@ func generateRepoName() string { // create repository need a token with scope 'repo' func createRepository(ctx context.Context, name string, token *auth.Token) (int, error) { - client := buildClient(token) + client, err := buildClient("https://gitlab.com/", token) + if err != nil { + return 0, err + } + project, _, err := client.Projects.CreateProject( &gitlab.CreateProjectOptions{ Name: gitlab.String(name), @@ -296,7 +302,11 @@ func createRepository(ctx context.Context, name string, token *auth.Token) (int, // delete repository need a token with scope 'delete_repo' func deleteRepository(ctx context.Context, project int, token *auth.Token) error { - client := buildClient(token) - _, err := client.Projects.DeleteProject(project, gitlab.WithContext(ctx)) + client, err := buildClient("https://gitlab.com/", token) + if err != nil { + return err + } + + _, err = client.Projects.DeleteProject(project, gitlab.WithContext(ctx)) return err } diff --git a/bridge/gitlab/gitlab.go b/bridge/gitlab/gitlab.go index bcc50e4c..9298dc8e 100644 --- a/bridge/gitlab/gitlab.go +++ b/bridge/gitlab/gitlab.go @@ -17,9 +17,12 @@ const ( metaKeyGitlabUrl = "gitlab-url" metaKeyGitlabLogin = "gitlab-login" metaKeyGitlabProject = "gitlab-project-id" + metaKeyGitlabBaseUrl = "gitlab-base-url" - keyProjectID = "project-id" + keyProjectID = "project-id" + keyGitlabBaseUrl = "base-url" + defaultBaseURL = "https://gitlab.com/" defaultTimeout = 60 * time.Second ) @@ -37,10 +40,16 @@ func (*Gitlab) NewExporter() core.Exporter { return &gitlabExporter{} } -func buildClient(token *auth.Token) *gitlab.Client { - client := &http.Client{ +func buildClient(baseURL string, token *auth.Token) (*gitlab.Client, error) { + httpClient := &http.Client{ Timeout: defaultTimeout, } - return gitlab.NewClient(client, token.Value) + gitlabClient := gitlab.NewClient(httpClient, token.Value) + err := gitlabClient.SetBaseURL(baseURL) + if err != nil { + return nil, err + } + + return gitlabClient, nil } diff --git a/bridge/gitlab/import.go b/bridge/gitlab/import.go index 00dee252..4fa37505 100644 --- a/bridge/gitlab/import.go +++ b/bridge/gitlab/import.go @@ -52,7 +52,10 @@ func (gi *gitlabImporter) Init(repo *cache.RepoCache, conf core.Configuration) e return ErrMissingIdentityToken } - gi.client = buildClient(creds[0].(*auth.Token)) + gi.client, err = buildClient(conf[keyGitlabBaseUrl], creds[0].(*auth.Token)) + if err != nil { + return err + } return nil } @@ -151,6 +154,7 @@ func (gi *gitlabImporter) ensureIssue(repo *cache.RepoCache, issue *gitlab.Issue metaKeyGitlabId: parseID(issue.IID), metaKeyGitlabUrl: issue.WebURL, metaKeyGitlabProject: gi.conf[keyProjectID], + metaKeyGitlabBaseUrl: gi.conf[keyGitlabBaseUrl], }, ) diff --git a/bridge/gitlab/import_test.go b/bridge/gitlab/import_test.go index 1676bdf3..6e378b07 100644 --- a/bridge/gitlab/import_test.go +++ b/bridge/gitlab/import_test.go @@ -103,7 +103,8 @@ func TestImport(t *testing.T) { importer := &gitlabImporter{} err = importer.Init(backend, core.Configuration{ - keyProjectID: projectID, + keyProjectID: projectID, + keyGitlabBaseUrl: "https://gitlab.com", }) require.NoError(t, err) diff --git a/bridge/launchpad/config.go b/bridge/launchpad/config.go index 8db39100..edbd941d 100644 --- a/bridge/launchpad/config.go +++ b/bridge/launchpad/config.go @@ -29,6 +29,9 @@ func (l *Launchpad) Configure(repo *cache.RepoCache, params core.BridgeParams) ( if params.Owner != "" { fmt.Println("warning: --owner is ineffective for a Launchpad bridge") } + if params.BaseURL != "" { + fmt.Println("warning: --base-url is ineffective for a Launchpad bridge") + } conf := make(core.Configuration) var err error diff --git a/commands/bridge_configure.go b/commands/bridge_configure.go index 00634b28..26bd7bc2 100644 --- a/commands/bridge_configure.go +++ b/commands/bridge_configure.go @@ -216,6 +216,7 @@ func init() { bridgeConfigureCmd.Flags().StringVarP(&bridgeConfigureTarget, "target", "t", "", fmt.Sprintf("The target of the bridge. Valid values are [%s]", strings.Join(bridge.Targets(), ","))) bridgeConfigureCmd.Flags().StringVarP(&bridgeConfigureParams.URL, "url", "u", "", "The URL of the target repository") + bridgeConfigureCmd.Flags().StringVarP(&bridgeConfigureParams.BaseURL, "base-url", "b", "", "The base URL of your issue tracker service") bridgeConfigureCmd.Flags().StringVarP(&bridgeConfigureParams.Owner, "owner", "o", "", "The owner of the target repository") bridgeConfigureCmd.Flags().StringVarP(&bridgeConfigureParams.CredPrefix, "credential", "c", "", "The identifier or prefix of an already known credential for the API (see \"git-bug bridge auth\")") bridgeConfigureCmd.Flags().StringVar(&bridgeConfigureToken, "token", "", "A raw authentication token for the API") diff --git a/doc/man/git-bug-bridge-configure.1 b/doc/man/git-bug-bridge-configure.1 index 14b773a6..d1dc9f7d 100644 --- a/doc/man/git-bug-bridge-configure.1 +++ b/doc/man/git-bug-bridge-configure.1 @@ -40,6 +40,10 @@ Token configuration can be directly passed with the \-\-token flag or in the ter The URL of the target repository .PP +\fB\-b\fP, \fB\-\-base\-url\fP="" + The base URL of your issue tracker service + +.PP \fB\-o\fP, \fB\-\-owner\fP="" The owner of the target repository diff --git a/doc/md/git-bug_bridge_configure.md b/doc/md/git-bug_bridge_configure.md index 73121072..c0f89cf3 100644 --- a/doc/md/git-bug_bridge_configure.md +++ b/doc/md/git-bug_bridge_configure.md @@ -73,6 +73,7 @@ git bug bridge configure \ -n, --name string A distinctive name to identify the bridge -t, --target string The target of the bridge. Valid values are [github,gitlab,launchpad-preview] -u, --url string The URL of the target repository + -b, --base-url string The base URL of your issue tracker service -o, --owner string The owner of the target repository -c, --credential string The identifier or prefix of an already known credential for the API (see "git-bug bridge auth") --token string A raw authentication token for the API diff --git a/misc/bash_completion/git-bug b/misc/bash_completion/git-bug index 707369c5..557bbf20 100644 --- a/misc/bash_completion/git-bug +++ b/misc/bash_completion/git-bug @@ -400,6 +400,10 @@ _git-bug_bridge_configure() two_word_flags+=("--url") two_word_flags+=("-u") local_nonpersistent_flags+=("--url=") + flags+=("--base-url=") + two_word_flags+=("--base-url") + two_word_flags+=("-b") + local_nonpersistent_flags+=("--base-url=") flags+=("--owner=") two_word_flags+=("--owner") two_word_flags+=("-o") diff --git a/misc/powershell_completion/git-bug b/misc/powershell_completion/git-bug index b6086f27..d52113e4 100644 --- a/misc/powershell_completion/git-bug +++ b/misc/powershell_completion/git-bug @@ -79,6 +79,8 @@ Register-ArgumentCompleter -Native -CommandName 'git-bug' -ScriptBlock { [CompletionResult]::new('--target', 'target', [CompletionResultType]::ParameterName, 'The target of the bridge. Valid values are [github,gitlab,launchpad-preview]') [CompletionResult]::new('-u', 'u', [CompletionResultType]::ParameterName, 'The URL of the target repository') [CompletionResult]::new('--url', 'url', [CompletionResultType]::ParameterName, 'The URL of the target repository') + [CompletionResult]::new('-b', 'b', [CompletionResultType]::ParameterName, 'The base URL of your issue tracker service') + [CompletionResult]::new('--base-url', 'base-url', [CompletionResultType]::ParameterName, 'The base URL of your issue tracker service') [CompletionResult]::new('-o', 'o', [CompletionResultType]::ParameterName, 'The owner of the target repository') [CompletionResult]::new('--owner', 'owner', [CompletionResultType]::ParameterName, 'The owner of the target repository') [CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'The identifier or prefix of an already known credential for the API (see "git-bug bridge auth")') diff --git a/misc/zsh_completion/git-bug b/misc/zsh_completion/git-bug index a0b4840b..3b06a396 100644 --- a/misc/zsh_completion/git-bug +++ b/misc/zsh_completion/git-bug @@ -193,6 +193,7 @@ function _git-bug_bridge_configure { '(-n --name)'{-n,--name}'[A distinctive name to identify the bridge]:' \ '(-t --target)'{-t,--target}'[The target of the bridge. Valid values are [github,gitlab,launchpad-preview]]:' \ '(-u --url)'{-u,--url}'[The URL of the target repository]:' \ + '(-b --base-url)'{-b,--base-url}'[The base URL of your issue tracker service]:' \ '(-o --owner)'{-o,--owner}'[The owner of the target repository]:' \ '(-c --credential)'{-c,--credential}'[The identifier or prefix of an already known credential for the API (see "git-bug bridge auth")]:' \ '--token[A raw authentication token for the API]:' \ |