[PATCH 5 of 5] keyword: check for '\0' in entire data before acting
Christian Ebert
blacktrash at gmx.net
Mon Apr 7 17:10:33 UTC 2008
# HG changeset patch
# User Christian Ebert <blacktrash at gmx.net>
# Date 1207586716 -7200
# Node ID f4e983f6f4bb5cdbfc0a5ea336133e1588f1dc36
# Parent 84f1bb1bcfc873a31ae97b73b9a2a4711234f92b
keyword: check for '\0' in entire data before acting
util.binary might not be safe enough, as it fails eg. on certain
pdf files (issue1066).
diff --git a/hgext/keyword.py b/hgext/keyword.py
--- a/hgext/keyword.py
+++ b/hgext/keyword.py
@@ -100,6 +100,10 @@
'''Returns hgdate in cvs-like UTC format.'''
return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0]))
+def textsafe(s):
+ '''Safe version of util.binary with reversed logic.'''
+ return '\0' not in s
+
# make keyword tools accessible
kwtools = {'templater': None, 'hgcmd': '', 'inc': [], 'exc': ['.hg*']}
@@ -158,7 +162,7 @@
def expand(self, path, node, data):
'''Returns data with keywords expanded.'''
- if not self.restrict and self.matcher(path) and not util.binary(data):
+ if not self.restrict and self.matcher(path) and textsafe(data):
changenode = self.getnode(path, node)
return self.substitute(data, path, changenode, self.re_kw.sub)
return data
@@ -186,7 +190,7 @@
for f in candidates:
fp = self.repo.file(f)
data = fp.read(mf[f])
- if util.binary(data):
+ if not textsafe(data):
continue
if expand:
changenode = node or self.getnode(f, mf[f])
@@ -206,7 +210,7 @@
def shrink(self, fname, text):
'''Returns text with all keyword substitutions removed.'''
- if self.matcher(fname) and not util.binary(text):
+ if self.matcher(fname) and textsafe(text):
return self.shrinktext(text)
return text
@@ -214,7 +218,7 @@
'''Returns lines with keyword substitutions removed.'''
if self.matcher(fname):
text = ''.join(lines)
- if not util.binary(text):
+ if textsafe(text):
return self.shrinktext(text).splitlines(True)
return lines
More information about the Mercurial-devel
mailing list