mercurial/revlogutils/deltas.py
changeset 51347 555826073625
parent 51346 2a333d791ecf
child 51348 d58e14262587
--- a/mercurial/revlogutils/deltas.py	Sun Jan 07 01:05:10 2024 +0100
+++ b/mercurial/revlogutils/deltas.py	Sun Jan 07 03:34:27 2024 +0100
@@ -783,8 +783,43 @@
         pass
 
 
+class _NoDeltaSearch(_BaseDeltaSearch):
+    """Search for no delta.
+
+    This search variant is to be used in case where we should not store delta.
+    """
+
+    def _init_group(self):
+        pass
+
+    def next_group(self, good_delta=None):
+        pass
+
+
+class _PrevDeltaSearch(_BaseDeltaSearch):
+    """Search for delta against the previous revision only
+
+    This search variant is to be used when the format does not allow for delta
+    against arbitrary bases.
+    """
+
+    def _init_group(self):
+        self.current_group = [self.target_rev - 1]
+
+    def next_group(self, good_delta=None):
+        self.current_group = None
+
+
 class _DeltaSearch(_BaseDeltaSearch):
+    """Generic delta search variants
+
+    (expect this to be split further)
+    """
+
     def _init_group(self):
+        # Why search for delta base if we cannot use a delta base ?
+        # also see issue6056
+        assert self.revlog.delta_config.general_delta
         self._candidates_iterator = self._candidate_groups()
         self._last_good = None
         self.current_group = self._candidates_iterator.send(self._last_good)
@@ -801,17 +836,6 @@
         worthwhile content. See _raw_candidate_groups for details about the
         group order.
         """
-        # should we try to build a delta?
-        if not (len(self.revlog) and self.revlog._storedeltachains):
-            yield None
-            return
-
-        if not self.revlog.delta_config.general_delta:
-            # before general delta, there is only one possible delta base
-            yield (self.target_rev - 1,)
-            yield None
-            return
-
         good = None
 
         group_chunk_size = self.revlog.delta_config.candidate_group_chunk_size
@@ -1062,9 +1086,6 @@
 
         The group order aims at providing fast or small candidates first.
         """
-        # Why search for delta base if we cannot use a delta base ?
-        assert self.revlog.delta_config.general_delta
-        # also see issue6056
         sparse = self.revlog.delta_config.sparse_revlog
         prev = self.target_rev - 1
         deltachain = lambda rev: self.revlog._deltachain(rev)[0]
@@ -1548,7 +1569,16 @@
             msg %= target_rev
             self._write_debug(msg)
 
-        search = _DeltaSearch(
+        # should we try to build a delta?
+        if not (len(self.revlog) and self.revlog._storedeltachains):
+            search_cls = _NoDeltaSearch
+        elif not self.revlog.delta_config.general_delta:
+            # before general delta, there is only one possible delta base
+            search_cls = _PrevDeltaSearch
+        else:
+            search_cls = _DeltaSearch
+
+        search = search_cls(
             self.revlog,
             revinfo,
             p1r,