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: