mirror of
				https://gitea.com/gitea/tea.git
				synced 2025-10-31 01:05:26 +01:00 
			
		
		
		
	Refactor addLoginMain() (#201)
simplify NormalizeURL drop noisy log line must have been introduced recently? dont use PascalCase for default login names ...for readability. 🔥 opinionated commit create GenerateLoginName() fixes fixup! Merge branch 'master' into refactor-loginMain move GetOwnerAndRepo() to modules/utils/parse.go Merge branch 'master' into refactor-loginMain make linter happy refactor addLoginMain() Co-authored-by: Norwin Roosen <git@nroo.de> Reviewed-on: https://gitea.com/gitea/tea/pulls/201 Reviewed-by: 6543 <6543@noreply.gitea.io> Reviewed-by: Andrew Thornton <art27@cantab.net>
This commit is contained in:
		| @@ -13,6 +13,7 @@ import ( | |||||||
| 	"code.gitea.io/tea/modules/config" | 	"code.gitea.io/tea/modules/config" | ||||||
| 	local_git "code.gitea.io/tea/modules/git" | 	local_git "code.gitea.io/tea/modules/git" | ||||||
| 	"code.gitea.io/tea/modules/print" | 	"code.gitea.io/tea/modules/print" | ||||||
|  | 	"code.gitea.io/tea/modules/utils" | ||||||
|  |  | ||||||
| 	"code.gitea.io/sdk/gitea" | 	"code.gitea.io/sdk/gitea" | ||||||
| 	"github.com/go-git/go-git/v5" | 	"github.com/go-git/go-git/v5" | ||||||
| @@ -106,7 +107,7 @@ func runPullsCreate(ctx *cli.Context) error { | |||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			log.Fatal(err) | 			log.Fatal(err) | ||||||
| 		} | 		} | ||||||
| 		owner, _ := config.GetOwnerAndRepo(strings.TrimLeft(url.Path, "/"), "") | 		owner, _ := utils.GetOwnerAndRepo(strings.TrimLeft(url.Path, "/"), "") | ||||||
| 		head = fmt.Sprintf("%s:%s", owner, branchName) | 		head = fmt.Sprintf("%s:%s", owner, branchName) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ import ( | |||||||
| 	"code.gitea.io/tea/cmd/repos" | 	"code.gitea.io/tea/cmd/repos" | ||||||
| 	"code.gitea.io/tea/modules/config" | 	"code.gitea.io/tea/modules/config" | ||||||
| 	"code.gitea.io/tea/modules/print" | 	"code.gitea.io/tea/modules/print" | ||||||
|  | 	"code.gitea.io/tea/modules/utils" | ||||||
|  |  | ||||||
| 	"code.gitea.io/sdk/gitea" | 	"code.gitea.io/sdk/gitea" | ||||||
| 	"github.com/urfave/cli/v2" | 	"github.com/urfave/cli/v2" | ||||||
| @@ -38,7 +39,7 @@ func runRepos(ctx *cli.Context) error { | |||||||
| func runRepoDetail(path string) error { | func runRepoDetail(path string) error { | ||||||
| 	login := config.InitCommandLoginOnly(flags.GlobalLoginValue) | 	login := config.InitCommandLoginOnly(flags.GlobalLoginValue) | ||||||
| 	client := login.Client() | 	client := login.Client() | ||||||
| 	repoOwner, repoName := config.GetOwnerAndRepo(path, login.User) | 	repoOwner, repoName := utils.GetOwnerAndRepo(path, login.User) | ||||||
| 	repo, _, err := client.GetRepo(repoOwner, repoName) | 	repo, _, err := client.GetRepo(repoOwner, repoName) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
|   | |||||||
| @@ -56,7 +56,6 @@ func LoadConfig() error { | |||||||
| 	ymlPath := GetConfigPath() | 	ymlPath := GetConfigPath() | ||||||
| 	exist, _ := utils.FileExist(ymlPath) | 	exist, _ := utils.FileExist(ymlPath) | ||||||
| 	if exist { | 	if exist { | ||||||
| 		fmt.Println("Found config file", ymlPath) |  | ||||||
| 		bs, err := ioutil.ReadFile(ymlPath) | 		bs, err := ioutil.ReadFile(ymlPath) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| @@ -145,16 +144,3 @@ func curGitRepoPath(repoValue, remoteValue string) (*Login, string, error) { | |||||||
|  |  | ||||||
| 	return nil, "", errors.New("No Gitea login found. You might want to specify --repo (and --login) to work outside of a repository") | 	return nil, "", errors.New("No Gitea login found. You might want to specify --repo (and --login) to work outside of a repository") | ||||||
| } | } | ||||||
|  |  | ||||||
| // GetOwnerAndRepo return repoOwner and repoName |  | ||||||
| // based on relative path and default owner (if not in path) |  | ||||||
| func GetOwnerAndRepo(repoPath, user string) (string, string) { |  | ||||||
| 	if len(repoPath) == 0 { |  | ||||||
| 		return "", "" |  | ||||||
| 	} |  | ||||||
| 	p := strings.Split(repoPath, "/") |  | ||||||
| 	if len(p) >= 2 { |  | ||||||
| 		return p[0], p[1] |  | ||||||
| 	} |  | ||||||
| 	return user, repoPath |  | ||||||
| } |  | ||||||
|   | |||||||
| @@ -13,7 +13,6 @@ import ( | |||||||
| 	"net/http/cookiejar" | 	"net/http/cookiejar" | ||||||
| 	"net/url" | 	"net/url" | ||||||
| 	"os" | 	"os" | ||||||
| 	"strings" |  | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"code.gitea.io/tea/modules/utils" | 	"code.gitea.io/tea/modules/utils" | ||||||
| @@ -72,6 +71,29 @@ func (l *Login) GetSSHHost() string { | |||||||
| 	return u.Hostname() | 	return u.Hostname() | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GenerateToken creates a new token when given BasicAuth credentials | ||||||
|  | func (l *Login) GenerateToken(user, pass string) (string, error) { | ||||||
|  | 	client := l.Client() | ||||||
|  | 	gitea.SetBasicAuth(user, pass)(client) | ||||||
|  |  | ||||||
|  | 	host, _ := os.Hostname() | ||||||
|  | 	tl, _, err := client.ListAccessTokens(gitea.ListAccessTokensOptions{}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	tokenName := host + "-tea" | ||||||
|  |  | ||||||
|  | 	for i := range tl { | ||||||
|  | 		if tl[i].Name == tokenName { | ||||||
|  | 			tokenName += time.Now().Format("2006-01-02_15-04-05") | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	t, _, err := client.CreateAccessToken(gitea.CreateAccessTokenOption{Name: tokenName}) | ||||||
|  | 	return t.Token, err | ||||||
|  | } | ||||||
|  |  | ||||||
| // GetDefaultLogin return the default login | // GetDefaultLogin return the default login | ||||||
| func GetDefaultLogin() (*Login, error) { | func GetDefaultLogin() (*Login, error) { | ||||||
| 	if len(Config.Logins) == 0 { | 	if len(Config.Logins) == 0 { | ||||||
| @@ -98,7 +120,6 @@ func GetLoginByName(name string) *Login { | |||||||
|  |  | ||||||
| // AddLogin add login to config ( global var & file) | // AddLogin add login to config ( global var & file) | ||||||
| func AddLogin(name, token, user, passwd, sshKey, giteaURL string, insecure bool) error { | func AddLogin(name, token, user, passwd, sshKey, giteaURL string, insecure bool) error { | ||||||
|  |  | ||||||
| 	if len(giteaURL) == 0 { | 	if len(giteaURL) == 0 { | ||||||
| 		log.Fatal("You have to input Gitea server URL") | 		log.Fatal("You have to input Gitea server URL") | ||||||
| 	} | 	} | ||||||
| @@ -110,79 +131,45 @@ func AddLogin(name, token, user, passwd, sshKey, giteaURL string, insecure bool) | |||||||
| 		log.Fatal("No user set") | 		log.Fatal("No user set") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	err := LoadConfig() | 	serverURL, err := utils.NormalizeURL(giteaURL) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatal(err) | 		log.Fatal("Unable to parse URL", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	httpClient := &http.Client{} | 	err = LoadConfig() | ||||||
| 	if insecure { |  | ||||||
| 		cookieJar, _ := cookiejar.New(nil) |  | ||||||
| 		httpClient = &http.Client{ |  | ||||||
| 			Jar: cookieJar, |  | ||||||
| 			Transport: &http.Transport{ |  | ||||||
| 				TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, |  | ||||||
| 			}} |  | ||||||
| 	} |  | ||||||
| 	client, err := gitea.NewClient(giteaURL, |  | ||||||
| 		gitea.SetToken(token), |  | ||||||
| 		gitea.SetBasicAuth(user, passwd), |  | ||||||
| 		gitea.SetHTTPClient(httpClient), |  | ||||||
| 	) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatal(err) | 		log.Fatal("Unable to load config file " + yamlConfigPath) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	u, _, err := client.GetMyUserInfo() | 	login := Login{ | ||||||
| 	if err != nil { |  | ||||||
| 		log.Fatal(err) |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	if len(token) == 0 { |  | ||||||
| 		// create token |  | ||||||
| 		host, _ := os.Hostname() |  | ||||||
| 		tl, _, err := client.ListAccessTokens(gitea.ListAccessTokensOptions{}) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		tokenName := host + "-tea" |  | ||||||
| 		for i := range tl { |  | ||||||
| 			if tl[i].Name == tokenName { |  | ||||||
| 				tokenName += time.Now().Format("2006-01-02_15-04-05") |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 		t, _, err := client.CreateAccessToken(gitea.CreateAccessTokenOption{Name: tokenName}) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		token = t.Token |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	fmt.Println("Login successful! Login name " + u.UserName) |  | ||||||
|  |  | ||||||
| 	if len(name) == 0 { |  | ||||||
| 		parsedURL, err := url.Parse(giteaURL) |  | ||||||
| 		if err != nil { |  | ||||||
| 			return err |  | ||||||
| 		} |  | ||||||
| 		name = strings.ReplaceAll(strings.Title(parsedURL.Host), ".", "") |  | ||||||
| 		for _, l := range Config.Logins { |  | ||||||
| 			if l.Name == name { |  | ||||||
| 				name += "_" + u.UserName |  | ||||||
| 				break |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	err = addLoginToConfig(Login{ |  | ||||||
| 		Name:     name, | 		Name:     name, | ||||||
| 		URL:      giteaURL, | 		URL:      serverURL.String(), | ||||||
| 		Token:    token, | 		Token:    token, | ||||||
| 		Insecure: insecure, | 		Insecure: insecure, | ||||||
| 		SSHKey:   sshKey, | 		SSHKey:   sshKey, | ||||||
| 		User:     u.UserName, | 	} | ||||||
| 	}) |  | ||||||
|  | 	if len(token) == 0 { | ||||||
|  | 		login.Token, err = login.GenerateToken(user, passwd) | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Fatal(err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	u, _, err := login.Client().GetMyUserInfo() | ||||||
|  | 	if err != nil { | ||||||
|  | 		log.Fatal(err) | ||||||
|  | 	} | ||||||
|  | 	login.User = u.UserName | ||||||
|  |  | ||||||
|  | 	if len(login.Name) == 0 { | ||||||
|  | 		login.Name, err = GenerateLoginName(giteaURL, login.User) | ||||||
|  | 		if err != nil { | ||||||
|  | 			log.Fatal(err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	err = addLoginToConfig(login) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		log.Fatal(err) | 		log.Fatal(err) | ||||||
| 	} | 	} | ||||||
| @@ -192,9 +179,32 @@ func AddLogin(name, token, user, passwd, sshKey, giteaURL string, insecure bool) | |||||||
| 		log.Fatal(err) | 		log.Fatal(err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	fmt.Printf("Login as %s on %s successful. Added this login as %s\n", login.User, login.URL, login.Name) | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // GenerateLoginName generates a name string based on instance URL & adds username if the result is not unique | ||||||
|  | func GenerateLoginName(url, user string) (string, error) { | ||||||
|  | 	parsedURL, err := utils.NormalizeURL(url) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return "", err | ||||||
|  | 	} | ||||||
|  | 	name := parsedURL.Host | ||||||
|  |  | ||||||
|  | 	// append user name if login name already exists | ||||||
|  | 	if len(user) != 0 { | ||||||
|  | 		for _, l := range Config.Logins { | ||||||
|  | 			if l.Name == name { | ||||||
|  | 				name += "_" + user | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	return name, nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // addLoginToConfig add a login to global Config var | // addLoginToConfig add a login to global Config var | ||||||
| func addLoginToConfig(login Login) error { | func addLoginToConfig(login Login) error { | ||||||
| 	for _, l := range Config.Logins { | 	for _, l := range Config.Logins { | ||||||
| @@ -205,18 +215,18 @@ func addLoginToConfig(login Login) error { | |||||||
| 			return errors.New("Login name has already been used") | 			return errors.New("Login name has already been used") | ||||||
| 		} | 		} | ||||||
| 		if l.URL == login.URL && l.Token == login.Token { | 		if l.URL == login.URL && l.Token == login.Token { | ||||||
| 			return errors.New("URL has been added") | 			return errors.New("Login for this URL and token already exists") | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	u, err := url.Parse(login.URL) | 	if len(login.SSHHost) == 0 { | ||||||
| 	if err != nil { | 		u, err := url.Parse(login.URL) | ||||||
| 		return err | 		if err != nil { | ||||||
| 	} | 			return err | ||||||
|  | 		} | ||||||
| 	if login.SSHHost == "" { |  | ||||||
| 		login.SSHHost = u.Hostname() | 		login.SSHHost = u.Hostname() | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	Config.Logins = append(Config.Logins, login) | 	Config.Logins = append(Config.Logins, login) | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
| @@ -254,7 +264,7 @@ func InitCommand(repoValue, loginValue, remoteValue string) (*Login, string, str | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	owner, repo := GetOwnerAndRepo(repoValue, login.User) | 	owner, repo := utils.GetOwnerAndRepo(repoValue, login.User) | ||||||
| 	return login, owner, repo | 	return login, owner, repo | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -6,7 +6,6 @@ package interact | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/url" |  | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"code.gitea.io/tea/modules/config" | 	"code.gitea.io/tea/modules/config" | ||||||
| @@ -27,11 +26,10 @@ func CreateLogin() error { | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	parsedURL, err := url.Parse(giteaURL) | 	name, err := config.GenerateLoginName(giteaURL, "") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	name = strings.ReplaceAll(strings.Title(parsedURL.Host), ".", "") |  | ||||||
|  |  | ||||||
| 	fmt.Print("Name of new Login [" + name + "]: ") | 	fmt.Print("Name of new Login [" + name + "]: ") | ||||||
| 	if _, err := fmt.Scanln(&stdin); err != nil { | 	if _, err := fmt.Scanln(&stdin); err != nil { | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ | |||||||
| package utils | package utils | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
|  | 	"net/url" | ||||||
| 	"strconv" | 	"strconv" | ||||||
| 	"strings" | 	"strings" | ||||||
| ) | ) | ||||||
| @@ -16,3 +17,25 @@ func ArgToIndex(arg string) (int64, error) { | |||||||
| 	} | 	} | ||||||
| 	return strconv.ParseInt(arg, 10, 64) | 	return strconv.ParseInt(arg, 10, 64) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // NormalizeURL normalizes the input with a protocol | ||||||
|  | func NormalizeURL(raw string) (*url.URL, error) { | ||||||
|  | 	var prefix string | ||||||
|  | 	if !strings.HasPrefix(raw, "http") { | ||||||
|  | 		prefix = "https://" | ||||||
|  | 	} | ||||||
|  | 	return url.Parse(prefix + raw) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // GetOwnerAndRepo return repoOwner and repoName | ||||||
|  | // based on relative path and default owner (if not in path) | ||||||
|  | func GetOwnerAndRepo(repoPath, user string) (string, string) { | ||||||
|  | 	if len(repoPath) == 0 { | ||||||
|  | 		return "", "" | ||||||
|  | 	} | ||||||
|  | 	p := strings.Split(repoPath, "/") | ||||||
|  | 	if len(p) >= 2 { | ||||||
|  | 		return p[0], p[1] | ||||||
|  | 	} | ||||||
|  | 	return user, repoPath | ||||||
|  | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Norwin
					Norwin