mercurial/filelog.py
changeset 24255 4bfe9f2d9761
parent 24190 903c7e8c97ad
child 25948 34bd1a5eef5b
equal deleted inserted replaced
24254:60c279ab7bd3 24255:4bfe9f2d9761
     3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
     3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
     4 #
     4 #
     5 # This software may be used and distributed according to the terms of the
     5 # This software may be used and distributed according to the terms of the
     6 # GNU General Public License version 2 or any later version.
     6 # GNU General Public License version 2 or any later version.
     7 
     7 
     8 import error, revlog
     8 import error, mdiff, revlog
     9 import re
     9 import re, struct
    10 
    10 
    11 _mdre = re.compile('\1\n')
    11 _mdre = re.compile('\1\n')
    12 def parsemeta(text):
    12 def parsemeta(text):
    13     """return (metadatadict, keylist, metadatasize)"""
    13     """return (metadatadict, keylist, metadatasize)"""
    14     # text can be buffer, so we can't use .startswith or .index
    14     # text can be buffer, so we can't use .startswith or .index
   105             raise
   105             raise
   106 
   106 
   107     def iscensored(self, rev):
   107     def iscensored(self, rev):
   108         """Check if a file revision is censored."""
   108         """Check if a file revision is censored."""
   109         return self.flags(rev) & revlog.REVIDX_ISCENSORED
   109         return self.flags(rev) & revlog.REVIDX_ISCENSORED
       
   110 
       
   111     def _peek_iscensored(self, baserev, delta, flush):
       
   112         """Quickly check if a delta produces a censored revision."""
       
   113         # Fragile heuristic: unless new file meta keys are added alphabetically
       
   114         # preceding "censored", all censored revisions are prefixed by
       
   115         # "\1\ncensored:". A delta producing such a censored revision must be a
       
   116         # full-replacement delta, so we inspect the first and only patch in the
       
   117         # delta for this prefix.
       
   118         hlen = struct.calcsize(">lll")
       
   119         if len(delta) <= hlen:
       
   120             return False
       
   121 
       
   122         oldlen = self.rawsize(baserev)
       
   123         newlen = len(delta) - hlen
       
   124         if delta[:hlen] != mdiff.replacediffheader(oldlen, newlen):
       
   125             return False
       
   126 
       
   127         add = "\1\ncensored:"
       
   128         addlen = len(add)
       
   129         return newlen >= addlen and delta[hlen:hlen + addlen] == add