aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoramine <hilalyamine@gmail.com>2019-11-24 14:39:02 +0100
committeramine <hilalyamine@gmail.com>2019-11-24 18:04:48 +0100
commit06abb5a5312dfaa1edac58cced94691e477c2ed7 (patch)
tree356bbe10b81a1ed06ded54a5570027fda51fead6
parentda2d7970cd46c52bb8630c5540ea013bd3b9e81a (diff)
downloadgit-bug-06abb5a5312dfaa1edac58cced94691e477c2ed7.tar.gz
bridge/gitlab: add gitlab bridge configuration
-rw-r--r--bridge/core/token.go4
-rw-r--r--bridge/gitlab/config.go74
-rw-r--r--bridge/gitlab/export.go2
-rw-r--r--bridge/gitlab/import.go2
4 files changed, 75 insertions, 7 deletions
diff --git a/bridge/core/token.go b/bridge/core/token.go
index 186b9ff4..28c64f5c 100644
--- a/bridge/core/token.go
+++ b/bridge/core/token.go
@@ -237,12 +237,12 @@ func TokenExist(repo repository.RepoCommon, value string) bool {
// TokenExistWithTarget same as TokenExist but restrict search for a given target
func TokenExistWithTarget(repo repository.RepoCommon, value string, target string) bool {
- tokens, err := LoadTokens(repo)
+ tokens, err := LoadTokensWithTarget(repo, target)
if err != nil {
return false
}
for _, token := range tokens {
- if token.Value == value && token.Target == target {
+ if token.Value == value {
return true
}
}
diff --git a/bridge/gitlab/config.go b/bridge/gitlab/config.go
index f2e667a8..88ba7db8 100644
--- a/bridge/gitlab/config.go
+++ b/bridge/gitlab/config.go
@@ -13,6 +13,7 @@ import (
"github.com/xanzy/go-gitlab"
"github.com/MichaelMure/git-bug/bridge/core"
+ "github.com/MichaelMure/git-bug/entity"
"github.com/MichaelMure/git-bug/repository"
)
@@ -32,6 +33,8 @@ func (g *Gitlab) Configure(repo repository.RepoCommon, params core.BridgeParams)
var err error
var url string
var token string
+ var tokenId entity.Id
+ var tokenObj *core.Token
if (params.Token != "" || params.TokenStdin) && params.URL == "" {
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)
return nil, fmt.Errorf("reading from stdin: %v", err)
}
token = strings.TrimSuffix(token, "\n")
+ } else if params.TokenId != "" {
+ tokenId = entity.Id(params.TokenId)
} else {
- token, err = promptToken()
+ tokenObj, err = promptTokenOptions(repo)
if err != nil {
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
- id, err := validateProjectURL(url, token)
+ id, err := validateProjectURL(url, tokenObj.Value)
if err != nil {
return nil, errors.Wrap(err, "project validation")
}
conf[keyProjectID] = strconv.Itoa(id)
- conf[keyToken] = token
+ conf[core.ConfigKeyTokenId] = tokenObj.ID().String()
conf[core.ConfigKeyTarget] = target
err = g.ValidateConfig(conf)
@@ -108,6 +128,54 @@ func (g *Gitlab) ValidateConfig(conf core.Configuration) error {
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) {
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.")
diff --git a/bridge/gitlab/export.go b/bridge/gitlab/export.go
index 7c00e39d..092434a5 100644
--- a/bridge/gitlab/export.go
+++ b/bridge/gitlab/export.go
@@ -79,7 +79,7 @@ func (ge *gitlabExporter) ExportAll(ctx context.Context, repo *cache.RepoCache,
return nil, err
}
- ge.identityToken[user.Id().String()] = ge.conf[keyToken]
+ ge.identityToken[user.Id().String()] = ge.conf[core.ConfigKeyToken]
// get repository node id
ge.repositoryID = ge.conf[keyProjectID]
diff --git a/bridge/gitlab/import.go b/bridge/gitlab/import.go
index 92e9952e..4fcf8568 100644
--- a/bridge/gitlab/import.go
+++ b/bridge/gitlab/import.go
@@ -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
// 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) {
- 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)
gi.out = out