mercurial/utils/storageutil.py
changeset 49672 e92de86cf4f8
parent 49670 2fd8750f3722
child 49777 e1953a34c110
--- a/mercurial/utils/storageutil.py	Wed Nov 09 13:54:15 2022 -0500
+++ b/mercurial/utils/storageutil.py	Sat Nov 12 00:18:41 2022 +0100
@@ -379,6 +379,7 @@
 
     fnode = store.node
     frev = store.rev
+    parents = store.parentrevs
 
     if nodesorder == b'nodes':
         revs = [frev(n) for n in nodes]
@@ -391,23 +392,21 @@
     prevrev = None
 
     if deltamode == repository.CG_DELTAMODE_PREV or assumehaveparentrevisions:
-        prevrev = store.parentrevs(revs[0])[0]
+        prevrev = parents(revs[0])[0]
 
-    # Set of revs available to delta against.
+    # Sets of revs available to delta against.
+    emitted = set()
     available = set()
-    parents = []
+    if assumehaveparentrevisions:
+        common_heads = set(p for r in revs for p in parents(r))
+        common_heads.difference_update(revs)
+        available = store.ancestors(common_heads, inclusive=True)
 
     def is_usable_base(rev):
         """Is a delta against this revision usable over the wire"""
         if rev == nullrev:
             return False
-        # Base revision was already emitted in this group.
-        if rev in available:
-            return True
-        # Base revision is a parent that hasn't been emitted already.
-        if assumehaveparentrevisions and rev in parents:
-            return True
-        return False
+        return rev in emitted or rev in available
 
     for rev in revs:
         if rev == nullrev:
@@ -418,7 +417,7 @@
             debug_info['revision-total'] += 1
 
         node = fnode(rev)
-        parents[:] = p1rev, p2rev = store.parentrevs(rev)
+        p1rev, p2rev = parents(rev)
 
         if debug_info is not None:
             if p1rev != p2rev and p1rev != nullrev and p2rev != nullrev:
@@ -531,7 +530,7 @@
                     debug_info['computed-delta'] += 1  # close enough
                     debug_info['delta-full'] += 1
                 revision = store.rawdata(node)
-                available.add(rev)
+                emitted.add(rev)
             else:
                 if revdifffn:
                     if debug_info is not None:
@@ -571,7 +570,7 @@
                         store.rawdata(baserev), store.rawdata(rev)
                     )
 
-                available.add(rev)
+                emitted.add(rev)
 
         serialized_sidedata = None
         sidedata_flags = (0, 0)