Add preference flag_defaults.remote, refactor #466

Merged
6543 merged 13 commits from noerw/tea:fix-458 into master 2022-03-28 23:34:14 +00:00
2 changed files with 41 additions and 20 deletions

View File

@ -17,10 +17,20 @@ import (
"gopkg.in/yaml.v2"
)
// FlagDefaults defines all flags that can be overridden with a default value
// via the config file
type FlagDefaults struct {
// Prefer a specific git remote to use for selecting a repository on gitea,
// instead of relying on the remote associated with main/master/trunk branch.
// The --remote flag still has precedence over this value.
Remote string `yaml:"remote"`
}
// Preferences that are stored in and read from the config file
type Preferences struct {
// Prefer using an external text editor over inline multiline prompts
Editor bool `yaml:"editor"`
Editor bool `yaml:"editor"`
FlagDefaults FlagDefaults `yaml:"flag_defaults"`
}
// LocalConfig represents local configurations
@ -64,6 +74,7 @@ func GetConfigPath() string {
// GetPreferences returns preferences based on the config file
func GetPreferences() Preferences {
loadConfig()
return config.Prefs
}

View File

@ -99,6 +99,10 @@ func InitCommand(ctx *cli.Context) *TeaContext {
}
}
if len(remoteFlag) == 0 {
remoteFlag = config.GetPreferences().FlagDefaults.Remote
}
// try to read local git repo & extract context: if repoFlag specifies a valid path, read repo in that dir,
// otherwise attempt PWD. if no repo is found, continue with default login
if c.LocalRepo, c.Login, c.RepoSlug, err = contextFromLocalRepo(repoPath, remoteFlag); err != nil {
@ -158,28 +162,34 @@ func contextFromLocalRepo(repoPath, remoteValue string) (*git.TeaRepo, *config.L
return repo, nil, "", errors.New("No remote(s) found in this Git repository")
}
// if only one remote exists
if len(gitConfig.Remotes) >= 1 && len(remoteValue) == 0 {
for remote := range gitConfig.Remotes {
remoteValue = remote
}
noerw marked this conversation as resolved Outdated

You made tea by default unusable for repositories with just one remote by this change. This was here to selecet at least some remote if availeble but you moved it to a part for more than one remotes. In case of one remote tea pr prints this.

2022/03/18 12:42:17 Remote '' not found in this Git repository
You made `tea` by default unusable for repositories with just one remote by this change. This was here to selecet at least some remote if availeble but you moved it to a part for more than one remotes. In case of one remote `tea pr` prints this. ``` 2022/03/18 12:42:17 Remote '' not found in this Git repository ```
Outdated
Review

fixed

fixed
if len(gitConfig.Remotes) > 1 {
// prefer origin if there is multiple remotes
_, ok := gitConfig.Remotes["origin"]
// When no preferred value is given, choose a remote to find a
// matching login based on its URL.
if len(gitConfig.Remotes) > 1 && len(remoteValue) == 0 {
// if master branch is present, use it as the default remote
mainBranches := []string{"main", "master", "trunk"}
for _, b := range mainBranches {
masterBranch, ok := gitConfig.Branches[b]
if ok {
if len(masterBranch.Remote) > 0 {
remoteValue = masterBranch.Remote
}
break
}
}
// if no branch has matched, default to origin or upstream remote.
if len(remoteValue) == 0 {
if _, ok := gitConfig.Remotes["upstream"]; ok {
remoteValue = "upstream"
} else if _, ok := gitConfig.Remotes["origin"]; ok {
remoteValue = "origin"
}
// if master branch is present, use it as the default remote
mainBranches := []string{"main", "master", "trunk"}
for _, b := range mainBranches {
masterBranch, ok := gitConfig.Branches[b]
if ok {
if len(masterBranch.Remote) > 0 {
remoteValue = masterBranch.Remote
}
break
}
}
}
}
// make sure a remote is selected
if len(remoteValue) == 0 {
for remote := range gitConfig.Remotes {
remoteValue = remote
6543 marked this conversation as resolved
Review

Maybe we can break after the first remote, there is no need to iterate through all of them.

Maybe we can break after the first remote, there is no need to iterate through all of them.
Review

this is breaking though for little benefit in 99% of cases

this is breaking though for little benefit in 99% of cases
break
}
}