#!/usr/bin/python
import sys
import re
import string
#TODO
# clean up rest/file
# clean up +6 and like (assumptions). should be turned into 'find'
# make regession tests for all cases (Only in, etc)
try:
filename = sys.argv[1]
except:
print 'requires a file name'
sys.exit(1)
filefd = open(filename)
file = filefd.read()
filefd.close()
rest = file
pat = "(^(?:diff .*\n)?--- .*\n\+\+\+ .*)?\n@@ -(\d+),?(\d+)? \+(\d+),?(\d+)? @@|^(Only in .*)"
startpat = re.compile(pat, re.M)
pos = 0
oldpos = 0
filelen = len(rest)
oldrest = ""
while(1):
rexp = startpat.search(rest)
if not rexp:
break
if rexp.group(6):
print rexp.group(6)
rest = rest[rexp.end(6)+1:]
continue
header = rexp.group(1)
orgfile_start = string.atoi(rexp.group(2))
if rexp.group(3):
orgfile_len = string.atoi(rexp.group(3))
else:
orgfile_len = -1
newfile_start = string.atoi(rexp.group(4))
if rexp.group(5):
newfile_len = string.atoi(rexp.group(5))
else:
newfile_len = -1
rest = rest[rexp.start(2):]
rest = rest[string.find(rest, "\n")+1:]
rexp2 = startpat.search(rest)
if rexp2:
if rexp2.start(6) != -1:
oldrest = rest[rexp2.start(6)-1:]
rest = rest[:rexp2.start(6)]
elif rexp2.start(1) == -1:
oldrest = rest[rexp2.start(2)-5:]
rest = rest[:rexp2.start(2)-4]
else:
oldrest = rest[rexp2.start(1)-1:]
rest = rest[:rexp2.start(1)]
else:
oldrest = rest
# pos = filelen - len(oldrest)
# if pos - oldpos > 100:
# sys.stderr.write(`pos`+'/'+`filelen`+'\n')
# oldpos = pos
first = 1
oldminuses = 0
oldplusses = 0
oldoffset = 0
while(1):
#erstat early line stuff med lookbehind paa {1,2}-dims
#nedenfor RAA
linepat = "^([^-+\n]*)\n?(((^[-+].*\n)|^(.*\n){1,2}(?=^[-+].*\n))+)(.*)\n?"
compat = re.compile(linepat, re.M)
rexp = compat.search(rest)
if not rexp:
break
prematch = rexp.group(1)
match = rexp.group(2)
muddle = len(match)
# print rest
# print 'prematch ', rexp.start(1), rexp.end(1), prematch
# print 'match ---------'
# print match
# print 'match --------'
# dump unwanted early lines...
if match[0] != "+" and match[0] != "-":
while(1):
next = string.find(match, '\n')
if next == -1:
break
if match[next+1] == "+" or match[next+1] == "-":
prematch = match[:next]
match = match[next+1:]
break
match = match[next+1:]
# print 'prematch ', rexp.start(1), rexp.end(1), len(prematch)
# print '('+prematch+')'
# if prematch == ' ':
# print 'space'
muddle = muddle - len(match)
lines = string.count(match, "\n")
compat = re.compile("^-", re.M)
minuses = len(compat.findall(match))
compat = re.compile("^\+", re.M)
plusses = len(compat.findall(match))
orgsize = minuses + 2 + (lines - minuses - plusses)
newsize = plusses + 2 + (lines - minuses - plusses)
noeol = "^(\\\ No newline at end of file)$"
compnoeol = re.compile(noeol, re.M)
if compnoeol.search(match) or compnoeol.search(rexp.group(6)):
orgsize = orgsize - 1
newsize = newsize - 1
coherent = 0
if lines - plusses == 0:
coherent = 1
elif lines - minuses == 0:
coherent = 1
# RAA FIXME
if not len(prematch):#or len(prematch) == 1 and prematch == ' ':
orgsize = orgsize -1
newsize = newsize -1
if rexp.start(6) == rexp.end(6):
orgsize = orgsize -1
newsize = newsize -1
# print "lines in match: ", lines
# print "number of minuses: ", minuses
# print "number of plusses: ", plusses
matchpos = rexp.start(2) + muddle
offset = string.count(rest[:matchpos], "\n")
# print 'offset/oldoffset: ', offset,oldoffset
# print 'oldplusses/oldminuses: ', oldplusses, oldminuses
# print 'orgfile_start/newfile_start: ', orgfile_start, newfile_start
orgstart = orgfile_start + offset + oldoffset - oldplusses
newstart = newfile_start + offset - oldminuses + oldoffset
# RAA: Bwadr. Fix antagelse om prematch paa en anden
# maade
orgstartmod = 0
newstartmod = 0
if orgfile_start == 1 and not len(prematch):
orgstartmod = 1
if newfile_start == 1 and not len(prematch):
newstartmod = 1
if orgfile_start == 0 and orgfile_len == 0:
orgstartmod = 1
# RAA Hack!
plusses = plusses + 1
minuses = minuses +1
if newfile_start == 0 and newfile_len == 0:
newstartmod = 1
# RAA Hack!
plusses = plusses + 1
minuses = minuses +1
if header and first:
print header
first = 0
# should the start(1) == 0 be orgstart == 1? RAA
if orgstart == 1 and newstart == 1 and plusses == 0 and coherent:
print "@@ -"+`orgstart`+","+`orgsize`+" +"+`newstart`+" @@"
print match[:string.rfind(match, "\n")]
print rexp.group(6)
elif rexp.start(6) == rexp.end(6) and plusses == 0 and coherent:
if orgstartmod:
orgstart = orgstart + 1
if newstartmod:
newstart = newstart + 1
print "@@ -"+`orgstart-1`+","+`orgsize`+" +"+`newstart-1`+" @@"
print prematch
print match[:string.rfind(match, "\n")]
elif orgstart == 1 and orgstart == 1 and minuses == 0 and coherent:
print "@@ -"+`orgstart`+" +"+`newstart`+","+`newsize`+" @@"
print match[:string.rfind(match, "\n")]
print rexp.group(6)
elif rexp.start(6) == rexp.end(6) and minuses == 0 and coherent:
if orgstartmod:
orgstart = orgstart + 1
if newstartmod:
newstart = newstart + 1
print "@@ -"+`orgstart-1`+" +"+`newstart-1`+","+`newsize`+" @@"
print prematch
print match[:string.rfind(match, "\n")]
else:
if orgstartmod:
orgstart = orgstart + 1
if newstartmod:
newstart = newstart + 1
print "@@ -"+`orgstart-1`+","+`orgsize`+" +"+`newstart-1`+","+`newsize`+" @@"
if len(prematch):
print prematch
print match[:string.rfind(match, "\n")]
if rexp.start(6) != rexp.end(6):
print rexp.group(6)
rest = rest[rexp.end(6):]
oldminuses = minuses + oldminuses
oldplusses = plusses + oldplusses
oldoffset = oldoffset + offset + lines #include match()-lines
rest = oldrest