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) |