Mercurial > diff-colorize
annotate diff-colorize.py @ 24:d2bb1603f081
Merged in the new 1.0 version-message changeset.
author | Peter Hosey <hg@boredzo.org> |
---|---|
date | Wed, 05 Jan 2011 21:05:17 -0800 |
parents | 929a488c4960 948c96784f00 |
children | 94e9ee861fc3 |
rev | line source |
---|---|
0 | 1 #!/usr/bin/env python |
2 | |
6
d58b4e2e12d4
Moved the imports of sys and fileinput, so that all the imports are together.
Peter Hosey
parents:
5
diff
changeset
|
3 import sys |
4
b8b2d1931a9e
Get our color constants from the environment, if possible.
Peter Hosey
parents:
3
diff
changeset
|
4 import os |
6
d58b4e2e12d4
Moved the imports of sys and fileinput, so that all the imports are together.
Peter Hosey
parents:
5
diff
changeset
|
5 import fileinput |
4
b8b2d1931a9e
Get our color constants from the environment, if possible.
Peter Hosey
parents:
3
diff
changeset
|
6 |
15
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
7 has_256_color = (os.environ.get('TERM', None) == 'xterm-256color') |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
8 |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
9 index_color = int(os.environ.get('DIFF_INDEX_COLOR', |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
10 32 if has_256_color else 36)) |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
11 old_mode_color = int(os.environ.get('DIFF_OLD_MODE_COLOR', |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
12 88 if has_256_color else 31)) |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
13 new_mode_color = int(os.environ.get('DIFF_NEW_MODE_COLOR', |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
14 28 if has_256_color else 32)) |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
15 removed_color = int(os.environ.get('DIFF_REMOVED_COLOR', |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
16 160 if has_256_color else 31)) |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
17 added_color = int(os.environ.get('DIFF_ADDED_COLOR', |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
18 2 if has_256_color else 32)) |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
19 hunk_start_color = int(os.environ.get('DIFF_HUNK_START_COLOR', |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
20 32 if has_256_color else 36)) |
0 | 21 |
3
10948e4fd070
Move the color constants above the format strings, since the color constants are more editable.
Peter Hosey
parents:
2
diff
changeset
|
22 RESET_FORMAT = '\033[0m' |
15
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
23 COLOR_FORMAT_256 = '\033[38;5;%um' |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
24 COLOR_FORMAT_16 = '\033[38;%um' |
a7214992f904
Added a different set of default color codes and a different colorization format string. Both of these are to support 16-color mode (which is all Terminal supports).
Peter Hosey
parents:
13
diff
changeset
|
25 COLOR_FORMAT = COLOR_FORMAT_256 if has_256_color else COLOR_FORMAT_16 |
3
10948e4fd070
Move the color constants above the format strings, since the color constants are more editable.
Peter Hosey
parents:
2
diff
changeset
|
26 BEGIN_REVERSE_FORMAT = '\033[7m' |
10948e4fd070
Move the color constants above the format strings, since the color constants are more editable.
Peter Hosey
parents:
2
diff
changeset
|
27 END_REVERSE_FORMAT = '\033[27m' |
10948e4fd070
Move the color constants above the format strings, since the color constants are more editable.
Peter Hosey
parents:
2
diff
changeset
|
28 |
9 | 29 USAGE = """ |
22
948c96784f00
Added line to usage message identifying this as diff-colorize 1.0.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
30 diff-colorize 1.0 by Peter Hosey |
948c96784f00
Added line to usage message identifying this as diff-colorize 1.0.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
31 |
9 | 32 Usage: diff ... | diff-colorize |
33 or: diff-colorize < foo.diff | |
34 | |
35 Reads unified or git-style diff data from standard input, colorizes it, and writes the result to standard output. | |
36 | |
37 You can customize the color numbers used by setting these variables in your environment: | |
38 * DIFF_INDEX_COLOR (lines starting with "Index: " or "diff --git ") | |
39 * DIFF_OLD_MODE_COLOR (lines starting with "old mode"; these only appear in git-style diffs) | |
40 * DIFF_NEW_MODE_COLOR (lines starting with "new mode"; these only appear in git-style diffs) | |
41 * DIFF_REMOVED_COLOR (lines starting with "-") | |
42 * DIFF_ADDED_COLOR (lines starting with "+") | |
43 * DIFF_HUNK_START_COLOR (lines starting with "@@") | |
44 """.strip() | |
45 | |
18
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
46 def interleave(*sequences): |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
47 "Generator that yields one object from each sequence in turn." |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
48 |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
49 def zip_pad(*iterables, **kw): |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
50 "Downloaded from http://code.activestate.com/recipes/497007/" |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
51 from itertools import izip, chain |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
52 if kw: |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
53 assert len(kw) == 1 |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
54 pad = kw["pad"] |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
55 else: |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
56 pad = None |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
57 done = [len(iterables)-1] |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
58 def pad_iter(): |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
59 if not done[0]: |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
60 return |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
61 done[0] -= 1 |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
62 while 1: |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
63 yield pad |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
64 iterables = [chain(seq, pad_iter()) for seq in iterables] |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
65 return izip(*iterables) |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
66 |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
67 for objects in zip_pad(*sequences): |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
68 for obj in objects: |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
69 if obj is not None: |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
70 yield obj |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
71 |
19
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
72 class Substring(object): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
73 def __init__(self, a, a_start, a_stop, b, b_start, b_stop): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
74 self.a = a |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
75 self.a_start = a_start |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
76 self.a_stop = a_stop |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
77 self.b = b |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
78 self.b_start = b_start |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
79 self.b_stop = b_stop |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
80 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
81 def before_a_substring(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
82 return self.a[:self.a_start] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
83 def before_b_substring(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
84 return self.b[:self.b_start] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
85 def substring(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
86 return ''.join(self.a[self.a_start:self.a_stop]) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
87 a_substring = substring |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
88 b_substring = substring |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
89 def after_a_substring(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
90 return self.a[self.a_stop:] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
91 def after_b_substring(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
92 return self.b[self.b_stop:] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
93 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
94 def __hash__(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
95 return hash(self.substring()) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
96 def __cmp__(self, other): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
97 return cmp(self.a_start, other.a_start) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
98 def __eq__(self, other): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
99 return self.substring() == other.substring() |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
100 def __str__(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
101 return self.substring() |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
102 def __repr__(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
103 return 'Substring(%r)' % (self.substring(),) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
104 return 'Substring(%r from %r, %r, %r, %r, %r, %r)' % ( |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
105 self.substring(), |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
106 self.a, self.a_start, self.a_stop, |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
107 self.b, self.b_start, self.b_stop, |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
108 ) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
109 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
110 def longest_common_substring(a, b): |
20
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
111 """Returns the longest common substring between a and b, which can be any finite indexable sliceable sequences, as a Substring object. Returns None if there is no substring between the sequences. |
19
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
112 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
113 Clarified and slightly modified (to use a special Substring object) from http://en.wikibooks.org/w/index.php?title=Algorithm_implementation/Strings/Longest_common_substring&oldid=1419225#Python |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
114 """ |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
115 a_len = len(a) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
116 b_len = len(b) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
117 lengths = [[0] * (b_len + 1) for i in xrange(a_len + 1)] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
118 substrings = set() |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
119 greatest_length = current_run_length = 0 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
120 for a_idx in xrange(a_len): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
121 for b_idx in xrange(b_len): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
122 if a[a_idx] == b[b_idx]: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
123 current_run_length = lengths[a_idx][b_idx] + 1 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
124 lengths[a_idx+1][b_idx+1] = current_run_length |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
125 if current_run_length > greatest_length: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
126 greatest_length = current_run_length |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
127 substrings.clear() |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
128 if current_run_length == greatest_length: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
129 # substrings.add(a[a_idx - current_run_length + 1:a_idx + 1]) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
130 substrings.add(Substring(a, a_idx - current_run_length + 1, a_idx + 1, b, b_idx - current_run_length + 1, b_idx + 1)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
131 else: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
132 if current_run_length > 0: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
133 substrings.add(Substring(a, a_idx - current_run_length + 1, a_idx + 1, b, b_idx - current_run_length + 1, b_idx + 1)) |
20
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
134 try: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
135 return substrings.pop() |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
136 except KeyError: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
137 return None |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
138 |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
139 def common_subsequence(a, b): |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
140 "Returns all common substrings between a and b, which can be any finite indexable sliceable sequences, as Substring objects. Determines this by recursively calling itself on slices of a and b before and after each longest common substring." |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
141 # Inspired by http://en.wikibooks.org/w/index.php?title=Algorithm_Implementation/Strings/Longest_common_subsequence&oldid=1912924#Python |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
142 def LCS_length_matrix(a, b): |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
143 matrix = [[0] * (len(b) + 1) for i in xrange(len(a) + 1)] |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
144 for i, a_ch in enumerate(a): |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
145 for j, b_ch in enumerate(b): |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
146 if a_ch == b_ch: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
147 matrix[i + 1][j + 1] = matrix[i][j] + 1 |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
148 else: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
149 matrix[i + 1][j + 1] = max(matrix[i + 1][j], matrix[i][j + 1]) |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
150 return matrix |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
151 |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
152 def recursive_build_subsequence(a, b, matrix=None, i=None, j=None): |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
153 if matrix is None: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
154 matrix = LCS_length_matrix(a, b) |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
155 if i is None: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
156 i = len(a) |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
157 if j is None: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
158 j = len(b) |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
159 |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
160 if i == 0 or j == 0: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
161 return [] |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
162 elif a[i - 1] == b[j - 1]: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
163 return recursive_build_subsequence(a, b, matrix, i - 1, j - 1) + [Substring(a, i - 1, i, b, j - 1, j)] |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
164 else: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
165 if matrix[i][j - 1] > matrix[i - 1][j]: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
166 return recursive_build_subsequence(a, b, matrix, i, j - 1) |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
167 else: |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
168 return recursive_build_subsequence(a, b, matrix, i - 1, j) |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
169 |
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
170 return recursive_build_subsequence(a, b) |
19
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
171 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
172 def common_and_distinct_substrings(a, b): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
173 "Takes two strings, a and b, tokenizes them, and returns a linked list whose nodes contain runs of either common or unique tokens." |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
174 def tokenize(a): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
175 "Each token is an identifier, a number, or a single character." |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
176 import re |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
177 # Identifier, binary number, hex number, decimal number, operator, other punctuation. |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
178 token_exp = re.compile('[_a-zA-Z][_a-zA-Z0-9]+:?|0b[01]+|0[xX][0-9A-Fa-f]+|[0-9]+|[-+*|&^/%\[\]<=>,]|[()\\\\;`{}]') |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
179 start = 0 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
180 for match in token_exp.finditer(a): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
181 for ch in a[start:match.start()]: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
182 yield ch |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
183 yield match.group(0) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
184 start = match.end() |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
185 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
186 remainder = a[start:] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
187 if remainder: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
188 yield remainder |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
189 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
190 a = list(tokenize(a)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
191 b = list(tokenize(b)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
192 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
193 class DualPayloadLinkedListNode(object): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
194 "This linked list gives each node two next pointers." |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
195 def __init__(self, a, b, differ=None): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
196 self.a = a |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
197 self.b = b |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
198 self.next = None |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
199 if differ is None: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
200 differ = (self.a != self.b) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
201 self.differ = differ |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
202 def __iter__(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
203 def walk_linked_list(x): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
204 while x is not None: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
205 yield x |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
206 x = x.next |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
207 return walk_linked_list(self) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
208 def __repr__(self): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
209 return repr([('(%r, %r)' % (x.a, x.b)) if x.differ else repr(x.a) for x in self]) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
210 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
211 # Linked-list nodes for common substrings will have a single Substring object in both payloads. |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
212 # Nodes for difference runs will have a string in each payload. |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
213 empty_substring = Substring(a, 0, 0, b, 0, 0) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
214 chunks_head = DualPayloadLinkedListNode(empty_substring, empty_substring, False) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
215 # This node is used when the input strings have no common substrings. When they do have common substrings, this node will be replaced with a real node. |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
216 chunks_head.next = DualPayloadLinkedListNode(empty_substring, empty_substring, False) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
217 # Not chunks_head.next, since it will be replaced. |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
218 chunks_tail = chunks_head |
20
b4caea436f4d
Improve the highlighting of differences using a longest common subsequence algorithm.
Peter Hosey <hg@boredzo.org>
parents:
19
diff
changeset
|
219 for sub in sorted(common_subsequence(a, b)): |
19
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
220 last_sub = chunks_tail.a |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
221 a_dif_run = ''.join(a[last_sub.a_stop:sub.a_start]) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
222 b_dif_run = ''.join(b[last_sub.b_stop:sub.b_start]) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
223 if a_dif_run or b_dif_run: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
224 chunks_tail.next = DualPayloadLinkedListNode(a_dif_run, b_dif_run, True) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
225 chunks_tail = chunks_tail.next |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
226 chunks_tail.next = DualPayloadLinkedListNode(sub, sub, False) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
227 chunks_tail = chunks_tail.next |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
228 else: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
229 # Get what comes after the last substring, if anything. |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
230 last_sub = chunks_tail.a |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
231 a_dif_run = ''.join(a[last_sub.a_stop:]) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
232 b_dif_run = ''.join(b[last_sub.b_stop:]) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
233 if a_dif_run or b_dif_run: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
234 chunks_tail.next = DualPayloadLinkedListNode(a_dif_run, b_dif_run, True) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
235 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
236 return chunks_head.next |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
237 |
7
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
238 # Everything in the unified diff format is identified by a prefix. The prefixes are: |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
239 # 'Index: ': File marker (unified diff) |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
240 # 'diff --git': File marker (git-style diff) |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
241 # 'old mode': File permissions mode before change |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
242 # 'new mode': File permissions mode after change |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
243 # '---': Defining '-' (giving the name and modification date of the file before change) |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
244 # '+++': Defining '+' (giving the name and modification date of the file after change) |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
245 # '-': Line before change (i.e., removed) |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
246 # '+': Line after change (i.e., added) |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
247 # ' ': Line that hasn't changed |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
248 # '@@': Hunk start (@@ -start,length +start, length @@) |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
249 # |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
250 # We need to look for these prefixes in order, in order to handle '---'/'+++' before '-'/'+'. Hence the OrderedDict. |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
251 class OrderedDict(dict): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
252 def __init__(self, input=None): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
253 if input is None: |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
254 self.keys = [] |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
255 super(OrderedDict, self).__init__() |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
256 elif isinstance(input, dict): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
257 self.keys = list(input) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
258 super(OrderedDict, self).__init__(input) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
259 else: |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
260 self.keys = [k for k, v in input] |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
261 super(OrderedDict, self).__init__(input) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
262 def __iter__(self): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
263 return iter(self.keys) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
264 def __setitem__(self, k, v): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
265 if k not in self: |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
266 self.keys.append(k) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
267 super(OrderedDict, self).__setitem__(k, v) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
268 def __delitem__(self, k): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
269 super(OrderedDict, self).__delitem__(k) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
270 self.keys.remove(k) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
271 |
7
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
272 # Each value includes not only the terminal-config characters, but also the key, somewhere within it (possibly between two terminal-config strings). |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
273 # Theoretically, you could replace the key with some other string or leave it out entirely, if you wanted to, but I wouldn't recommend it. |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
274 prefixes = OrderedDict() |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
275 prefixes['---'] = ( |
8
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
276 COLOR_FORMAT % (removed_color,) |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
277 + BEGIN_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
278 + '---' |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
279 + END_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
280 ) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
281 prefixes['+++'] = ( |
8
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
282 COLOR_FORMAT % (added_color,) |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
283 + BEGIN_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
284 + '+++' |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
285 + END_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
286 ) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
287 prefixes['-'] = ( |
8
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
288 COLOR_FORMAT % (removed_color,) |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
289 + BEGIN_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
290 + '-' |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
291 + END_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
292 ) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
293 prefixes['+'] = ( |
8
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
294 COLOR_FORMAT % (added_color,) |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
295 + BEGIN_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
296 + '+' |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
297 + END_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
298 ) |
5
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
299 prefixes['old mode'] = ( # Git-style diffs only |
8
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
300 COLOR_FORMAT % (old_mode_color,) |
5
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
301 + BEGIN_REVERSE_FORMAT |
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
302 + 'old mode' |
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
303 + END_REVERSE_FORMAT |
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
304 ) |
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
305 prefixes['new mode'] = ( # Git-style diffs only |
8
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
306 COLOR_FORMAT % (new_mode_color,) |
5
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
307 + BEGIN_REVERSE_FORMAT |
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
308 + 'new mode' |
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
309 + END_REVERSE_FORMAT |
fa7cd4c2716b
Added prefixes “old mode” and “new mode”, found in Git-style diffs, along with new color constants for them. We treat these the same way we treat “---” and “+++”.
Peter Hosey
parents:
4
diff
changeset
|
310 ) |
8
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
311 prefixes['Index: '] = COLOR_FORMAT % (index_color,) + 'Index: ' |
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
312 prefixes['diff --git '] = COLOR_FORMAT % (index_color,) + 'diff --git ' |
2
9eda9139d627
Added support for hunk start markers (@@…@@). For these, we set the whole line in reverse video, in the same color we use for index lines.
Peter Hosey
parents:
1
diff
changeset
|
313 prefixes['@@'] = ( |
8
4bb2557d24cd
Now that these can come from the environment, they are variables. Lowercasing their names for this reason.
Peter Hosey
parents:
7
diff
changeset
|
314 COLOR_FORMAT % (hunk_start_color,) |
2
9eda9139d627
Added support for hunk start markers (@@…@@). For these, we set the whole line in reverse video, in the same color we use for index lines.
Peter Hosey
parents:
1
diff
changeset
|
315 + BEGIN_REVERSE_FORMAT |
9eda9139d627
Added support for hunk start markers (@@…@@). For these, we set the whole line in reverse video, in the same color we use for index lines.
Peter Hosey
parents:
1
diff
changeset
|
316 + '@@' |
9eda9139d627
Added support for hunk start markers (@@…@@). For these, we set the whole line in reverse video, in the same color we use for index lines.
Peter Hosey
parents:
1
diff
changeset
|
317 ) |
0 | 318 |
17
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
319 if __name__ == "__main__": |
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
320 if sys.stdin.isatty(): |
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
321 # Standard input is a TTY, meaning that the user ran 'diff-colorize' at the shell prompt, without redirecting anything into it. Print usage info and exit. |
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
322 sys.exit(USAGE) |
9 | 323 |
18
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
324 # Buffers to support interleaving old and new lines that were contiguous runs. |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
325 buffer_old = [] # '-' lines |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
326 buffer_new = [] # '+' lines |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
327 |
21
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
328 from string import whitespace |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
329 |
19
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
330 def flush_buffers(buffer_old, buffer_new): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
331 "Flush the buffers, interleaving the lines and highlighting differences between them." |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
332 def print_single_line(buffered_line): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
333 prefix = '-' if buffered_line.startswith('-') else '+' |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
334 buffered_line = buffered_line[len(prefix):] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
335 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
336 sys.stdout.write(prefixes[prefix]) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
337 sys.stdout.write(buffered_line) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
338 sys.stdout.write(RESET_FORMAT) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
339 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
340 last_line_if_old = None |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
341 for buffered_line in interleave(buffer_old, buffer_new): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
342 if buffered_line.startswith('-'): |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
343 if last_line_if_old is not None: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
344 print_single_line(last_line_if_old) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
345 last_line_if_old = buffered_line |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
346 else: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
347 if last_line_if_old is None: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
348 # No old line immediately preceding this, so just print it. |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
349 print_single_line(buffered_line) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
350 else: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
351 old_line = last_line_if_old |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
352 new_line = buffered_line |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
353 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
354 old_line_output = [prefixes['-']] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
355 new_line_output = [prefixes['+']] |
21
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
356 |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
357 differenced_lines = common_and_distinct_substrings(old_line[1:], new_line[1:]) |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
358 lines_have_any_non_whitespace_part_in_common = False |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
359 for node in differenced_lines: |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
360 if not node.differ: |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
361 if str(node.a) not in whitespace: |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
362 lines_have_any_non_whitespace_part_in_common = True |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
363 break |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
364 |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
365 for node in differenced_lines: |
929a488c4960
Prevent lines that are completely different from being completely highlighted as different.
Peter Hosey <hg@boredzo.org>
parents:
20
diff
changeset
|
366 if lines_have_any_non_whitespace_part_in_common and node.differ: |
19
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
367 old_line_output.append(BEGIN_REVERSE_FORMAT) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
368 old_line_output.append(str(node.a)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
369 old_line_output.append(END_REVERSE_FORMAT) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
370 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
371 new_line_output.append(BEGIN_REVERSE_FORMAT) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
372 new_line_output.append(str(node.b)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
373 new_line_output.append(END_REVERSE_FORMAT) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
374 else: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
375 old_line_output.append(str(node.a)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
376 new_line_output.append(str(node.b)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
377 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
378 last_line_if_old = None |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
379 sys.stdout.writelines(''.join(old_line_output)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
380 sys.stdout.writelines(''.join(new_line_output)) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
381 else: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
382 if last_line_if_old is not None: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
383 print_single_line(last_line_if_old) |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
384 |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
385 del buffer_old[:] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
386 del buffer_new[:] |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
387 |
17
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
388 for line in fileinput.input(): |
18
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
389 if line.startswith('-') and not line.startswith('---'): |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
390 buffer_old.append(line) |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
391 continue |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
392 elif line.startswith('+') and not line.startswith('+++'): |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
393 buffer_new.append(line) |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
394 continue |
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
395 else: |
19
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
396 flush_buffers(buffer_old, buffer_new) |
18
83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
17
diff
changeset
|
397 |
17
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
398 for prefix_to_test in prefixes: |
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
399 if line.startswith(prefix_to_test): |
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
400 sys.stdout.write(prefixes[prefix_to_test]) |
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
401 line = line[len(prefix_to_test):] |
0 | 402 |
17
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
403 sys.stdout.write(line) |
0 | 404 |
17
54a209909531
Make the file importable for debugging purposes by wrapping the main-program-only bits in an if __name__ == "__main__" block.
Peter Hosey <hg@boredzo.org>
parents:
15
diff
changeset
|
405 sys.stdout.write(RESET_FORMAT) |
19
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
406 else: |
b709258a2fc2
Added highlighting differences between consecutive old and new lines.
Peter Hosey <hg@boredzo.org>
parents:
18
diff
changeset
|
407 flush_buffers(buffer_old, buffer_new) |