Add preference `flag_defaults.remote`, refactor (#466)

This is a refactor of the code last touched in #458, making the control flow less backwards.

Additionally, this adds a preference `preferences.flag_defaults.remote` that allows to skip this heuristic and set a custom fixed default value for the `--remote` flag.
I'm not sure this is actually needed, I can revert that commit.

Co-authored-by: Norwin <git@nroo.de>
Co-authored-by: 6543 <6543@obermui.de>
Co-authored-by: Andrew Thornton <art27@cantab.net>
Reviewed-on: https://gitea.com/gitea/tea/pulls/466
Reviewed-by: 6543 <6543@obermui.de>
Reviewed-by: Andrew Thornton <art27@cantab.net>
Co-authored-by: Norwin <noerw@noreply.gitea.io>
Co-committed-by: Norwin <noerw@noreply.gitea.io>
This commit is contained in:
Norwin 2022-03-29 07:34:14 +08:00 committed by 6543
parent d06f35482e
commit 6663d9f19b
2 changed files with 41 additions and 20 deletions

View File

@ -17,10 +17,20 @@ import (
"gopkg.in/yaml.v2" "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 // Preferences that are stored in and read from the config file
type Preferences struct { type Preferences struct {
// Prefer using an external text editor over inline multiline prompts // 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 // LocalConfig represents local configurations
@ -64,6 +74,7 @@ func GetConfigPath() string {
// GetPreferences returns preferences based on the config file // GetPreferences returns preferences based on the config file
func GetPreferences() Preferences { func GetPreferences() Preferences {
loadConfig()
return config.Prefs 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, // 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 // 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 { if c.LocalRepo, c.Login, c.RepoSlug, err = contextFromLocalRepo(repoPath, remoteFlag); err != nil {
@ -158,17 +162,9 @@ func contextFromLocalRepo(repoPath, remoteValue string) (*git.TeaRepo, *config.L
return repo, nil, "", errors.New("No remote(s) found in this Git repository") return repo, nil, "", errors.New("No remote(s) found in this Git repository")
} }
// if only one remote exists // When no preferred value is given, choose a remote to find a
if len(gitConfig.Remotes) >= 1 && len(remoteValue) == 0 { // matching login based on its URL.
for remote := range gitConfig.Remotes { if len(gitConfig.Remotes) > 1 && len(remoteValue) == 0 {
remoteValue = remote
}
if len(gitConfig.Remotes) > 1 {
// prefer origin if there is multiple remotes
_, ok := gitConfig.Remotes["origin"]
if ok {
remoteValue = "origin"
}
// if master branch is present, use it as the default remote // if master branch is present, use it as the default remote
mainBranches := []string{"main", "master", "trunk"} mainBranches := []string{"main", "master", "trunk"}
for _, b := range mainBranches { for _, b := range mainBranches {
@ -180,6 +176,20 @@ func contextFromLocalRepo(repoPath, remoteValue string) (*git.TeaRepo, *config.L
break 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"
}
}
}
// make sure a remote is selected
if len(remoteValue) == 0 {
for remote := range gitConfig.Remotes {
remoteValue = remote
break
} }
} }