comparison mercurial/utils/storageutil.py @ 40427:59a870a4ad6e

changegroup: refactor emitrevision to use a `deltamode` argument This new argument gathers the semantic of `sendfulltext` and `deltaprevious` in a single value. We are about to introduce a new type of constraints. Avoiding yet another argument sounds like a plus.
author Boris Feld <boris.feld@octobus.net>
date Tue, 09 Oct 2018 22:02:01 +0200
parents b0fbd1792e2d
children 968dd7e02ac5
comparison
equal deleted inserted replaced
40425:5e5c8f2a1eb5 40427:59a870a4ad6e
20 from .. import ( 20 from .. import (
21 dagop, 21 dagop,
22 error, 22 error,
23 mdiff, 23 mdiff,
24 pycompat, 24 pycompat,
25 repository,
25 ) 26 )
26 27
27 _nullhash = hashlib.sha1(nullid) 28 _nullhash = hashlib.sha1(nullid)
28 29
29 def hashrevisionsha1(text, p1, p2): 30 def hashrevisionsha1(text, p1, p2):
267 268
268 return strippoint, brokenrevs 269 return strippoint, brokenrevs
269 270
270 def emitrevisions(store, nodes, nodesorder, resultcls, deltaparentfn=None, 271 def emitrevisions(store, nodes, nodesorder, resultcls, deltaparentfn=None,
271 candeltafn=None, rawsizefn=None, revdifffn=None, flagsfn=None, 272 candeltafn=None, rawsizefn=None, revdifffn=None, flagsfn=None,
272 sendfulltext=False, 273 deltamode=repository.CG_DELTAMODE_STD,
273 revisiondata=False, assumehaveparentrevisions=False, 274 revisiondata=False, assumehaveparentrevisions=False):
274 deltaprevious=False):
275 """Generic implementation of ifiledata.emitrevisions(). 275 """Generic implementation of ifiledata.emitrevisions().
276 276
277 Emitting revision data is subtly complex. This function attempts to 277 Emitting revision data is subtly complex. This function attempts to
278 encapsulate all the logic for doing so in a backend-agnostic way. 278 encapsulate all the logic for doing so in a backend-agnostic way.
279 279
320 320
321 ``flagsfn`` (optional) 321 ``flagsfn`` (optional)
322 Callable receiving a revision number and returns the integer flags 322 Callable receiving a revision number and returns the integer flags
323 value for it. If not defined, flags value will be 0. 323 value for it. If not defined, flags value will be 0.
324 324
325 ``sendfulltext`` 325 ``deltamode``
326 constaint on delta to be sent:
327 * CG_DELTAMODE_STD - normal mode, try to reuse storage deltas,
328 * CG_DELTAMODE_PREV - only delta against "prev",
329 * CG_DELTAMODE_FULL - only issue full snapshot.
330
326 Whether to send fulltext revisions instead of deltas, if allowed. 331 Whether to send fulltext revisions instead of deltas, if allowed.
327 332
328 ``nodesorder`` 333 ``nodesorder``
329 ``revisiondata`` 334 ``revisiondata``
330 ``assumehaveparentrevisions`` 335 ``assumehaveparentrevisions``
331 ``deltaprevious``
332 See ``ifiledata.emitrevisions()`` interface documentation.
333 """ 336 """
334 337
335 fnode = store.node 338 fnode = store.node
336 frev = store.rev 339 frev = store.rev
337 340
343 revs = set(frev(n) for n in nodes) 346 revs = set(frev(n) for n in nodes)
344 revs = dagop.linearize(revs, store.parentrevs) 347 revs = dagop.linearize(revs, store.parentrevs)
345 348
346 prevrev = None 349 prevrev = None
347 350
348 if deltaprevious or assumehaveparentrevisions: 351 if deltamode == repository.CG_DELTAMODE_PREV or assumehaveparentrevisions:
349 prevrev = store.parentrevs(revs[0])[0] 352 prevrev = store.parentrevs(revs[0])[0]
350 353
351 # Set of revs available to delta against. 354 # Set of revs available to delta against.
352 available = set() 355 available = set()
353 356
362 deltaparentrev = deltaparentfn(rev) 365 deltaparentrev = deltaparentfn(rev)
363 else: 366 else:
364 deltaparentrev = nullrev 367 deltaparentrev = nullrev
365 368
366 # Forced delta against previous mode. 369 # Forced delta against previous mode.
367 if deltaprevious: 370 if deltamode == repository.CG_DELTAMODE_PREV:
368 baserev = prevrev 371 baserev = prevrev
369 372
370 # We're instructed to send fulltext. Honor that. 373 # We're instructed to send fulltext. Honor that.
371 elif sendfulltext: 374 elif deltamode == repository.CG_DELTAMODE_FULL:
372 baserev = nullrev 375 baserev = nullrev
373 376
374 # There is a delta in storage. We try to use that because it 377 # There is a delta in storage. We try to use that because it
375 # amounts to effectively copying data from storage and is 378 # amounts to effectively copying data from storage and is
376 # therefore the fastest. 379 # therefore the fastest.
425 baserevisionsize = rawsizefn(baserev) 428 baserevisionsize = rawsizefn(baserev)
426 else: 429 else:
427 baserevisionsize = len(store.revision(baserev, 430 baserevisionsize = len(store.revision(baserev,
428 raw=True)) 431 raw=True))
429 432
430 elif baserev == nullrev and not deltaprevious: 433 elif (baserev == nullrev
434 and deltamode != repository.CG_DELTAMODE_PREV):
431 revision = store.revision(node, raw=True) 435 revision = store.revision(node, raw=True)
432 available.add(rev) 436 available.add(rev)
433 else: 437 else:
434 if revdifffn: 438 if revdifffn:
435 delta = revdifffn(baserev, rev) 439 delta = revdifffn(baserev, rev)