mirror of
https://github.com/kovidgoyal/kitty
synced 2026-07-19 06:54:58 +02:00
More work on the diff kitten
This commit is contained in:
@@ -20,6 +20,14 @@ def run_diff(file1, file2, context=3):
|
|||||||
return False, returncode, stderr.decode('utf-8')
|
return False, returncode, stderr.decode('utf-8')
|
||||||
|
|
||||||
|
|
||||||
|
def even_up_sides(left, right, filler):
|
||||||
|
delta = len(left) - len(right)
|
||||||
|
if delta != 0:
|
||||||
|
dest = left if delta < 0 else right
|
||||||
|
for i in range(abs(delta)):
|
||||||
|
dest.append(filler)
|
||||||
|
|
||||||
|
|
||||||
class Hunk:
|
class Hunk:
|
||||||
|
|
||||||
def __init__(self, title, left, right):
|
def __init__(self, title, left, right):
|
||||||
@@ -39,22 +47,15 @@ class Hunk:
|
|||||||
self.left_lines.append((self.left_pos, True))
|
self.left_lines.append((self.left_pos, True))
|
||||||
self.left_pos += 1
|
self.left_pos += 1
|
||||||
|
|
||||||
def _even_up_sides(self):
|
|
||||||
delta = len(self.left_lines) - len(self.right_lines)
|
|
||||||
if delta != 0:
|
|
||||||
dest = self.left_lines if delta < 0 else self.right_lines
|
|
||||||
for i in range(abs(delta)):
|
|
||||||
dest.append((None, True))
|
|
||||||
|
|
||||||
def context_line(self):
|
def context_line(self):
|
||||||
self._even_up_sides()
|
even_up_sides(self.left_lines, self.right_lines, (None, True))
|
||||||
self.left_lines.append((self.left_pos, False))
|
self.left_lines.append((self.left_pos, False))
|
||||||
self.right_lines.append((self.right_pos, False))
|
self.right_lines.append((self.right_pos, False))
|
||||||
self.left_pos += 1
|
self.left_pos += 1
|
||||||
self.right_pos += 1
|
self.right_pos += 1
|
||||||
|
|
||||||
def finalize(self):
|
def finalize(self):
|
||||||
self._even_up_sides()
|
even_up_sides(self.left_lines, self.right_lines, (None, True))
|
||||||
# Sanity check
|
# Sanity check
|
||||||
if self.left_pos != self.left_count:
|
if self.left_pos != self.left_count:
|
||||||
raise ValueError('Left side line mismatch {} != {}'.format(self.left_pos, self.left_count))
|
raise ValueError('Left side line mismatch {} != {}'.format(self.left_pos, self.left_count))
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ from kitty.fast_data_types import truncate_point_for_length
|
|||||||
|
|
||||||
from .collect import data_for_path, lines_for_path, path_name_map
|
from .collect import data_for_path, lines_for_path, path_name_map
|
||||||
from .config import formats
|
from .config import formats
|
||||||
|
from .git import even_up_sides
|
||||||
|
|
||||||
|
|
||||||
class Reference:
|
class Reference:
|
||||||
@@ -98,7 +99,7 @@ def binary_lines(path, other_path, columns, margin_size):
|
|||||||
def fl(path):
|
def fl(path):
|
||||||
text = template.format(human_readable(len(data_for_path(path))))
|
text = template.format(human_readable(len(data_for_path(path))))
|
||||||
text = place_in(text, columns // 2 - margin_size)
|
text = place_in(text, columns // 2 - margin_size)
|
||||||
return margin_format(' ' * margin_size) + text_format(text) + '\x1b[0m'
|
return margin_format(' ' * margin_size) + text_format(text)
|
||||||
|
|
||||||
return fl(path) + fl(other_path)
|
return fl(path) + fl(other_path)
|
||||||
|
|
||||||
@@ -110,16 +111,38 @@ def split_to_size(line, width):
|
|||||||
line = line[p:]
|
line = line[p:]
|
||||||
|
|
||||||
|
|
||||||
|
def render_diff_line(number, text, ltype, margin_size):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def render_diff_pair(left_line_number, left, left_is_change, right_line_number, right, right_is_change, is_first, margin_size):
|
||||||
|
ltype = 'filler' if left_line_number is None else 'remove'
|
||||||
|
rtype = 'filler' if right_line_number is None else 'add'
|
||||||
|
return (
|
||||||
|
render_diff_line(left_line_number if is_first else None, left, ltype, margin_size) +
|
||||||
|
render_diff_line(right_line_number if is_first else None, right, rtype, margin_size)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def lines_for_diff(left_path, right_path, hunks, args, columns, margin_size):
|
def lines_for_diff(left_path, right_path, hunks, args, columns, margin_size):
|
||||||
raise NotImplementedError('TODO')
|
available_cols = columns // 2 - margin_size
|
||||||
lines_for_path()
|
left_lines, right_lines = map(lines_for_path, (left_path, right_path))
|
||||||
# available_cols = columns // 2 - margin_size
|
|
||||||
#
|
for hunk_num, hunk in enumerate(hunks):
|
||||||
# for hunk_num, hunk in enumerate(hunks):
|
for line_num, (left, right) in enumerate(zip(hunk.left_lines, hunk.right_lines)):
|
||||||
# for line_num, (left, right) in enumerate(zip(hunk.left_lines, hunk.right_lines)):
|
left_line_number, left_is_change = left
|
||||||
# left_line_number, left_is_
|
right_line_number, right_is_change = right
|
||||||
# left_line = lines_for_path(left_path)[
|
if left_line_number is None:
|
||||||
# left_lines, right_lines = list(split_to_size(left_line, available_cols)), list(split_to_size(
|
left_wrapped_lines = []
|
||||||
|
else:
|
||||||
|
left_wrapped_lines = split_to_size(left_lines[left_line_number], available_cols)
|
||||||
|
if right_line_number is None:
|
||||||
|
right_wrapped_lines = []
|
||||||
|
else:
|
||||||
|
right_wrapped_lines = split_to_size(right_lines[right_line_number], available_cols)
|
||||||
|
even_up_sides(left_wrapped_lines, right_wrapped_lines, '')
|
||||||
|
for i, (left, right) in enumerate(zip(left_wrapped_lines, right_wrapped_lines)):
|
||||||
|
yield render_diff_pair(left_line_number, left, left_is_change, right_line_number, right, right_is_change, i == 0, margin_size)
|
||||||
|
|
||||||
|
|
||||||
def render_diff(collection, diff_map, args, columns):
|
def render_diff(collection, diff_map, args, columns):
|
||||||
|
|||||||
Reference in New Issue
Block a user