summaryrefslogtreecommitdiffstats
path: root/needs-checking/unitdiff.py
diff options
context:
space:
mode:
Diffstat (limited to 'needs-checking/unitdiff.py')
-rwxr-xr-xneeds-checking/unitdiff.py223
1 files changed, 223 insertions, 0 deletions
diff --git a/needs-checking/unitdiff.py b/needs-checking/unitdiff.py
new file mode 100755
index 0000000..d19d5e7
--- /dev/null
+++ b/needs-checking/unitdiff.py
@@ -0,0 +1,223 @@
+#!/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