From bd7b50bc8638d3b6c776dd974de32a1ea385c835 Mon Sep 17 00:00:00 2001 From: Michael Muré Date: Sun, 9 Feb 2020 22:17:10 +0100 Subject: github/gitlab: many fixes and improvments at the config step --- bridge/gitlab/config.go | 54 +++++++++++++++++++++++++++++--------------- bridge/gitlab/export.go | 10 +++++--- bridge/gitlab/export_test.go | 9 ++++---- bridge/gitlab/import.go | 6 ++++- bridge/gitlab/import_test.go | 5 ++-- 5 files changed, 56 insertions(+), 28 deletions(-) (limited to 'bridge/gitlab') diff --git a/bridge/gitlab/config.go b/bridge/gitlab/config.go index fb593819..62d385dc 100644 --- a/bridge/gitlab/config.go +++ b/bridge/gitlab/config.go @@ -35,9 +35,6 @@ func (g *Gitlab) Configure(repo *cache.RepoCache, params core.BridgeParams) (cor if params.Owner != "" { fmt.Println("warning: --owner is ineffective for a gitlab bridge") } - if params.Login != "" { - fmt.Println("warning: --login is ineffective for a gitlab bridge") - } conf := make(core.Configuration) var err error @@ -53,24 +50,25 @@ func (g *Gitlab) Configure(repo *cache.RepoCache, params core.BridgeParams) (cor } } - var url string + var projectURL string // get project url switch { case params.URL != "": - url = params.URL + projectURL = params.URL default: // terminal prompt - url, err = promptURL(repo, baseUrl) + projectURL, err = promptProjectURL(repo, baseUrl) if err != nil { return nil, errors.Wrap(err, "url prompt") } } - if !strings.HasPrefix(url, params.BaseURL) { - return nil, fmt.Errorf("base URL (%s) doesn't match the project URL (%s)", params.BaseURL, url) + if !strings.HasPrefix(projectURL, params.BaseURL) { + return nil, fmt.Errorf("base URL (%s) doesn't match the project URL (%s)", params.BaseURL, projectURL) } + var login string var cred auth.Credential switch { @@ -79,16 +77,30 @@ func (g *Gitlab) Configure(repo *cache.RepoCache, params core.BridgeParams) (cor if err != nil { return nil, err } + l, ok := cred.GetMetadata(auth.MetaKeyLogin) + if !ok { + return nil, fmt.Errorf("credential doesn't have a login") + } + login = l case params.TokenRaw != "": token := auth.NewToken(params.TokenRaw, target) - login, err := getLoginFromToken(baseUrl, token) + login, err = getLoginFromToken(baseUrl, token) if err != nil { return nil, err } token.SetMetadata(auth.MetaKeyLogin, login) + token.SetMetadata(auth.MetaKeyBaseURL, baseUrl) cred = token default: - cred, err = promptTokenOptions(repo, baseUrl) + login := params.Login + if login == "" { + // TODO: validate username + login, err = input.Prompt("Gitlab login", "login", input.Required) + if err != nil { + return nil, err + } + } + cred, err = promptTokenOptions(repo, login, baseUrl) if err != nil { return nil, err } @@ -100,7 +112,7 @@ func (g *Gitlab) Configure(repo *cache.RepoCache, params core.BridgeParams) (cor } // validate project url and get its ID - id, err := validateProjectURL(baseUrl, url, token) + id, err := validateProjectURL(baseUrl, projectURL, token) if err != nil { return nil, errors.Wrap(err, "project validation") } @@ -122,7 +134,7 @@ func (g *Gitlab) Configure(repo *cache.RepoCache, params core.BridgeParams) (cor } } - return conf, nil + return conf, core.FinishConfig(repo, metaKeyGitlabLogin, login) } func (g *Gitlab) ValidateConfig(conf core.Configuration) error { @@ -176,9 +188,14 @@ func promptBaseUrl() (string, error) { return input.Prompt("Base url", "url", input.Required, validator) } -func promptTokenOptions(repo repository.RepoConfig, baseUrl string) (auth.Credential, error) { +func promptTokenOptions(repo repository.RepoConfig, login, baseUrl string) (auth.Credential, error) { for { - creds, err := auth.List(repo, auth.WithTarget(target), auth.WithKind(auth.KindToken)) + creds, err := auth.List(repo, + auth.WithTarget(target), + auth.WithKind(auth.KindToken), + auth.WithMeta(auth.MetaKeyLogin, login), + auth.WithMeta(auth.MetaKeyBaseURL, baseUrl), + ) if err != nil { return nil, err } @@ -262,11 +279,12 @@ func promptToken(baseUrl string) (*auth.Token, error) { token := auth.NewToken(rawToken, target) token.SetMetadata(auth.MetaKeyLogin, login) + token.SetMetadata(auth.MetaKeyBaseURL, baseUrl) return token, nil } -func promptURL(repo repository.RepoCommon, baseUrl string) (string, error) { +func promptProjectURL(repo repository.RepoCommon, baseUrl string) (string, error) { // remote suggestions remotes, err := repo.GetRemotes() if err != nil { @@ -317,13 +335,13 @@ func promptURL(repo repository.RepoCommon, baseUrl string) (string, error) { return "", err } - url := strings.TrimSpace(line) - if url == "" { + projectURL := strings.TrimSpace(line) + if projectURL == "" { fmt.Println("URL is empty") continue } - return url, nil + return projectURL, nil } } diff --git a/bridge/gitlab/export.go b/bridge/gitlab/export.go index c5323da4..d747c6ac 100644 --- a/bridge/gitlab/export.go +++ b/bridge/gitlab/export.go @@ -47,7 +47,7 @@ func (ge *gitlabExporter) Init(repo *cache.RepoCache, conf core.Configuration) e ge.repositoryID = ge.conf[keyProjectID] // preload all clients - err := ge.cacheAllClient(repo) + err := ge.cacheAllClient(repo, ge.conf[keyGitlabBaseUrl]) if err != nil { return err } @@ -55,8 +55,12 @@ func (ge *gitlabExporter) Init(repo *cache.RepoCache, conf core.Configuration) e return nil } -func (ge *gitlabExporter) cacheAllClient(repo *cache.RepoCache) error { - creds, err := auth.List(repo, auth.WithTarget(target), auth.WithKind(auth.KindToken)) +func (ge *gitlabExporter) cacheAllClient(repo *cache.RepoCache, baseURL string) error { + creds, err := auth.List(repo, + auth.WithTarget(target), + auth.WithKind(auth.KindToken), + auth.WithMeta(auth.MetaKeyBaseURL, baseURL), + ) if err != nil { return err } diff --git a/bridge/gitlab/export_test.go b/bridge/gitlab/export_test.go index 1d387655..c97416d8 100644 --- a/bridge/gitlab/export_test.go +++ b/bridge/gitlab/export_test.go @@ -164,6 +164,7 @@ func TestPushPull(t *testing.T) { token := auth.NewToken(envToken, target) token.SetMetadata(auth.MetaKeyLogin, login) + token.SetMetadata(auth.MetaKeyBaseURL, defaultBaseURL) err = auth.Store(repo, token) require.NoError(t, err) @@ -194,7 +195,7 @@ func TestPushPull(t *testing.T) { exporter := &gitlabExporter{} err = exporter.Init(backend, core.Configuration{ keyProjectID: strconv.Itoa(projectID), - keyGitlabBaseUrl: "https://gitlab.com/", + keyGitlabBaseUrl: defaultBaseURL, }) require.NoError(t, err) @@ -222,7 +223,7 @@ func TestPushPull(t *testing.T) { importer := &gitlabImporter{} err = importer.Init(backend, core.Configuration{ keyProjectID: strconv.Itoa(projectID), - keyGitlabBaseUrl: "https://gitlab.com/", + keyGitlabBaseUrl: defaultBaseURL, }) require.NoError(t, err) @@ -287,7 +288,7 @@ func generateRepoName() string { // create repository need a token with scope 'repo' func createRepository(ctx context.Context, name string, token *auth.Token) (int, error) { - client, err := buildClient("https://gitlab.com/", token) + client, err := buildClient(defaultBaseURL, token) if err != nil { return 0, err } @@ -307,7 +308,7 @@ 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, err := buildClient("https://gitlab.com/", token) + client, err := buildClient(defaultBaseURL, token) if err != nil { return err } diff --git a/bridge/gitlab/import.go b/bridge/gitlab/import.go index d699554b..4fccb47e 100644 --- a/bridge/gitlab/import.go +++ b/bridge/gitlab/import.go @@ -33,7 +33,11 @@ type gitlabImporter struct { func (gi *gitlabImporter) Init(repo *cache.RepoCache, conf core.Configuration) error { gi.conf = conf - creds, err := auth.List(repo, auth.WithTarget(target), auth.WithKind(auth.KindToken)) + creds, err := auth.List(repo, + auth.WithTarget(target), + auth.WithKind(auth.KindToken), + auth.WithMeta(auth.MetaKeyBaseURL, conf[keyGitlabBaseUrl]), + ) if err != nil { return err } diff --git a/bridge/gitlab/import_test.go b/bridge/gitlab/import_test.go index 3c0caa55..a300acf1 100644 --- a/bridge/gitlab/import_test.go +++ b/bridge/gitlab/import_test.go @@ -99,14 +99,15 @@ func TestImport(t *testing.T) { author.SetMetadata(metaKeyGitlabLogin, login) token := auth.NewToken(envToken, target) - token.SetMetadata(metaKeyGitlabLogin, login) + token.SetMetadata(auth.MetaKeyLogin, login) + token.SetMetadata(auth.MetaKeyBaseURL, defaultBaseURL) err = auth.Store(repo, token) require.NoError(t, err) importer := &gitlabImporter{} err = importer.Init(backend, core.Configuration{ keyProjectID: projectID, - keyGitlabBaseUrl: "https://gitlab.com", + keyGitlabBaseUrl: defaultBaseURL, }) require.NoError(t, err) -- cgit