# HG changeset patch # User Pierre-Yves David # Date 1703853308 -3600 # Node ID d0d869fccd20e4cba65d8e268ff98f68390e181d # Parent 0d92d62ecde058d29eceb247f8a955c446dc3dc2 delta-find: move away from the generator API for _DeltaSearch We use more explicit function call. This make operations more explicit and will make future refactoring simpler. diff -r 0d92d62ecde0 -r d0d869fccd20 mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py Thu Nov 23 21:13:14 2023 +0100 +++ b/mercurial/revlogutils/deltas.py Fri Dec 29 13:35:08 2023 +0100 @@ -633,7 +633,31 @@ self.tested = {nullrev} - def candidate_groups(self): + self._candidates_iterator = self._candidate_groups() + self._last_good = None + self.current_group = self._candidates_iterator.send(self._last_good) + + @property + def done(self): + """True when all possible candidate have been tested""" + return self.current_group is None + + def next_group(self, good_delta=None): + """move to the next group to test + + The group of revision to test will be available in + `self.current_group`. If the previous group had any good delta, the + best one can be passed as the `good_delta` parameter to help selecting + the next group. + + If not revision remains to be, `self.done` will be True and + `self.current_group` will be None. + """ + if good_delta is not None: + self._last_good = good_delta.base + self.current_group = self._candidates_iterator.send(self._last_good) + + def _candidate_groups(self): """Provides group of revision to be tested as delta base This top level function focus on emitting groups with unique and @@ -1443,9 +1467,12 @@ snapshot_cache=self._snapshot_cache, ) - groups = search.candidate_groups() - candidaterevs = next(groups) - while candidaterevs is not None: + while not search.done: + current_group = search.current_group + # current_group can be `None`, but not is search.done is False + # We add this assert to help pytype + assert current_group is not None + candidaterevs = current_group dbg_try_rounds += 1 if self._debug_search: prev = None @@ -1537,10 +1564,7 @@ self._write_debug(msg) if nominateddeltas: deltainfo = min(nominateddeltas, key=lambda x: x.deltalen) - if deltainfo is not None: - candidaterevs = groups.send(deltainfo.base) - else: - candidaterevs = next(groups) + search.next_group(deltainfo) if deltainfo is None: dbg_type = b"full"