Skip to content
Snippets Groups Projects
Commit 06abb5a5 authored by Amine Hilaly's avatar Amine Hilaly
Browse files

bridge/gitlab: add gitlab bridge configuration

parent da2d7970
No related branches found
No related tags found
No related merge requests found
...@@ -237,12 +237,12 @@ func TokenExist(repo repository.RepoCommon, value string) bool { ...@@ -237,12 +237,12 @@ func TokenExist(repo repository.RepoCommon, value string) bool {
// TokenExistWithTarget same as TokenExist but restrict search for a given target // TokenExistWithTarget same as TokenExist but restrict search for a given target
func TokenExistWithTarget(repo repository.RepoCommon, value string, target string) bool { func TokenExistWithTarget(repo repository.RepoCommon, value string, target string) bool {
tokens, err := LoadTokens(repo) tokens, err := LoadTokensWithTarget(repo, target)
if err != nil { if err != nil {
return false return false
} }
for _, token := range tokens { for _, token := range tokens {
if token.Value == value && token.Target == target { if token.Value == value {
return true return true
} }
} }
......
...@@ -13,6 +13,7 @@ import ( ...@@ -13,6 +13,7 @@ import (
"github.com/xanzy/go-gitlab" "github.com/xanzy/go-gitlab"
"github.com/MichaelMure/git-bug/bridge/core" "github.com/MichaelMure/git-bug/bridge/core"
"github.com/MichaelMure/git-bug/entity"
"github.com/MichaelMure/git-bug/repository" "github.com/MichaelMure/git-bug/repository"
) )
...@@ -32,6 +33,8 @@ func (g *Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams) ...@@ -32,6 +33,8 @@ func (g *Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams)
var err error var err error
var url string var url string
var token string var token string
var tokenId entity.Id
var tokenObj *core.Token
if (params.Token != "" || params.TokenStdin) && params.URL == "" { if (params.Token != "" || params.TokenStdin) && params.URL == "" {
return nil, fmt.Errorf("you must provide a project URL to configure this bridge with a token") return nil, fmt.Errorf("you must provide a project URL to configure this bridge with a token")
...@@ -65,21 +68,38 @@ func (g *Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams) ...@@ -65,21 +68,38 @@ func (g *Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams)
return nil, fmt.Errorf("reading from stdin: %v", err) return nil, fmt.Errorf("reading from stdin: %v", err)
} }
token = strings.TrimSuffix(token, "\n") token = strings.TrimSuffix(token, "\n")
} else if params.TokenId != "" {
tokenId = entity.Id(params.TokenId)
} else { } else {
token, err = promptToken() tokenObj, err = promptTokenOptions(repo)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "token prompt") return nil, errors.Wrap(err, "token prompt")
} }
} }
if token != "" {
tokenObj, err = core.LoadOrCreateToken(repo, target, token)
if err != nil {
return nil, err
}
} else if tokenId != "" {
tokenObj, err = core.LoadToken(repo, entity.Id(tokenId))
if err != nil {
return nil, err
}
if tokenObj.Target != target {
return nil, fmt.Errorf("token target is incompatible %s", tokenObj.Target)
}
}
// validate project url and get its ID // validate project url and get its ID
id, err := validateProjectURL(url, token) id, err := validateProjectURL(url, tokenObj.Value)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "project validation") return nil, errors.Wrap(err, "project validation")
} }
conf[keyProjectID] = strconv.Itoa(id) conf[keyProjectID] = strconv.Itoa(id)
conf[keyToken] = token conf[core.ConfigKeyTokenId] = tokenObj.ID().String()
conf[core.ConfigKeyTarget] = target conf[core.ConfigKeyTarget] = target
err = g.ValidateConfig(conf) err = g.ValidateConfig(conf)
...@@ -108,6 +128,54 @@ func (g *Gitlab) ValidateConfig(conf core.Configuration) error { ...@@ -108,6 +128,54 @@ func (g *Gitlab) ValidateConfig(conf core.Configuration) error {
return nil return nil
} }
func promptTokenOptions(repo repository.RepoCommon) (*core.Token, error) {
for {
tokens, err := core.LoadTokensWithTarget(repo, target)
if err != nil {
return nil, err
}
fmt.Println()
fmt.Println("[1]: user provided token")
if len(tokens) > 0 {
fmt.Println("known tokens for Gitlab:")
for i, token := range tokens {
if token.Target == target {
fmt.Printf("[%d]: %s\n", i+2, token.ID())
}
}
}
fmt.Print("Select option: ")
line, err := bufio.NewReader(os.Stdin).ReadString('\n')
fmt.Println()
if err != nil {
return nil, err
}
line = strings.TrimRight(line, "\n")
index, err := strconv.Atoi(line)
if err != nil || index < 1 || index > len(tokens)+1 {
fmt.Println("invalid input")
continue
}
var token string
switch index {
case 1:
token, err = promptToken()
if err != nil {
return nil, err
}
default:
return tokens[index-2], nil
}
return core.LoadOrCreateToken(repo, target, token)
}
}
func promptToken() (string, error) { func promptToken() (string, error) {
fmt.Println("You can generate a new token by visiting https://gitlab.com/profile/personal_access_tokens.") fmt.Println("You can generate a new token by visiting https://gitlab.com/profile/personal_access_tokens.")
fmt.Println("Choose 'Create personal access token' and set the necessary access scope for your repository.") fmt.Println("Choose 'Create personal access token' and set the necessary access scope for your repository.")
......
...@@ -79,7 +79,7 @@ func (ge *gitlabExporter) ExportAll(ctx context.Context, repo *cache.RepoCache, ...@@ -79,7 +79,7 @@ func (ge *gitlabExporter) ExportAll(ctx context.Context, repo *cache.RepoCache,
return nil, err return nil, err
} }
ge.identityToken[user.Id().String()] = ge.conf[keyToken] ge.identityToken[user.Id().String()] = ge.conf[core.ConfigKeyToken]
// get repository node id // get repository node id
ge.repositoryID = ge.conf[keyProjectID] ge.repositoryID = ge.conf[keyProjectID]
......
...@@ -34,7 +34,7 @@ func (gi *gitlabImporter) Init(conf core.Configuration) error { ...@@ -34,7 +34,7 @@ func (gi *gitlabImporter) Init(conf core.Configuration) error {
// ImportAll iterate over all the configured repository issues (notes) and ensure the creation // ImportAll iterate over all the configured repository issues (notes) and ensure the creation
// of the missing issues / comments / label events / title changes ... // of the missing issues / comments / label events / title changes ...
func (gi *gitlabImporter) ImportAll(ctx context.Context, repo *cache.RepoCache, since time.Time) (<-chan core.ImportResult, error) { func (gi *gitlabImporter) ImportAll(ctx context.Context, repo *cache.RepoCache, since time.Time) (<-chan core.ImportResult, error) {
gi.iterator = NewIterator(ctx, 10, gi.conf[keyProjectID], gi.conf[keyToken], since) gi.iterator = NewIterator(ctx, 10, gi.conf[keyProjectID], gi.conf[core.ConfigKeyToken], since)
out := make(chan core.ImportResult) out := make(chan core.ImportResult)
gi.out = out gi.out = out
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment