comparison mercurial/revlog.py @ 39866:e23c03dc5cf9

revlog: drop emitrevisiondeltas() and associated functionality (API) emitrevisions() is the future! Differential Revision: https://phab.mercurial-scm.org/D4726
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 24 Sep 2018 09:59:19 -0700
parents 5a9ab91e0a45
children 14e500b58263
comparison
equal deleted inserted replaced
39865:31b7e8e7132e 39866:e23c03dc5cf9
2292 res = [self.indexfile] 2292 res = [self.indexfile]
2293 if not self._inline: 2293 if not self._inline:
2294 res.append(self.datafile) 2294 res.append(self.datafile)
2295 return res 2295 return res
2296 2296
2297 def emitrevisiondeltas(self, requests):
2298 frev = self.rev
2299
2300 prevrev = None
2301 for request in requests:
2302 node = request.node
2303 rev = frev(node)
2304
2305 if prevrev is None:
2306 prevrev = self.index[rev][5]
2307
2308 # Requesting a full revision.
2309 if request.basenode == nullid:
2310 baserev = nullrev
2311 # Requesting an explicit revision.
2312 elif request.basenode is not None:
2313 baserev = frev(request.basenode)
2314 # Allowing us to choose.
2315 else:
2316 p1rev, p2rev = self.parentrevs(rev)
2317 deltaparentrev = self.deltaparent(rev)
2318
2319 # Avoid sending full revisions when delta parent is null. Pick
2320 # prev in that case. It's tempting to pick p1 in this case, as
2321 # p1 will be smaller in the common case. However, computing a
2322 # delta against p1 may require resolving the raw text of p1,
2323 # which could be expensive. The revlog caches should have prev
2324 # cached, meaning less CPU for delta generation. There is
2325 # likely room to add a flag and/or config option to control this
2326 # behavior.
2327 if deltaparentrev == nullrev and self._storedeltachains:
2328 baserev = prevrev
2329
2330 # Revlog is configured to use full snapshot for a reason.
2331 # Stick to full snapshot.
2332 elif deltaparentrev == nullrev:
2333 baserev = nullrev
2334
2335 # Pick previous when we can't be sure the base is available
2336 # on consumer.
2337 elif deltaparentrev not in (p1rev, p2rev, prevrev):
2338 baserev = prevrev
2339 else:
2340 baserev = deltaparentrev
2341
2342 if baserev != nullrev and not self.candelta(baserev, rev):
2343 baserev = nullrev
2344
2345 revision = None
2346 delta = None
2347 baserevisionsize = None
2348
2349 if self.iscensored(baserev) or self.iscensored(rev):
2350 try:
2351 revision = self.revision(node, raw=True)
2352 except error.CensoredNodeError as e:
2353 revision = e.tombstone
2354
2355 if baserev != nullrev:
2356 baserevisionsize = self.rawsize(baserev)
2357
2358 elif baserev == nullrev:
2359 revision = self.revision(node, raw=True)
2360 else:
2361 delta = self.revdiff(baserev, rev)
2362
2363 extraflags = REVIDX_ELLIPSIS if request.ellipsis else 0
2364
2365 yield revlogrevisiondelta(
2366 node=node,
2367 p1node=request.p1node,
2368 p2node=request.p2node,
2369 linknode=request.linknode,
2370 basenode=self.node(baserev),
2371 flags=self.flags(rev) | extraflags,
2372 baserevisionsize=baserevisionsize,
2373 revision=revision,
2374 delta=delta)
2375
2376 prevrev = rev
2377
2378 def emitrevisions(self, nodes, nodesorder=None, revisiondata=False, 2297 def emitrevisions(self, nodes, nodesorder=None, revisiondata=False,
2379 assumehaveparentrevisions=False, deltaprevious=False): 2298 assumehaveparentrevisions=False, deltaprevious=False):
2380 if nodesorder not in ('nodes', 'storage', None): 2299 if nodesorder not in ('nodes', 'storage', None):
2381 raise error.ProgrammingError('unhandled value for nodesorder: %s' % 2300 raise error.ProgrammingError('unhandled value for nodesorder: %s' %
2382 nodesorder) 2301 nodesorder)