--- a/mercurial/utils/storageutil.py Mon Nov 28 16:27:23 2022 +0100
+++ b/mercurial/utils/storageutil.py Thu Nov 24 04:04:19 2022 +0100
@@ -460,14 +460,29 @@
debug_delta_source = "storage"
baserev = deltaparentrev
else:
+ if deltaparentrev != nullrev and debug_info is not None:
+ debug_info['denied-base-not-available'] += 1
# No guarantee the receiver has the delta parent, or Storage has a
# fulltext revision.
#
- # Send delta against last revision (if possible), which in the
- # common case should be similar enough to this revision that the
- # delta is reasonable.
- if deltaparentrev != nullrev and debug_info is not None:
- debug_info['denied-base-not-available'] += 1
+ # We compute a delta on the fly to send over the wire.
+ #
+ # We start with a try against p1, which in the common case should
+ # be close to this revision content.
+ #
+ # note: we could optimize between p1 and p2 in merges cases.
+ elif is_usable_base(p1rev):
+ if debug_info is not None:
+ debug_delta_source = "p1"
+ baserev = p1rev
+ # if p1 was not an option, try p2
+ elif is_usable_base(p2rev):
+ if debug_info is not None:
+ debug_delta_source = "p2"
+ baserev = p2rev
+ # Send delta against prev in despair
+ #
+ # using the closest available ancestors first might be better?
elif prevrev is not None:
if debug_info is not None:
debug_delta_source = "prev"