388 if deltamode == repository.CG_DELTAMODE_PREV or assumehaveparentrevisions: |
388 if deltamode == repository.CG_DELTAMODE_PREV or assumehaveparentrevisions: |
389 prevrev = store.parentrevs(revs[0])[0] |
389 prevrev = store.parentrevs(revs[0])[0] |
390 |
390 |
391 # Set of revs available to delta against. |
391 # Set of revs available to delta against. |
392 available = set() |
392 available = set() |
|
393 parents = [] |
393 |
394 |
394 def is_usable_base(rev): |
395 def is_usable_base(rev): |
395 return rev != nullrev and rev in available |
396 """Is a delta against this revision usable over the wire""" |
|
397 if rev == nullrev: |
|
398 return False |
|
399 # Base revision was already emitted in this group. |
|
400 if rev in available: |
|
401 return True |
|
402 # Base revision is a parent that hasn't been emitted already. |
|
403 if assumehaveparentrevisions and rev in parents: |
|
404 return True |
|
405 return False |
396 |
406 |
397 for rev in revs: |
407 for rev in revs: |
398 if rev == nullrev: |
408 if rev == nullrev: |
399 continue |
409 continue |
400 |
410 |
401 node = fnode(rev) |
411 node = fnode(rev) |
402 p1rev, p2rev = store.parentrevs(rev) |
412 parents[:] = p1rev, p2rev = store.parentrevs(rev) |
403 |
413 |
404 if deltaparentfn: |
414 if deltaparentfn: |
405 deltaparentrev = deltaparentfn(rev) |
415 deltaparentrev = deltaparentfn(rev) |
406 else: |
416 else: |
407 deltaparentrev = nullrev |
417 deltaparentrev = nullrev |
419 |
429 |
420 # There is a delta in storage. We try to use that because it |
430 # There is a delta in storage. We try to use that because it |
421 # amounts to effectively copying data from storage and is |
431 # amounts to effectively copying data from storage and is |
422 # therefore the fastest. |
432 # therefore the fastest. |
423 elif deltaparentrev != nullrev: |
433 elif deltaparentrev != nullrev: |
424 # Base revision was already emitted in this group. We can |
434 # If the stored delta works, let us use it ! |
425 # always safely use the delta. |
|
426 if is_usable_base(deltaparentrev): |
435 if is_usable_base(deltaparentrev): |
427 baserev = deltaparentrev |
436 baserev = deltaparentrev |
428 |
|
429 # Base revision is a parent that hasn't been emitted already. |
|
430 # Use it if we can assume the receiver has the parent revision. |
|
431 elif assumehaveparentrevisions and deltaparentrev in (p1rev, p2rev): |
|
432 baserev = deltaparentrev |
|
433 |
|
434 # No guarantee the receiver has the delta parent. Send delta |
437 # No guarantee the receiver has the delta parent. Send delta |
435 # against last revision (if possible), which in the common case |
438 # against last revision (if possible), which in the common case |
436 # should be similar enough to this revision that the delta is |
439 # should be similar enough to this revision that the delta is |
437 # reasonable. |
440 # reasonable. |
438 elif prevrev is not None: |
441 elif prevrev is not None: |