Abstract typical config file loading with path and cli overrides
This commit is contained in:
parent
5329546f21
commit
d208670172
@ -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
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user