|
@@ -41,7 +41,7 @@ class Diff(object):
|
41
|
41
|
self.__new_path = new_path
|
42
|
42
|
self.__hunks = hunks
|
43
|
43
|
|
44
|
|
- def view_traditional(self, show_color):
|
|
44
|
+ def render_traditional(self, show_color):
|
45
|
45
|
out = []
|
46
|
46
|
if show_color:
|
47
|
47
|
color = None
|
|
@@ -51,72 +51,72 @@ class Diff(object):
|
51
|
51
|
end_color = 'none'
|
52
|
52
|
|
53
|
53
|
for line in self.__headers:
|
54
|
|
- out.append(self._view_header(line, color, end_color))
|
|
54
|
+ out.append(self._render_header(line, color, end_color))
|
55
|
55
|
|
56
|
|
- out.append(self._view_old_path(self.__old_path, color, end_color))
|
57
|
|
- out.append(self._view_new_path(self.__new_path, color, end_color))
|
|
56
|
+ out.append(self._render_old_path(self.__old_path, color, end_color))
|
|
57
|
+ out.append(self._render_new_path(self.__new_path, color, end_color))
|
58
|
58
|
|
59
|
59
|
for hunk in self.__hunks:
|
60
|
|
- out.append(self._view_hunk_header(hunk.get_header(), color,
|
|
60
|
+ out.append(self._render_hunk_header(hunk.get_header(), color,
|
61
|
61
|
end_color))
|
62
|
62
|
for (attr, line) in hunk:
|
63
|
63
|
if attr == '-':
|
64
|
|
- out.append(self._view_old(attr+line, color, end_color))
|
|
64
|
+ out.append(self._render_old(attr+line, color, end_color))
|
65
|
65
|
elif attr == '+':
|
66
|
|
- out.append(self._view_new(attr+line, color, end_color))
|
|
66
|
+ out.append(self._render_new(attr+line, color, end_color))
|
67
|
67
|
else:
|
68
|
|
- out.append(self._view_common(attr+line, color, end_color))
|
|
68
|
+ out.append(self._render_common(attr+line, color, end_color))
|
69
|
69
|
|
70
|
70
|
return ''.join(out)
|
71
|
71
|
|
72
|
|
- def view_side_by_side(self, show_color, show_number, width):
|
|
72
|
+ def render_side_by_side(self, show_color, show_number, width):
|
73
|
73
|
"""Do not really need to parse the hunks..."""
|
74
|
74
|
return 'TODO: show_color=%s, show_number=%s, width=%d' % (show_color,
|
75
|
75
|
show_number, width)
|
76
|
76
|
|
77
|
|
- def _view_header(self, line, color=None, end_color=None):
|
|
77
|
+ def _render_header(self, line, color=None, end_color=None):
|
78
|
78
|
if color is None:
|
79
|
79
|
color='cyan'
|
80
|
80
|
if end_color is None:
|
81
|
81
|
end_color = 'reset'
|
82
|
82
|
return self.__mark_color(line, color, end_color)
|
83
|
83
|
|
84
|
|
- def _view_old_path(self, line, color=None, end_color=None):
|
|
84
|
+ def _render_old_path(self, line, color=None, end_color=None):
|
85
|
85
|
if color is None:
|
86
|
86
|
color='yellow'
|
87
|
87
|
if end_color is None:
|
88
|
88
|
end_color = 'reset'
|
89
|
89
|
return self.__mark_color(line, color, end_color)
|
90
|
90
|
|
91
|
|
- def _view_new_path(self, line, color=None, end_color=None):
|
|
91
|
+ def _render_new_path(self, line, color=None, end_color=None):
|
92
|
92
|
if color is None:
|
93
|
93
|
color='yellow'
|
94
|
94
|
if end_color is None:
|
95
|
95
|
end_color = 'reset'
|
96
|
96
|
return self.__mark_color(line, color, end_color)
|
97
|
97
|
|
98
|
|
- def _view_hunk_header(self, line, color=None, end_color=None):
|
|
98
|
+ def _render_hunk_header(self, line, color=None, end_color=None):
|
99
|
99
|
if color is None:
|
100
|
100
|
color='lightblue'
|
101
|
101
|
if end_color is None:
|
102
|
102
|
end_color = 'reset'
|
103
|
103
|
return self.__mark_color(line, color, end_color)
|
104
|
104
|
|
105
|
|
- def _view_old(self, line, color=None, end_color=None):
|
|
105
|
+ def _render_old(self, line, color=None, end_color=None):
|
106
|
106
|
if color is None:
|
107
|
107
|
color='red'
|
108
|
108
|
if end_color is None:
|
109
|
109
|
end_color = 'reset'
|
110
|
110
|
return self.__mark_color(line, color, end_color)
|
111
|
111
|
|
112
|
|
- def _view_new(self, line, color=None, end_color=None):
|
|
112
|
+ def _render_new(self, line, color=None, end_color=None):
|
113
|
113
|
if color is None:
|
114
|
114
|
color='green'
|
115
|
115
|
if end_color is None:
|
116
|
116
|
end_color = 'reset'
|
117
|
117
|
return self.__mark_color(line, color, end_color)
|
118
|
118
|
|
119
|
|
- def _view_common(self, line, color=None, end_color=None):
|
|
119
|
+ def _render_common(self, line, color=None, end_color=None):
|
120
|
120
|
if color is None:
|
121
|
121
|
color='none'
|
122
|
122
|
if end_color is None:
|
|
@@ -297,29 +297,29 @@ class DiffParser(object):
|
297
|
297
|
return out_diffs
|
298
|
298
|
|
299
|
299
|
|
300
|
|
-class DiffViewer(object):
|
|
300
|
+class DiffRender(object):
|
301
|
301
|
|
302
|
302
|
def __init__(self, stream):
|
303
|
303
|
self.__diffs = DiffParser(stream).get_diffs()
|
304
|
304
|
|
305
|
|
- def view(self, show_color=True, show_number=False, width=0,
|
|
305
|
+ def render(self, show_color=True, show_number=False, width=0,
|
306
|
306
|
traditional=False):
|
307
|
307
|
if traditional:
|
308
|
|
- return self.__view_traditional(show_color)
|
|
308
|
+ return self.__render_traditional(show_color)
|
309
|
309
|
else:
|
310
|
|
- return self.__view_side_by_side(show_color, show_number, width)
|
|
310
|
+ return self.__render_side_by_side(show_color, show_number, width)
|
311
|
311
|
|
312
|
|
- def __view_traditional(self, show_color):
|
|
312
|
+ def __render_traditional(self, show_color):
|
313
|
313
|
out = []
|
314
|
314
|
for diff in self.__diffs:
|
315
|
|
- out.append(diff.view_traditional(show_color))
|
|
315
|
+ out.append(diff.render_traditional(show_color))
|
316
|
316
|
return out
|
317
|
317
|
|
318
|
|
- def __view_side_by_side(self, show_color, show_number, width):
|
|
318
|
+ def __render_side_by_side(self, show_color, show_number, width):
|
319
|
319
|
"""width of 0 or negative means auto detect terminal width"""
|
320
|
320
|
out = []
|
321
|
321
|
for diff in self.__diffs:
|
322
|
|
- out.append(diff.view_side_by_side(show_color, show_number, width))
|
|
322
|
+ out.append(diff.render_side_by_side(show_color, show_number, width))
|
323
|
323
|
return out
|
324
|
324
|
|
325
|
325
|
|
|
@@ -334,8 +334,6 @@ if __name__ == '__main__':
|
334
|
334
|
{'prog': os.path.basename(sys.argv[0])}
|
335
|
335
|
|
336
|
336
|
parser = optparse.OptionParser(usage)
|
337
|
|
- parser.add_option('-c', '--color', metavar='on|off|auto', default='auto',
|
338
|
|
- help='enforce color' 'on|off|auto, default is auto')
|
339
|
337
|
parser.add_option('-n', '--number', action='store_true',
|
340
|
338
|
help='show line number')
|
341
|
339
|
parser.add_option('-w', '--width', type='int', default=0,
|
|
@@ -345,15 +343,7 @@ if __name__ == '__main__':
|
345
|
343
|
'mode (omit -n, -w)'))
|
346
|
344
|
opts, args = parser.parse_args()
|
347
|
345
|
|
348
|
|
- if opts.color == 'yes':
|
349
|
|
- show_color = True
|
350
|
|
- elif opts.color == 'no':
|
351
|
|
- show_color = False
|
352
|
|
- elif opts.color == 'auto':
|
353
|
|
- show_color = sys.stdout.isatty()
|
354
|
|
- else:
|
355
|
|
- sys.stderr.write('Invalid color mode, try --help option for usage\n')
|
356
|
|
- sys.exit(1)
|
|
346
|
+ show_color = sys.stdout.isatty()
|
357
|
347
|
|
358
|
348
|
if opts.width < 0:
|
359
|
349
|
opts.width = 0
|
|
@@ -370,20 +360,19 @@ if __name__ == '__main__':
|
370
|
360
|
if diff_hdl is not sys.stdin:
|
371
|
361
|
diff_hdl.close()
|
372
|
362
|
|
373
|
|
- diffviewer = DiffViewer(stream)
|
374
|
|
- view = diffviewer.view(show_color=show_color, show_number=opts.number,
|
|
363
|
+ render = DiffRender(stream)
|
|
364
|
+ color_diff = render.render(show_color=show_color, show_number=opts.number,
|
375
|
365
|
width=opts.width, traditional=opts.traditional)
|
376
|
366
|
|
377
|
367
|
if sys.stdout.isatty():
|
378
|
|
-
|
379
|
|
-
|
|
368
|
+
|
380
|
369
|
pager = subprocess.Popen(['less', '-FRSXK'],
|
381
|
370
|
stdin=subprocess.PIPE, stdout=sys.stdout)
|
382
|
|
- pager.stdin.write(''.join(view))
|
|
371
|
+ pager.stdin.write(''.join(color_diff))
|
383
|
372
|
pager.stdin.close()
|
384
|
373
|
pager.wait()
|
385
|
374
|
else:
|
386
|
|
- sys.stdout.write(''.join(view))
|
|
375
|
+ sys.stdout.write(''.join(color_diff))
|
387
|
376
|
|
388
|
377
|
sys.exit(0)
|
389
|
378
|
|