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"
|
"fmt"
|
||||||
|
|
||||||
"kitty/tools/cli"
|
"kitty/tools/cli"
|
||||||
|
"kitty/tools/config"
|
||||||
|
"kitty/tools/tui/loop"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ = fmt.Print
|
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
|
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) {
|
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()}}
|
ans := &ConfigSet{all_configs: []*Config{NewConfig()}}
|
||||||
p := config.ConfigParser{LineHandler: ans.line_handler}
|
p := config.ConfigParser{LineHandler: ans.line_handler}
|
||||||
if len(paths) == 0 {
|
err := p.LoadConfig("ssh.conf", paths, overrides)
|
||||||
paths = []string{filepath.Join(utils.ConfigDir(), "ssh.conf")}
|
if err != nil {
|
||||||
}
|
|
||||||
paths = utils.Filter(paths, func(x string) bool { return x != "" })
|
|
||||||
err := p.ParseFiles(paths...)
|
|
||||||
if err != nil && !errors.Is(err, fs.ErrNotExist) {
|
|
||||||
return nil, nil, err
|
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
|
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
|
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 {
|
type LinesScanner struct {
|
||||||
lines []string
|
lines []string
|
||||||
}
|
}
|
||||||
|
|||||||
@ -73,7 +73,7 @@ var KittyExe = (&Once[string]{Run: func() string {
|
|||||||
return os.Getenv("KITTY_PATH_TO_KITTY_EXE")
|
return os.Getenv("KITTY_PATH_TO_KITTY_EXE")
|
||||||
}}).Get
|
}}).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 != "" {
|
if kcd := os.Getenv("KITTY_CONFIG_DIRECTORY"); kcd != "" {
|
||||||
return Abspath(Expanduser(kcd))
|
return Abspath(Expanduser(kcd))
|
||||||
}
|
}
|
||||||
@ -101,7 +101,7 @@ var ConfigDir = (&Once[string]{Run: func() (config_dir string) {
|
|||||||
for _, loc := range locations {
|
for _, loc := range locations {
|
||||||
if loc != "" {
|
if loc != "" {
|
||||||
q := filepath.Join(loc, "kitty")
|
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
|
config_dir = q
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -113,6 +113,10 @@ var ConfigDir = (&Once[string]{Run: func() (config_dir string) {
|
|||||||
}
|
}
|
||||||
config_dir = filepath.Join(Expanduser(config_dir), "kitty")
|
config_dir = filepath.Join(Expanduser(config_dir), "kitty")
|
||||||
return
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var ConfigDir = (&Once[string]{Run: func() (config_dir string) {
|
||||||
|
return ConfigDirForName("kitty.conf")
|
||||||
}}).Get
|
}}).Get
|
||||||
|
|
||||||
var CacheDir = (&Once[string]{Run: func() (cache_dir string) {
|
var CacheDir = (&Once[string]{Run: func() (cache_dir string) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user