-
-
Save kylegibson/4441506 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
""" | |
ignore_moves.py v0.2 | |
Filter relocated lines from a unified diff format stream. | |
Offered under the terms of the MIT License at github.com | |
Taken from http://stackoverflow.com/questions/1380333/ | |
""" | |
import sys | |
from optparse import OptionParser | |
RED = 31 | |
GREEN = 32 | |
RESET_SEQ = "\033[0m" | |
COLOR_SEQ = "\033[0;%dm" | |
def inverse(line): | |
""" | |
Swap a delta line between + and - | |
""" | |
return ('-' if line[0] == '+' else '+') + line[1:].strip() | |
def reverse_enumerate(lst): | |
""" | |
A handy generator | |
""" | |
for index, value in enumerate(reversed(lst)): | |
yield len(lst) - 1 - index, value | |
def dumpchanges(stack, options): | |
""" | |
Redender output. Called for each disparate file in the diff. | |
""" | |
for line in stack: | |
if options.plain: | |
print line.strip() | |
else: | |
seq = COLOR_SEQ % (GREEN if line.startswith('+') else RED) | |
print seq + line.strip() + RESET_SEQ | |
stack[:] = [] | |
def main(): | |
""" | |
The primary logic | |
""" | |
parser = OptionParser(usage="usage: cat diff.patch | %prog [-p]", | |
description="Filter relocated lines from a unified diff format stream.", | |
version="%prog 0.2", | |
epilog="Offered under the terms of the MIT License at github.com") | |
parser.add_option("-p", "--plain", action="store_true", dest="plain", | |
default=False, help="don't highlight output") | |
options = parser.parse_args()[0] | |
stack = [] | |
for line in sys.stdin.readlines(): | |
if not line[1:].strip(): | |
continue # ignore empty lines | |
if line.startswith(('---', '+++')): | |
dumpchanges(stack, options) | |
print line.strip() | |
elif line.startswith(('+', '-')): | |
inverted = inverse(line) | |
line = line[0] + line[1:].strip() | |
for i, match in reverse_enumerate(stack): | |
if inverted == match: | |
stack.pop(i) | |
break | |
else: | |
stack.append(line) | |
# finished reading, still have state to be dumped | |
dumpchanges(stack, options) | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment