Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revlog.py @ 14195:0013d3eeb826
revlog: remove support for parentdelta
We will introduce a more powerful and general delta concept instead,
called generaldelta.
author | Sune Foldager <cryo@cyanite.org> |
---|---|
date | Thu, 05 May 2011 12:55:12 +0200 |
parents | cb98fed52495 |
children | e7483ec3c374 |
comparison
equal
deleted
inserted
replaced
14194:3a90fb3addc1 | 14195:0013d3eeb826 |
---|---|
32 REVLOG_DEFAULT_FORMAT = REVLOGNG | 32 REVLOG_DEFAULT_FORMAT = REVLOGNG |
33 REVLOG_DEFAULT_VERSION = REVLOG_DEFAULT_FORMAT | REVLOG_DEFAULT_FLAGS | 33 REVLOG_DEFAULT_VERSION = REVLOG_DEFAULT_FORMAT | REVLOG_DEFAULT_FLAGS |
34 REVLOGNG_FLAGS = REVLOGNGINLINEDATA | REVLOGSHALLOW | 34 REVLOGNG_FLAGS = REVLOGNGINLINEDATA | REVLOGSHALLOW |
35 | 35 |
36 # revlog index flags | 36 # revlog index flags |
37 REVIDX_PARENTDELTA = 1 | |
38 REVIDX_PUNCHED_FLAG = 2 | 37 REVIDX_PUNCHED_FLAG = 2 |
39 REVIDX_KNOWN_FLAGS = REVIDX_PUNCHED_FLAG | REVIDX_PARENTDELTA | 38 REVIDX_KNOWN_FLAGS = REVIDX_PUNCHED_FLAG |
40 | 39 |
41 # max size of revlog with inline data | 40 # max size of revlog with inline data |
42 _maxinline = 131072 | 41 _maxinline = 131072 |
43 _chunksize = 1048576 | 42 _chunksize = 1048576 |
44 | 43 |
221 self.opener = opener | 220 self.opener = opener |
222 self._cache = None | 221 self._cache = None |
223 self._chunkcache = (0, '') | 222 self._chunkcache = (0, '') |
224 self.index = [] | 223 self.index = [] |
225 self._shallowroot = shallowroot | 224 self._shallowroot = shallowroot |
226 self._parentdelta = 0 | |
227 self._pcache = {} | 225 self._pcache = {} |
228 self._nodecache = {nullid: nullrev} | 226 self._nodecache = {nullid: nullrev} |
229 self._nodepos = None | 227 self._nodepos = None |
230 | 228 |
231 v = REVLOG_DEFAULT_VERSION | 229 v = REVLOG_DEFAULT_VERSION |
232 if hasattr(opener, 'options') and 'defversion' in opener.options: | 230 if hasattr(opener, 'options') and 'defversion' in opener.options: |
233 v = opener.options['defversion'] | 231 v = opener.options['defversion'] |
234 if v & REVLOGNG: | 232 if v & REVLOGNG: |
235 v |= REVLOGNGINLINEDATA | 233 v |= REVLOGNGINLINEDATA |
236 if v & REVLOGNG and 'parentdelta' in opener.options: | |
237 self._parentdelta = 1 | |
238 | 234 |
239 if shallowroot: | 235 if shallowroot: |
240 v |= REVLOGSHALLOW | 236 v |= REVLOGSHALLOW |
241 | 237 |
242 i = '' | 238 i = '' |
832 | 828 |
833 def _chunkclear(self): | 829 def _chunkclear(self): |
834 self._chunkcache = (0, '') | 830 self._chunkcache = (0, '') |
835 | 831 |
836 def deltaparent(self, rev): | 832 def deltaparent(self, rev): |
837 """return previous revision or parentrev according to flags""" | 833 """return deltaparent of the given revision""" |
838 if self.flags(rev) & REVIDX_PARENTDELTA: | 834 return rev - 1 |
839 return self.parentrevs(rev)[0] | |
840 else: | |
841 return rev - 1 | |
842 | 835 |
843 def revdiff(self, rev1, rev2): | 836 def revdiff(self, rev1, rev2): |
844 """return or calculate a delta between two revisions""" | 837 """return or calculate a delta between two revisions""" |
845 if self.base(rev2) != rev2 and self.deltaparent(rev2) == rev1: | 838 if self.base(rev2) != rev2 and self.deltaparent(rev2) == rev1: |
846 return self._chunk(rev2) | 839 return self._chunk(rev2) |
868 raise RevlogError(_('incompatible revision flag %x') % | 861 raise RevlogError(_('incompatible revision flag %x') % |
869 (self.flags(rev) & ~REVIDX_KNOWN_FLAGS)) | 862 (self.flags(rev) & ~REVIDX_KNOWN_FLAGS)) |
870 | 863 |
871 # build delta chain | 864 # build delta chain |
872 chain = [] | 865 chain = [] |
873 index = self.index # for performance | |
874 iterrev = rev | 866 iterrev = rev |
875 e = index[iterrev] | |
876 while iterrev != base and iterrev != cachedrev: | 867 while iterrev != base and iterrev != cachedrev: |
877 chain.append(iterrev) | 868 chain.append(iterrev) |
878 if e[0] & REVIDX_PARENTDELTA: | 869 iterrev -= 1 |
879 iterrev = e[5] | |
880 else: | |
881 iterrev -= 1 | |
882 e = index[iterrev] | |
883 chain.reverse() | 870 chain.reverse() |
884 base = iterrev | 871 base = iterrev |
885 | 872 |
886 if iterrev == cachedrev: | 873 if iterrev == cachedrev: |
887 # cache hit | 874 # cache hit |
1016 p1r, p2r = self.rev(p1), self.rev(p2) | 1003 p1r, p2r = self.rev(p1), self.rev(p2) |
1017 | 1004 |
1018 # should we try to build a delta? | 1005 # should we try to build a delta? |
1019 if prev != nullrev: | 1006 if prev != nullrev: |
1020 d = builddelta(prev) | 1007 d = builddelta(prev) |
1021 if self._parentdelta and prev != p1r: | |
1022 d2 = builddelta(p1r) | |
1023 if d2 < d: | |
1024 d = d2 | |
1025 flags = REVIDX_PARENTDELTA | |
1026 dist, l, data, base = d | 1008 dist, l, data, base = d |
1027 | 1009 |
1028 # full versions are inserted when the needed deltas | 1010 # full versions are inserted when the needed deltas |
1029 # become comparable to the uncompressed text | 1011 # become comparable to the uncompressed text |
1030 # or the base revision is punched | 1012 # or the base revision is punched |