|
@@ -97,27 +97,63 @@ class Diff(object):
|
97
|
97
|
|
98
|
98
|
for hunk in self._hunks:
|
99
|
99
|
out.append(self._markup_hunk_header(hunk.get_header()))
|
100
|
|
- save_line = ''
|
101
|
|
- for from_info, to_info, changed in hunk.mdiff():
|
|
100
|
+ for old, new, changed in hunk.mdiff():
|
102
|
101
|
if changed:
|
103
|
|
- if not from_info[0]:
|
104
|
|
- line = to_info[1].strip('\x00\x01')
|
|
102
|
+ if not old[0]:
|
|
103
|
+ # The '+' char after \x00 is kept
|
|
104
|
+ line = new[1].strip('\x00\x01')
|
105
|
105
|
out.append(self._markup_new(line))
|
106
|
|
- elif not to_info[0]:
|
107
|
|
- line = from_info[1].strip('\x00\x01')
|
|
106
|
+ elif not new[0]:
|
|
107
|
+ # The '-' char after \x00 is kept
|
|
108
|
+ line = old[1].strip('\x00\x01')
|
108
|
109
|
out.append(self._markup_old(line))
|
109
|
110
|
else:
|
110
|
111
|
out.append(self._markup_old('-') +
|
111
|
|
- self._markup_old_mix(from_info[1]))
|
|
112
|
+ self._markup_old_mix(old[1]))
|
112
|
113
|
out.append(self._markup_new('+') +
|
113
|
|
- self._markup_new_mix(to_info[1]))
|
|
114
|
+ self._markup_new_mix(new[1]))
|
114
|
115
|
else:
|
115
|
|
- out.append(self._markup_common(' ' + from_info[1]))
|
|
116
|
+ out.append(self._markup_common(' ' + old[1]))
|
116
|
117
|
return ''.join(out)
|
117
|
118
|
|
118
|
119
|
def markup_side_by_side(self, show_number, width):
|
119
|
|
- """Do not really need to parse the hunks..."""
|
120
|
|
- return 'TODO: show_number=%s, width=%d' % (show_number, width)
|
|
120
|
+ """width of 0 means infinite width, None means auto detect"""
|
|
121
|
+ def _normalize(line):
|
|
122
|
+ return line.replace('\t', ' ' * 8).replace('\n', '')
|
|
123
|
+
|
|
124
|
+ width = 80
|
|
125
|
+ line_fmt = '%%-%ds | %%-%ds\n' % (width, width)
|
|
126
|
+ out = []
|
|
127
|
+
|
|
128
|
+ for line in self._headers:
|
|
129
|
+ out.append(self._markup_header(line))
|
|
130
|
+
|
|
131
|
+ out.append(self._markup_old_path(self._old_path))
|
|
132
|
+ out.append(self._markup_new_path(self._new_path))
|
|
133
|
+
|
|
134
|
+ for hunk in self._hunks:
|
|
135
|
+ out.append(self._markup_hunk_header(hunk.get_header()))
|
|
136
|
+ for old, new, changed in hunk.mdiff():
|
|
137
|
+ left = _normalize(old[1])
|
|
138
|
+ right = _normalize(new[1])
|
|
139
|
+ if changed:
|
|
140
|
+ if not old[0]:
|
|
141
|
+ right = right.lstrip('\x00+').rstrip('\x01')
|
|
142
|
+ out.append(line_fmt % (' ', self._markup_new(right)))
|
|
143
|
+ elif not new[0]:
|
|
144
|
+ left = left.lstrip('\x00-').rstrip('\x01')
|
|
145
|
+ out.append(line_fmt % (self._markup_old(left), ' '))
|
|
146
|
+ else:
|
|
147
|
+ out.append(line_fmt % (
|
|
148
|
+ self._markup_old_mix(left),
|
|
149
|
+ self._markup_new_mix(right)
|
|
150
|
+ ))
|
|
151
|
+ else:
|
|
152
|
+ out.append(line_fmt % (
|
|
153
|
+ self._markup_common(left),
|
|
154
|
+ self._markup_common(right)
|
|
155
|
+ ))
|
|
156
|
+ return ''.join(out)
|
121
|
157
|
|
122
|
158
|
def _markup_header(self, line):
|
123
|
159
|
return colorize(line, 'cyan')
|
|
@@ -320,7 +356,6 @@ class DiffMarkup(object):
|
320
|
356
|
return out
|
321
|
357
|
|
322
|
358
|
def _markup_side_by_side(self, show_number, width):
|
323
|
|
- """width of 0 or negative means auto detect terminal width"""
|
324
|
359
|
out = []
|
325
|
360
|
for diff in self._diffs:
|
326
|
361
|
out.append(diff.markup_side_by_side(show_number, width))
|
|
@@ -342,11 +377,11 @@ if __name__ == '__main__':
|
342
|
377
|
help=('show in side-by-side mode'))
|
343
|
378
|
parser.add_option('-n', '--number', action='store_true',
|
344
|
379
|
help='show line number')
|
345
|
|
- parser.add_option('-w', '--width', type='int', default=0,
|
|
380
|
+ parser.add_option('-w', '--width', type='int', default=None,
|
346
|
381
|
help='set line width (side-by-side mode only)')
|
347
|
382
|
opts, args = parser.parse_args()
|
348
|
383
|
|
349
|
|
- if opts.width < 0:
|
|
384
|
+ if opts.width and opts.width < 0:
|
350
|
385
|
opts.width = 0
|
351
|
386
|
|
352
|
387
|
if len(args) >= 1:
|