diff --git a/kittens/ssh/config.py b/kittens/ssh/config.py index 0183df7b5..35f47619c 100644 --- a/kittens/ssh/config.py +++ b/kittens/ssh/config.py @@ -10,9 +10,6 @@ from kitty.conf.utils import load_config as _load_config from kitty.conf.utils import parse_config_base, resolve_config from kitty.constants import config_dir -from .options.types import Options as SSHOptions -from .options.types import defaults - SYSTEM_CONF = '/etc/xdg/kitty/ssh.conf' defconf = os.path.join(config_dir, 'ssh.conf') @@ -27,7 +24,7 @@ def host_matches(mpat: str, hostname: str, username: str) -> bool: return False -def load_config(*paths: str, overrides: Optional[Iterable[str]] = None, hostname: str = '!', username: str = '') -> SSHOptions: +def load_config(*paths: str, overrides: Optional[Iterable[str]] = None, hostname: str = '!', username: str = '') -> 'SSHOptions': from .options.parse import create_result_dict, merge_result_dicts, parse_conf_item from .options.utils import first_seen_positions, get_per_hosts_dict, init_results_dict @@ -65,6 +62,6 @@ def load_config(*paths: str, overrides: Optional[Iterable[str]] = None, hostname return SSHOptions(final_dict) -def init_config(hostname: str, username: str, overrides: Optional[Iterable[str]] = None) -> SSHOptions: +def init_config(hostname: str, username: str, overrides: Optional[Iterable[str]] = None) -> 'SSHOptions': config = tuple(resolve_config(SYSTEM_CONF, defconf)) return load_config(*config, overrides=overrides, hostname=hostname, username=username) diff --git a/kittens/ssh/main.py b/kittens/ssh/main.py index 7f0ab0842..585892f3e 100644 --- a/kittens/ssh/main.py +++ b/kittens/ssh/main.py @@ -35,7 +35,6 @@ from ..tui.operations import RESTORE_PRIVATE_MODE_VALUES, SAVE_PRIVATE_MODE_VALU from ..tui.utils import kitty_opts, running_in_tmux from .config import init_config from .copy import CopyInstruction -from .options.types import Options as SSHOptions from .utils import create_shared_memory, get_ssh_cli, is_extra_arg, passthrough_args @@ -101,7 +100,7 @@ def serialize_env(literal_env: Dict[str, str], env: Dict[str, str], base_env: Di return '\n'.join(lines).encode('utf-8') -def make_tarfile(ssh_opts: SSHOptions, base_env: Dict[str, str], compression: str = 'gz', literal_env: Dict[str, str] = {}) -> bytes: +def make_tarfile(ssh_opts: 'SSHOptions', base_env: Dict[str, str], compression: str = 'gz', literal_env: Dict[str, str] = {}) -> bytes: def normalize_tarinfo(tarinfo: tarfile.TarInfo) -> tarfile.TarInfo: tarinfo.uname = tarinfo.gname = '' @@ -249,7 +248,7 @@ def prepare_exec_cmd(remote_args: Sequence[str], is_python: bool) -> str: return f"""unset KITTY_SHELL_INTEGRATION; exec "$login_shell" -c '{args}'""" -def prepare_export_home_cmd(ssh_opts: SSHOptions, is_python: bool) -> str: +def prepare_export_home_cmd(ssh_opts: 'SSHOptions', is_python: bool) -> str: home = ssh_opts.env.get('HOME') if home == '_kitty_copy_env_var_': home = os.environ.get('HOME') @@ -262,7 +261,7 @@ def prepare_export_home_cmd(ssh_opts: SSHOptions, is_python: bool) -> str: def bootstrap_script( - ssh_opts: SSHOptions, script_type: str = 'sh', remote_args: Sequence[str] = (), + ssh_opts: 'SSHOptions', script_type: str = 'sh', remote_args: Sequence[str] = (), test_script: str = '', request_id: Optional[str] = None, cli_hostname: str = '', cli_uname: str = '', request_data: bool = False, echo_on: bool = True, literal_env: Dict[str, str] = {} ) -> Tuple[str, Dict[str, str], str]: @@ -471,7 +470,7 @@ def wrap_bootstrap_script(sh_script: str, interpreter: str) -> List[str]: def get_remote_command( - remote_args: List[str], ssh_opts: SSHOptions, cli_hostname: str = '', cli_uname: str = '', + remote_args: List[str], ssh_opts: 'SSHOptions', cli_hostname: str = '', cli_uname: str = '', echo_on: bool = True, request_data: bool = False, literal_env: Dict[str, str] = {} ) -> Tuple[List[str], Dict[str, str], str]: interpreter = ssh_opts.interpreter diff --git a/kitty/conf/generate.py b/kitty/conf/generate.py index 8927fa98e..b93f131f2 100644 --- a/kitty/conf/generate.py +++ b/kitty/conf/generate.py @@ -472,7 +472,7 @@ def gen_go_code(defn: Definition) -> str: go_types[name], go_parsers[name] = go_type_data(option.parser_func, type_defs) multiopts.add(name) else: - defaults[name] = option.defval_as_string + defaults[name] = option.parser_func(option.defval_as_string) if option.choices: choices[name] = option.choices go_types[name] = f'{name}_Choice_Type' @@ -492,23 +492,26 @@ def gen_go_code(defn: Definition) -> str: a(f'{name} {gotype}') a('}') - a('func NewConfig() *Config {') - a('ans := Config{}') - a('var err error') - a('var val string') - for name, pname in go_parsers.items(): - if name in multiopts: - a(f'ans.{name} = make([]{go_types[name]}, 0, 8)') - continue - a(f'val = `{defaults[name]}`') - a(f'ans.{name}, err = {pname}') - a('if err != nil { panic(err) }') - a('return &ans') - a('}') - def cval(x: str) -> str: return x.replace('-', '_') + a('func NewConfig() *Config {') + a('return &Config{') + for name, pname in go_parsers.items(): + if name in multiopts: + continue + d = defaults[name] + if not d: + continue + if isinstance(d, str): + dval = f'{name}_{cval(d)}' if name in choices else f'`{d}`' + elif isinstance(d, bool): + dval = repr(d).lower() + else: + dval = repr(d) + a(f'{name}: {dval},') + a('}''}') + for oname, choice_vals in choices.items(): a('const (') for i, c in enumerate(choice_vals):