Mercurial > hg
changeset 51336:898c212e1b2f
delta-find: move pre-filtering of individual revision in its own function
This goes one step further than the previous change by making the pre-filtering
of individual candicates revision in its own function. This will allow subclass
to easily configure this filtering with their own constrains.
The `if True:` part help the readability of this diff a lot and will be drop in
to the next changesets.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 23 Nov 2023 18:40:47 +0100 |
parents | 02cc19f4f091 |
children | ac8b798e602b |
files | mercurial/revlogutils/deltas.py |
diffstat | 1 files changed, 25 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlogutils/deltas.py Thu Nov 23 04:21:07 2023 +0100 +++ b/mercurial/revlogutils/deltas.py Thu Nov 23 18:40:47 2023 +0100 @@ -726,9 +726,7 @@ """ deltalength = self.revlog.length deltaparent = self.revlog.deltaparent - deltas_limit = self.revinfo.textlen * LIMIT_DELTA2TEXT - sparse = self.revlog.delta_config.sparse_revlog tested = self.tested group = [] for rev in temptative: @@ -736,43 +734,50 @@ while not (rev == nullrev or rev in tested or deltalength(rev)): tested.add(rev) rev = deltaparent(rev) + if self._pre_filter_rev(rev): + group.append(rev) + else: + self.tested.add(rev) + return group + + def _pre_filter_rev(self, rev): + """return True if it seems okay to test a rev, False otherwise""" + if True: # no need to try a delta against nullrev, this will be done as # a last resort. if rev == nullrev: - continue + return False # filter out revision we tested already - if rev in tested: - continue + if rev in self.tested: + return False # an higher authority deamed the base unworthy (e.g. censored) if self.excluded_bases is not None and rev in self.excluded_bases: - tested.add(rev) - continue + return False # We are in some recomputation cases and that rev is too high # in the revlog if self.target_rev is not None and rev >= self.target_rev: - tested.add(rev) - continue + return False + + deltas_limit = self.revinfo.textlen * LIMIT_DELTA2TEXT # filter out delta base that will never produce good delta # # if the delta of that base is already bigger than the limit # for the delta chain size, doing a delta is hopeless. if deltas_limit < self.revlog.length(rev): - tested.add(rev) - continue + return False + sparse = self.revlog.delta_config.sparse_revlog # if the revision we test again is too small, the resulting delta # will be large anyway as that amount of data to be added is big if sparse and self.revlog.rawsize(rev) < ( self.textlen // LIMIT_BASE2TEXT ): - tested.add(rev) - continue + return False # no delta for rawtext-changing revs (see "candelta" for why) if self.revlog.flags(rev) & REVIDX_RAWTEXT_CHANGING_FLAGS: - tested.add(rev) - continue + return False # If we reach here, we are about to build and test a delta. # The delta building process will compute the chaininfo in all @@ -784,12 +789,10 @@ self.revlog.delta_config.max_chain_len and chainlen >= self.revlog.delta_config.max_chain_len ): - tested.add(rev) - continue + return False # if chain already have too much data, skip base if deltas_limit < chainsize: - tested.add(rev) - continue + return False if sparse and self.revlog.delta_config.upper_bound_comp is not None: maxcomp = self.revlog.delta_config.upper_bound_comp basenotsnap = (self.p1, self.p2, nullrev) @@ -808,19 +811,15 @@ if snapshotlimit < lowestrealisticdeltalen: # delta lower bound is larger than accepted upper # bound - tested.add(rev) - continue + return False # check the relative constraint on the delta size revlength = self.revlog.length(rev) if revlength < lowestrealisticdeltalen: # delta probable lower bound is larger than target # base - tested.add(rev) - continue - - group.append(rev) - return group + return False + return True def _refined_groups(self): good = None