summaryrefslogtreecommitdiff
path: root/util/style.py
diff options
context:
space:
mode:
Diffstat (limited to 'util/style.py')
-rw-r--r--util/style.py54
1 files changed, 35 insertions, 19 deletions
diff --git a/util/style.py b/util/style.py
index 3824cd7f5..b5e9e142e 100644
--- a/util/style.py
+++ b/util/style.py
@@ -84,7 +84,7 @@ def checkwhite(filename):
if not checkwhite_line(line):
yield line,num + 1
-def fixwhite_line(line):
+def fixwhite_line(line, tabsize):
if lead.search(line):
newline = ''
for i,c in enumerate(line):
@@ -117,7 +117,7 @@ def fixwhite(filename, tabsize, fixonly=None):
for i,line in enumerate(lines):
if fixonly is None or i in fixonly:
- line = fixwhite_line(line)
+ line = fixwhite_line(line, tabsize)
print >>f, line,
@@ -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):