do proper style checks for merged files
authorNathan Binkert <nate@binkert.org>
Sun, 22 Jul 2007 20:45:12 +0000 (13:45 -0700)
committerNathan Binkert <nate@binkert.org>
Sun, 22 Jul 2007 20:45:12 +0000 (13:45 -0700)
--HG--
extra : convert_revision : f9d4c61ded4b13655dbe86f0bb6a0b3beaf45151

util/style.py

index 47c992755e003340bdf093bd91b796c8486a77b3..b5e9e142e5017da96220bf0d44510c80c262436d 100644 (file)
@@ -230,8 +230,23 @@ def validate(filename, stats, verbose, exit_code):
                     msg(i, line, 'improper spacing after %s' % match.group(1))
                 bad()
 
+def modified_lines(old_data, new_data):
+    from itertools import count
+    from mercurial import bdiff, mdiff
+
+    modified = set()
+    counter = count()
+    for pbeg, pend, fbeg, fend in bdiff.blocks(old_data, new_data):
+        for i in counter:
+            if i < fbeg:
+                modified.add(i)
+            elif i + 1 >= fend:
+                break
+    return modified
+
 def check_whitespace(ui, repo, hooktype, node, parent1, parent2):
-    from mercurial import bdiff, mdiff, util
+    from mercurial import mdiff
+
     if hooktype != 'pretxncommit':
         raise AttributeError, \
               "This hook is only meant for pretxncommit, not %s" % hooktype
@@ -269,25 +284,26 @@ def check_whitespace(ui, repo, hooktype, node, parent1, parent2):
     for fname in modified:
         fctx = wctx.filectx(fname)
         pctx = fctx.parents()
-        assert len(pctx) == 1
+        assert len(pctx) in (1, 2)
 
-        pdata = pctx[0].data()
-        fdata = fctx.data()
+        file_data = fctx.data()
+        mod_lines = modified_lines(pctx[0].data(), file_data)
+        if len(pctx) == 2:
+            m2 = modified_lines(pctx[1].data(), file_data)
+            mod_lines = mod_lines & m2 # only the lines that are new in both
 
         fixonly = set()
-        lines = enumerate(mdiff.splitnewlines(fdata))
-        for pbeg, pend, fbeg, fend in bdiff.blocks(pdata, fdata):
-            for i, line in lines:
-                if i < fbeg:
-                    if checkwhite_line(line):
-                        continue
-
-                    ui.write("invalid whitespace: %s:%d\n" % (fname, i+1))
-                    if verbose:
-                        ui.write(">>%s<<\n" % line[:-1])
-                    fixonly.add(i)
-                elif i + 1 >= fend:
-                    break
+        for i,line in enumerate(mdiff.splitnewlines(file_data)):
+            if i not in mod_lines:
+                continue
+
+            if checkwhite_line(line):
+                continue
+
+            ui.write("invalid whitespace: %s:%d\n" % (fname, i+1))
+            if verbose:
+                ui.write(">>%s<<\n" % line[:-1])
+            fixonly.add(i)
 
         if fixonly:
             if prompt(fname, fixonly):