2018-04-11 10:33:40 +03:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# vim:fileencoding=utf-8
|
|
|
|
# License: GPL v3 Copyright: 2018, Kovid Goyal <kovid at kovidgoyal.net>
|
|
|
|
|
|
|
|
|
|
|
|
import importlib
|
|
|
|
import os
|
|
|
|
import sys
|
|
|
|
from functools import partial
|
|
|
|
|
2018-04-12 06:53:48 +03:00
|
|
|
aliases = {'url_hints': 'hints'}
|
|
|
|
|
|
|
|
|
|
|
|
def resolved_kitten(k):
|
|
|
|
return aliases.get(k, k)
|
|
|
|
|
2018-04-11 10:33:40 +03:00
|
|
|
|
|
|
|
def import_kitten_main_module(config_dir, kitten):
|
|
|
|
if kitten.endswith('.py'):
|
|
|
|
path = os.path.expanduser(kitten)
|
|
|
|
if not os.path.isabs(path):
|
|
|
|
path = os.path.join(config_dir, path)
|
|
|
|
path = os.path.abspath(path)
|
|
|
|
if os.path.dirname(path):
|
|
|
|
sys.path.insert(0, os.path.dirname(path))
|
|
|
|
with open(path) as f:
|
|
|
|
src = f.read()
|
|
|
|
code = compile(src, path, 'exec')
|
|
|
|
g = {'__name__': 'kitten'}
|
|
|
|
exec(code, g)
|
|
|
|
return {'start': g['main'], 'end': g['handle_result']}
|
|
|
|
else:
|
2018-04-12 06:53:48 +03:00
|
|
|
kitten = resolved_kitten(kitten)
|
2018-04-11 10:33:40 +03:00
|
|
|
m = importlib.import_module('kittens.{}.main'.format(kitten))
|
|
|
|
return {'start': m.main, 'end': m.handle_result}
|
|
|
|
|
|
|
|
|
|
|
|
def create_kitten_handler(kitten, orig_args):
|
|
|
|
from kitty.constants import config_dir
|
2018-04-12 06:53:48 +03:00
|
|
|
kitten = resolved_kitten(kitten)
|
2018-04-11 10:33:40 +03:00
|
|
|
m = import_kitten_main_module(config_dir, kitten)
|
|
|
|
return partial(m['end'], [kitten] + orig_args)
|
|
|
|
|
|
|
|
|
2018-05-06 11:18:40 +03:00
|
|
|
def set_debug(kitten):
|
|
|
|
from kittens.tui.loop import debug
|
|
|
|
path = os.path.join('/tmp', 'kitten-' + kitten)
|
|
|
|
debug.fd = open(path, 'w')
|
|
|
|
import builtins
|
|
|
|
builtins.debug = debug
|
|
|
|
|
|
|
|
|
2018-04-11 10:33:40 +03:00
|
|
|
def launch(args):
|
|
|
|
config_dir, kitten = args[:2]
|
2018-04-12 06:53:48 +03:00
|
|
|
kitten = resolved_kitten(kitten)
|
2018-04-11 10:33:40 +03:00
|
|
|
del args[:2]
|
|
|
|
args = [kitten] + args
|
|
|
|
os.environ['KITTY_CONFIG_DIRECTORY'] = config_dir
|
|
|
|
from kittens.tui.operations import clear_screen, reset_mode
|
2018-05-06 11:18:40 +03:00
|
|
|
set_debug(kitten)
|
2018-04-11 10:33:40 +03:00
|
|
|
m = import_kitten_main_module(config_dir, kitten)
|
2018-04-23 04:49:40 +03:00
|
|
|
try:
|
|
|
|
result = m['start'](args)
|
|
|
|
finally:
|
|
|
|
sys.stdin = sys.__stdin__
|
2018-04-11 10:33:40 +03:00
|
|
|
print(reset_mode('ALTERNATE_SCREEN') + clear_screen(), end='')
|
|
|
|
if result is not None:
|
|
|
|
import json
|
2018-04-23 04:49:40 +03:00
|
|
|
data = json.dumps(result)
|
|
|
|
print('OK:', len(data), data)
|
2018-04-11 17:54:39 +03:00
|
|
|
sys.stderr.flush()
|
|
|
|
sys.stdout.flush()
|
2018-04-11 10:33:40 +03:00
|
|
|
|
|
|
|
|
2018-04-23 04:49:40 +03:00
|
|
|
def deserialize(output):
|
|
|
|
import json
|
|
|
|
if output.startswith('OK: '):
|
|
|
|
prefix, sz, rest = output.split(' ', 2)
|
|
|
|
return json.loads(rest[:int(sz)])
|
|
|
|
|
|
|
|
|
2018-04-12 06:53:48 +03:00
|
|
|
def run_kitten(kitten):
|
|
|
|
import runpy
|
|
|
|
kitten = resolved_kitten(kitten)
|
2018-05-06 11:18:40 +03:00
|
|
|
set_debug(kitten)
|
2018-04-12 06:53:48 +03:00
|
|
|
runpy.run_module('kittens.{}.main'.format(kitten), run_name='__main__')
|
|
|
|
|
|
|
|
|
2018-04-11 10:33:40 +03:00
|
|
|
def main():
|
|
|
|
try:
|
|
|
|
args = sys.argv[1:]
|
|
|
|
launch(args)
|
|
|
|
except Exception:
|
|
|
|
print('Unhandled exception running kitten:')
|
|
|
|
import traceback
|
|
|
|
traceback.print_exc()
|
|
|
|
input('Press Enter to quit...')
|