Mercurial > diff-colorize
annotate diff-colorize.py @ 18:83d58ccc70bf
Interleave adjacent runs of consecutive old and new lines into alternating old and new lines.
author | Peter Hosey <hg@boredzo.org> |
---|---|
date | Wed, 05 Jan 2011 06:56:01 -0800 |
parents | 54a209909531 |
children | b709258a2fc2 |
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 = """ |
30 Usage: diff ... | diff-colorize | |
31 or: diff-colorize < foo.diff | |
32 | |
33 Reads unified or git-style diff data from standard input, colorizes it, and writes the result to standard output. | |
34 | |
35 You can customize the color numbers used by setting these variables in your environment: | |
36 * DIFF_INDEX_COLOR (lines starting with "Index: " or "diff --git ") | |
37 * DIFF_OLD_MODE_COLOR (lines starting with "old mode"; these only appear in git-style diffs) | |
38 * DIFF_NEW_MODE_COLOR (lines starting with "new mode"; these only appear in git-style diffs) | |
39 * DIFF_REMOVED_COLOR (lines starting with "-") | |
40 * DIFF_ADDED_COLOR (lines starting with "+") | |
41 * DIFF_HUNK_START_COLOR (lines starting with "@@") | |
42 """.strip() | |
43 | |
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
|
44 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
|
45 "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
|
46 |
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 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
|
48 "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
|
49 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
|
50 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
|
51 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
|
52 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
|
53 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
|
54 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
|
55 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
|
56 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
|
57 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
|
58 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
|
59 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
|
60 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
|
61 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
|
62 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
|
63 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
|
64 |
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 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
|
66 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
|
67 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
|
68 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
|
69 |
7
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
70 # 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
|
71 # 'Index: ': File marker (unified diff) |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
72 # '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
|
73 # '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
|
74 # '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
|
75 # '---': 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
|
76 # '+++': 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
|
77 # '-': 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
|
78 # '+': 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
|
79 # ' ': Line that hasn't changed |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
80 # '@@': 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
|
81 # |
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
82 # 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
|
83 class OrderedDict(dict): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
84 def __init__(self, input=None): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
85 if input is None: |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
86 self.keys = [] |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
87 super(OrderedDict, self).__init__() |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
88 elif isinstance(input, dict): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
89 self.keys = list(input) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
90 super(OrderedDict, self).__init__(input) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
91 else: |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
92 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
|
93 super(OrderedDict, self).__init__(input) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
94 def __iter__(self): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
95 return iter(self.keys) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
96 def __setitem__(self, k, v): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
97 if k not in self: |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
98 self.keys.append(k) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
99 super(OrderedDict, self).__setitem__(k, v) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
100 def __delitem__(self, k): |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
101 super(OrderedDict, self).__delitem__(k) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
102 self.keys.remove(k) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
103 |
7
c6337f653d9b
Added some comments documenting the OrderedDict class and our instance's contents.
Peter Hosey
parents:
6
diff
changeset
|
104 # 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
|
105 # 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
|
106 prefixes = OrderedDict() |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
107 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
|
108 COLOR_FORMAT % (removed_color,) |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
109 + BEGIN_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
110 + '---' |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
111 + END_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
112 ) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
113 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
|
114 COLOR_FORMAT % (added_color,) |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
115 + BEGIN_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
116 + '+++' |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
117 + END_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
118 ) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
119 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
|
120 COLOR_FORMAT % (removed_color,) |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
121 + BEGIN_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
122 + '-' |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
123 + END_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
124 ) |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
125 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
|
126 COLOR_FORMAT % (added_color,) |
1
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
127 + BEGIN_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
128 + '+' |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
129 + END_REVERSE_FORMAT |
44f86539d245
Refactored to allow me to more easily add new prefixes.
Peter Hosey
parents:
0
diff
changeset
|
130 ) |
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
|
131 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
|
132 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
|
133 + 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
|
134 + '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
|
135 + 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
|
136 ) |
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
|
137 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
|
138 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
|
139 + 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
|
140 + '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
|
141 + 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
|
142 ) |
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
|
143 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
|
144 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
|
145 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
|
146 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
|
147 + 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
|
148 + '@@' |
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
|
149 ) |
0 | 150 |
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
|
151 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
|
152 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
|
153 # 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
|
154 sys.exit(USAGE) |
9 | 155 |
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
|
156 # 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
|
157 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
|
158 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
|
159 |
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
|
160 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
|
161 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
|
162 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
|
163 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
|
164 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
|
165 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
|
166 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
|
167 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
|
168 # Flush the buffers, interleaving the 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
|
169 for buffered_line in interleave(buffer_old, buffer_new): |
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
|
170 prefix = '-' if buffered_line.startswith('-') 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
|
171 buffered_line = buffered_line[len(prefix):] |
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
|
172 |
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
|
173 sys.stdout.write(prefixes[prefix]) |
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
|
174 sys.stdout.write(buffered_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
|
175 sys.stdout.write(RESET_FORMAT) |
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
|
176 |
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
|
177 del buffer_old[:] |
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
|
178 del buffer_new[:] |
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
|
179 |
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
|
180 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
|
181 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
|
182 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
|
183 line = line[len(prefix_to_test):] |
0 | 184 |
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
|
185 sys.stdout.write(line) |
0 | 186 |
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
|
187 sys.stdout.write(RESET_FORMAT) |