Abstract typical config file loading with path and cli overrides

This commit is contained in:
Kovid Goyal 2023-03-16 11:03:58 +05:30
parent 5329546f21
commit d208670172
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 91 additions and 15 deletions

View File

@ -6,11 +6,61 @@ import (
"fmt"
"kitty/tools/cli"
"kitty/tools/config"
"kitty/tools/tui/loop"
)
var _ = fmt.Print
func main(_ *cli.Command, opts *Options, args []string) (rc int, err error) {
func load_config(opts *Options) (ans *Config, err error) {
ans = NewConfig()
p := config.ConfigParser{LineHandler: ans.Parse}
err = p.LoadConfig("diff.conf", opts.Config, opts.Override)
if err != nil {
return nil, err
}
return ans, nil
}
var conf *Config
var opts *Options
var lp *loop.Loop
func main(_ *cli.Command, opts_ *Options, args []string) (rc int, err error) {
opts = opts_
conf, err = load_config(opts)
if err != nil {
return 1, err
}
if len(args) != 2 {
return 1, fmt.Errorf("You must specify exactly two files/directories to compare")
}
left, right := args[0], args[1]
lp, err = loop.New()
if err != nil {
return 1, err
}
lp.OnInitialize = func() (string, error) {
lp.SetCursorVisible(false)
lp.AllowLineWrapping(false)
lp.SetWindowTitle(fmt.Sprintf("%s vs. %s", left, right))
return "", nil
}
lp.OnFinalize = func() string {
lp.SetCursorVisible(true)
return ""
}
err = lp.Run()
if err != nil {
return 1, err
}
ds := lp.DeathSignalName()
if ds != "" {
fmt.Println("Killed by signal: ", ds)
lp.KillIfSignalled()
return 1, nil
}
return
}

View File

@ -391,19 +391,9 @@ func (self *ConfigSet) line_handler(key, val string) error {
func load_config(hostname_to_match string, username_to_match string, overrides []string, paths ...string) (*Config, []config.ConfigLine, error) {
ans := &ConfigSet{all_configs: []*Config{NewConfig()}}
p := config.ConfigParser{LineHandler: ans.line_handler}
if len(paths) == 0 {
paths = []string{filepath.Join(utils.ConfigDir(), "ssh.conf")}
}
paths = utils.Filter(paths, func(x string) bool { return x != "" })
err := p.ParseFiles(paths...)
if err != nil && !errors.Is(err, fs.ErrNotExist) {
err := p.LoadConfig("ssh.conf", paths, overrides)
if err != nil {
return nil, nil, err
}
if len(overrides) > 0 {
err = p.ParseOverrides(overrides...)
if err != nil {
return nil, nil, err
}
}
return config_for_hostname(hostname_to_match, username_to_match, ans), p.BadLines(), nil
}

View File

@ -168,6 +168,38 @@ func (self *ConfigParser) ParseFiles(paths ...string) error {
return nil
}
func (self *ConfigParser) LoadConfig(name string, paths []string, overrides []string) (err error) {
const SYSTEM_CONF = "/etc/xdg/kitty"
system_conf := filepath.Join(SYSTEM_CONF, name)
add_if_exists := func(q string) {
err = self.ParseFiles(q)
if err != nil && errors.Is(err, fs.ErrNotExist) {
err = nil
}
}
if add_if_exists(system_conf); err != nil {
return err
}
if len(paths) > 0 {
for _, path := range paths {
if add_if_exists(path); err != nil {
return err
}
}
} else {
if add_if_exists(filepath.Join(utils.ConfigDirForName(name), name)); err != nil {
return err
}
}
if len(overrides) > 0 {
err = self.ParseOverrides(overrides...)
if err != nil {
return err
}
}
return
}
type LinesScanner struct {
lines []string
}

View File

@ -73,7 +73,7 @@ var KittyExe = (&Once[string]{Run: func() string {
return os.Getenv("KITTY_PATH_TO_KITTY_EXE")
}}).Get
var ConfigDir = (&Once[string]{Run: func() (config_dir string) {
func ConfigDirForName(name string) (config_dir string) {
if kcd := os.Getenv("KITTY_CONFIG_DIRECTORY"); kcd != "" {
return Abspath(Expanduser(kcd))
}
@ -101,7 +101,7 @@ var ConfigDir = (&Once[string]{Run: func() (config_dir string) {
for _, loc := range locations {
if loc != "" {
q := filepath.Join(loc, "kitty")
if _, err := os.Stat(filepath.Join(q, "kitty.conf")); err == nil {
if _, err := os.Stat(filepath.Join(q, name)); err == nil {
config_dir = q
return
}
@ -113,6 +113,10 @@ var ConfigDir = (&Once[string]{Run: func() (config_dir string) {
}
config_dir = filepath.Join(Expanduser(config_dir), "kitty")
return
}
var ConfigDir = (&Once[string]{Run: func() (config_dir string) {
return ConfigDirForName("kitty.conf")
}}).Get
var CacheDir = (&Once[string]{Run: func() (cache_dir string) {