2022-08-16 17:49:39 +03:00
|
|
|
#!./kitty/launcher/kitty +launch
|
|
|
|
# License: GPLv3 Copyright: 2022, Kovid Goyal <kovid at kovidgoyal.net>
|
|
|
|
|
|
|
|
import os
|
|
|
|
import subprocess
|
|
|
|
import sys
|
2022-08-17 07:04:03 +03:00
|
|
|
from typing import List
|
2022-08-16 17:49:39 +03:00
|
|
|
|
2022-08-17 07:04:03 +03:00
|
|
|
import kitty.constants as kc
|
2022-08-17 10:59:12 +03:00
|
|
|
from kitty.cli import OptionDict, OptionSpecSeq, parse_option_spec
|
|
|
|
from kitty.rc.base import RemoteCommand, all_command_names, command_for_name
|
2022-08-16 17:49:39 +03:00
|
|
|
|
|
|
|
|
|
|
|
def serialize_as_go_string(x: str) -> str:
|
|
|
|
return x.replace('\n', '\\n').replace('"', '\\"')
|
|
|
|
|
|
|
|
|
2022-08-17 07:04:03 +03:00
|
|
|
def replace(template: str, **kw: str) -> str:
|
|
|
|
for k, v in kw.items():
|
|
|
|
template = template.replace(k, v)
|
|
|
|
return template
|
|
|
|
|
|
|
|
|
2022-08-17 10:59:12 +03:00
|
|
|
class Option:
|
|
|
|
|
|
|
|
def __init__(self, x: OptionDict) -> None:
|
|
|
|
flags = sorted(x['aliases'], key=len)
|
|
|
|
short = ''
|
|
|
|
if len(flags) > 1 and not flags[0].startswith("--"):
|
|
|
|
short = flags[0][1:]
|
|
|
|
long = flags[-1][2:]
|
|
|
|
if not long:
|
|
|
|
raise SystemExit(f'No long flag for {x} with flags {flags}')
|
|
|
|
self.short, self.long = short, long
|
|
|
|
self.usage = serialize_as_go_string(x['help'].strip())
|
|
|
|
self.type = x['type']
|
|
|
|
|
|
|
|
def to_flag_definition(self, base: str = 'ans.Flags()') -> str:
|
|
|
|
if self.type == 'bool-set':
|
|
|
|
if self.short:
|
|
|
|
return f'{base}.BoolP("{self.long}", "{self.short}", false, "{self.usage}")'
|
|
|
|
return f'{base}.Bool("{self.long}", false, "{self.usage}")'
|
|
|
|
return ''
|
|
|
|
|
|
|
|
|
2022-08-17 07:04:03 +03:00
|
|
|
def build_go_code(name: str, cmd: RemoteCommand, seq: OptionSpecSeq, template: str) -> str:
|
2022-08-16 21:41:28 +03:00
|
|
|
template = '\n' + template[len('//go:build exclude'):]
|
2022-08-17 07:04:03 +03:00
|
|
|
NO_RESPONSE_BASE = 'true' if cmd.no_response else 'false'
|
|
|
|
af: List[str] = []
|
|
|
|
a = af.append
|
|
|
|
for x in seq:
|
|
|
|
if isinstance(x, str):
|
|
|
|
continue
|
2022-08-17 10:59:12 +03:00
|
|
|
o = Option(x)
|
|
|
|
a(o.to_flag_definition())
|
2022-08-17 07:04:03 +03:00
|
|
|
ans = replace(
|
|
|
|
template,
|
|
|
|
CMD_NAME=name, __FILE__=__file__, CLI_NAME=name.replace('_', '-'),
|
|
|
|
SHORT_DESC=serialize_as_go_string(cmd.short_desc),
|
|
|
|
LONG_DESC=serialize_as_go_string(cmd.desc.strip()),
|
|
|
|
NO_RESPONSE_BASE=NO_RESPONSE_BASE, ADD_FLAGS_CODE='\n'.join(af))
|
2022-08-16 17:49:39 +03:00
|
|
|
return ans
|
|
|
|
|
|
|
|
|
|
|
|
def main() -> None:
|
|
|
|
if 'prewarmed' in getattr(sys, 'kitty_run_data'):
|
|
|
|
os.environ.pop('KITTY_PREWARM_SOCKET')
|
|
|
|
os.execlp(sys.executable, sys.executable, '+launch', __file__, *sys.argv[1:])
|
2022-08-16 19:29:42 +03:00
|
|
|
with open('constants_generated.go', 'w') as f:
|
2022-08-16 18:56:55 +03:00
|
|
|
dp = ", ".join(map(lambda x: f'"{serialize_as_go_string(x)}"', kc.default_pager_for_help))
|
2022-08-16 18:44:40 +03:00
|
|
|
f.write(f'''\
|
|
|
|
// auto-generated by {__file__} do no edit
|
|
|
|
|
|
|
|
package kitty
|
|
|
|
|
|
|
|
type VersionType struct {{
|
|
|
|
Major, Minor, Patch int
|
|
|
|
}}
|
|
|
|
var VersionString string = "{kc.str_version}"
|
|
|
|
var WebsiteBaseURL string = "{kc.website_base_url}"
|
|
|
|
var Version VersionType = VersionType{{Major: {kc.version.major}, Minor: {kc.version.minor}, Patch: {kc.version.patch},}}
|
|
|
|
var DefaultPager []string = []string{{ {dp} }}
|
|
|
|
var VCSRevision string = ""
|
2022-08-17 06:10:57 +03:00
|
|
|
var RC_ENCRYPTION_PROTOCOL_VERSION string = "{kc.RC_ENCRYPTION_PROTOCOL_VERSION}"
|
2022-08-17 08:29:55 +03:00
|
|
|
var IsFrozenBuild bool = false
|
2022-08-16 18:44:40 +03:00
|
|
|
''')
|
2022-08-16 17:49:39 +03:00
|
|
|
with open('tools/cmd/at/template.go') as f:
|
|
|
|
template = f.read()
|
|
|
|
for name in all_command_names():
|
|
|
|
cmd = command_for_name(name)
|
2022-08-17 07:04:03 +03:00
|
|
|
opts = parse_option_spec(cmd.options_spec)[0]
|
2022-08-16 17:49:39 +03:00
|
|
|
code = build_go_code(name, cmd, opts, template)
|
|
|
|
dest = f'tools/cmd/at/{name}_generated.go'
|
|
|
|
if os.path.exists(dest):
|
|
|
|
os.remove(dest)
|
|
|
|
with open(dest, 'w') as f:
|
|
|
|
f.write(code)
|
2022-08-17 10:59:12 +03:00
|
|
|
cp = subprocess.run('gofmt -s -w tools/cmd/at'.split())
|
|
|
|
if cp.returncode != 0:
|
|
|
|
raise SystemExit(cp.returncode)
|
2022-08-16 17:49:39 +03:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main()
|