Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/utils/storageutil.py @ 40495: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
40494:5e5c8f2a1eb5 | 40495: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) |