equal
deleted
inserted
replaced
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 |