Show More
@@ -5,8 +5,8 b'' | |||||
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): | |
@@ -107,3 +107,23 b' class filelog(revlog.revlog):' | |||||
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 |
@@ -1386,7 +1386,10 b' class revlog(object):' | |||||
1386 | transaction.add(self.indexfile, isize, r) |
|
1386 | transaction.add(self.indexfile, isize, r) | |
1387 | transaction.add(self.datafile, end) |
|
1387 | transaction.add(self.datafile, end) | |
1388 | dfh = self.opener(self.datafile, "a") |
|
1388 | dfh = self.opener(self.datafile, "a") | |
1389 |
|
1389 | def flush(): | ||
|
1390 | if dfh: | |||
|
1391 | dfh.flush() | |||
|
1392 | ifh.flush() | |||
1390 | try: |
|
1393 | try: | |
1391 | # loop through our set of deltas |
|
1394 | # loop through our set of deltas | |
1392 | chain = None |
|
1395 | chain = None | |
@@ -1430,9 +1433,13 b' class revlog(object):' | |||||
1430 | raise error.CensoredBaseError(self.indexfile, |
|
1433 | raise error.CensoredBaseError(self.indexfile, | |
1431 | self.node(baserev)) |
|
1434 | self.node(baserev)) | |
1432 |
|
1435 | |||
|
1436 | flags = REVIDX_DEFAULT_FLAGS | |||
|
1437 | if self._peek_iscensored(baserev, delta, flush): | |||
|
1438 | flags |= REVIDX_ISCENSORED | |||
|
1439 | ||||
1433 | chain = self._addrevision(node, None, transaction, link, |
|
1440 | chain = self._addrevision(node, None, transaction, link, | |
1434 |
p1, p2, |
|
1441 | p1, p2, flags, (baserev, delta), | |
1435 |
|
|
1442 | ifh, dfh) | |
1436 | if not dfh and not self._inline: |
|
1443 | if not dfh and not self._inline: | |
1437 | # addrevision switched from inline to conventional |
|
1444 | # addrevision switched from inline to conventional | |
1438 | # reopen the index |
|
1445 | # reopen the index | |
@@ -1450,6 +1457,10 b' class revlog(object):' | |||||
1450 | """Check if a file revision is censored.""" |
|
1457 | """Check if a file revision is censored.""" | |
1451 | return False |
|
1458 | return False | |
1452 |
|
1459 | |||
|
1460 | def _peek_iscensored(self, baserev, delta, flush): | |||
|
1461 | """Quickly check if a delta produces a censored revision.""" | |||
|
1462 | return False | |||
|
1463 | ||||
1453 | def getstrippoint(self, minlink): |
|
1464 | def getstrippoint(self, minlink): | |
1454 | """find the minimum rev that must be stripped to strip the linkrev |
|
1465 | """find the minimum rev that must be stripped to strip the linkrev | |
1455 |
|
1466 |
General Comments 0
You need to be logged in to leave comments.
Login now