More work on the diff kitten

This commit is contained in:
Kovid Goyal 2018-04-19 10:26:14 +05:30
parent 1dc83a47cf
commit d5907a1bf9
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
4 changed files with 59 additions and 7 deletions

View File

@ -107,8 +107,7 @@ class Differ:
key = file1, file2
self.jobs.append(key)
def __call__(self):
context = 3
def __call__(self, context=3):
ans = {}
with concurrent.futures.ThreadPoolExecutor(max_workers=os.cpu_count()) as executor:
jobs = {executor.submit(run_diff, key[0], key[1], context): key for key in self.jobs}

View File

@ -4,20 +4,38 @@
import os
import sys
import traceback
from functools import partial
from gettext import gettext as _
from threading import Thread
from kitty.cli import parse_args
from kitty.key_encoding import ESCAPE
from ..tui.handler import Handler
from ..tui.loop import Loop
from ..tui.operations import set_line_wrapping, set_window_title
from ..tui.operations import clear_screen, set_line_wrapping, set_window_title
from .collect import create_collection
INITIALIZING, READY, RENDERED = range(3)
class DiffHandler(Handler):
def __init__(self, collection):
self.collection = collection
def __init__(self, left, right):
self.state = INITIALIZING
self.left, self.right = left, right
self.report_traceback_on_exit = None
def create_collection(self):
try:
self.collection = create_collection(self.left, self.right)
except Exception:
self.report_traceback_on_exit = traceback.format_exc()
self.quit_loop(1)
else:
self.state = READY
self.wakeup()
def init_terminal_state(self):
self.write(set_line_wrapping(False))
@ -26,6 +44,35 @@ class DiffHandler(Handler):
def initialize(self, *args):
Handler.initialize(self, *args)
self.init_terminal_state()
self.draw_screen()
t = Thread(target=self.create_collection, name='CreatingCollection')
t.daemon = True
t.start()
def draw_screen(self):
if self.state is INITIALIZING:
self.write(clear_screen())
self.write(_('Calculating diff, please wait...'))
return
if self.state is READY:
self.write(clear_screen())
self.state = RENDERED
return
def on_key(self, key_event):
if self.state is INITIALIZING:
if key_event.key is ESCAPE:
self.quit_loop(0)
return
def on_wakeup(self):
self.draw_screen()
def on_interrupt(self):
self.quit_loop(1)
def on_eot(self):
self.quit_loop(1)
OPTIONS = partial('''\
@ -40,12 +87,13 @@ def main(args):
left, right = items
if os.path.isdir(left) != os.path.isdir(right):
raise SystemExit('The items to be diffed should both be either directories or files. Comparing a directory to a file is not valid.')
collection = create_collection(left, right)
loop = Loop()
handler = DiffHandler(collection)
handler = DiffHandler(left, right)
loop.loop(handler)
if loop.return_code != 0:
if handler.report_traceback_on_exit:
print(handler.report_traceback_on_exit, file=sys.stderr)
raise SystemExit(loop.return_code)

View File

@ -30,6 +30,9 @@ class Handler:
def on_eot(self):
pass
def on_wakeup(self):
pass
def write(self, data):
if isinstance(data, str):
data = data.encode('utf-8')

View File

@ -283,6 +283,8 @@ class Loop:
handler.on_term()
if b'i' in data:
handler.on_interrupt()
if b'1' in data:
handler.on_wakeup()
def _wakeup_write(self, val):
while not os.write(self.wakeup_write_fd, val):