Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 14270:d6907a5674a2
revlog: support writing generaldelta revlogs
With generaldelta switched on, deltas are always computed against the first
parent when adding revisions. This is done regardless of what revision the
incoming bundle, if any, is deltaed against.
The exact delta building strategy is subject to change, but this will not
affect compatibility.
Generaldelta is switched off by default.
author | Sune Foldager <cryo@cyanite.org> |
---|---|
date | Sun, 08 May 2011 21:32:33 +0200 |
parents | c28d5200374c |
children | c97d8485b5fa |
comparison
equal
deleted
inserted
replaced
14269:66257848c154 | 14270:d6907a5674a2 |
---|---|
224 self._pcache = {} | 224 self._pcache = {} |
225 self._nodecache = {nullid: nullrev} | 225 self._nodecache = {nullid: nullrev} |
226 self._nodepos = None | 226 self._nodepos = None |
227 | 227 |
228 v = REVLOG_DEFAULT_VERSION | 228 v = REVLOG_DEFAULT_VERSION |
229 if hasattr(opener, 'options') and 'defversion' in opener.options: | 229 if hasattr(opener, 'options'): |
230 v = opener.options['defversion'] | 230 if 'defversion' in opener.options: |
231 if v & REVLOGNG: | 231 v = opener.options['defversion'] |
232 v |= REVLOGNGINLINEDATA | 232 if v & REVLOGNG: |
233 v |= REVLOGNGINLINEDATA | |
234 if v & REVLOGNG and 'generaldelta' in opener.options: | |
235 v |= REVLOGGENERALDELTA | |
233 | 236 |
234 i = '' | 237 i = '' |
235 try: | 238 try: |
236 f = self.opener(self.indexfile) | 239 f = self.opener(self.indexfile) |
237 i = f.read() | 240 i = f.read() |
1001 delta = mdiff.textdiff(ptext, t) | 1004 delta = mdiff.textdiff(ptext, t) |
1002 data = compress(delta) | 1005 data = compress(delta) |
1003 l = len(data[1]) + len(data[0]) | 1006 l = len(data[1]) + len(data[0]) |
1004 basecache = self._basecache | 1007 basecache = self._basecache |
1005 if basecache and basecache[0] == rev: | 1008 if basecache and basecache[0] == rev: |
1006 base = basecache[1] | 1009 chainbase = basecache[1] |
1007 else: | 1010 else: |
1008 base = self.chainbase(rev) | 1011 chainbase = self.chainbase(rev) |
1009 dist = l + offset - self.start(base) | 1012 dist = l + offset - self.start(chainbase) |
1013 if self._generaldelta: | |
1014 base = rev | |
1015 else: | |
1016 base = chainbase | |
1010 return dist, l, data, base | 1017 return dist, l, data, base |
1011 | 1018 |
1012 curr = len(self) | 1019 curr = len(self) |
1013 prev = curr - 1 | 1020 prev = curr - 1 |
1014 base = curr | 1021 base = curr |
1017 d = None | 1024 d = None |
1018 p1r, p2r = self.rev(p1), self.rev(p2) | 1025 p1r, p2r = self.rev(p1), self.rev(p2) |
1019 | 1026 |
1020 # should we try to build a delta? | 1027 # should we try to build a delta? |
1021 if prev != nullrev: | 1028 if prev != nullrev: |
1022 d = builddelta(prev) | 1029 if self._generaldelta: |
1030 d = builddelta(p1r) | |
1031 else: | |
1032 d = builddelta(prev) | |
1023 dist, l, data, base = d | 1033 dist, l, data, base = d |
1024 | 1034 |
1025 # full versions are inserted when the needed deltas | 1035 # full versions are inserted when the needed deltas |
1026 # become comparable to the uncompressed text | 1036 # become comparable to the uncompressed text |
1027 if text is None: | 1037 if text is None: |