--- a/mercurial/filelog.py Fri Mar 06 22:43:47 2015 -0800
+++ b/mercurial/filelog.py Wed Jan 14 15:16:08 2015 -0500
@@ -5,8 +5,8 @@
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
-import error, revlog
-import re
+import error, mdiff, revlog
+import re, struct
_mdre = re.compile('\1\n')
def parsemeta(text):
@@ -107,3 +107,23 @@
def iscensored(self, rev):
"""Check if a file revision is censored."""
return self.flags(rev) & revlog.REVIDX_ISCENSORED
+
+ def _peek_iscensored(self, baserev, delta, flush):
+ """Quickly check if a delta produces a censored revision."""
+ # Fragile heuristic: unless new file meta keys are added alphabetically
+ # preceding "censored", all censored revisions are prefixed by
+ # "\1\ncensored:". A delta producing such a censored revision must be a
+ # full-replacement delta, so we inspect the first and only patch in the
+ # delta for this prefix.
+ hlen = struct.calcsize(">lll")
+ if len(delta) <= hlen:
+ return False
+
+ oldlen = self.rawsize(baserev)
+ newlen = len(delta) - hlen
+ if delta[:hlen] != mdiff.replacediffheader(oldlen, newlen):
+ return False
+
+ add = "\1\ncensored:"
+ addlen = len(add)
+ return newlen >= addlen and delta[hlen:hlen + addlen] == add