Mercurial > public > mercurial-scm > hg
comparison mercurial/revlogutils/deltas.py @ 39498:04b75f3a3f2a
snapshot: add refining logic at the findeltainfo level
Once we found a delta, we want to have the candidates logic challenge it,
searching for a better candidate.
The logic at the lower level is still missing. We'll introduce it later.
Adding small changes in individual commits make it simpler to explain the code
change.
This is another small step toward turning `_refinegroups` into a co-routine.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Fri, 07 Sep 2018 11:17:33 -0400 |
parents | 5b308a4e6d03 |
children | 51cec7fb672e |
comparison
equal
deleted
inserted
replaced
39497:5b308a4e6d03 | 39498:04b75f3a3f2a |
---|---|
580 yield None | 580 yield None |
581 return | 581 return |
582 | 582 |
583 deltalength = revlog.length | 583 deltalength = revlog.length |
584 deltaparent = revlog.deltaparent | 584 deltaparent = revlog.deltaparent |
585 good = None | |
585 | 586 |
586 deltas_limit = textlen * LIMIT_DELTA2TEXT | 587 deltas_limit = textlen * LIMIT_DELTA2TEXT |
587 | 588 |
588 tested = set([nullrev]) | 589 tested = set([nullrev]) |
589 for temptative in _refinedgroups(revlog, p1, p2, cachedelta): | 590 for temptative in _refinedgroups(revlog, p1, p2, cachedelta): |
610 group.append(rev) | 611 group.append(rev) |
611 if group: | 612 if group: |
612 # XXX: in the sparse revlog case, group can become large, | 613 # XXX: in the sparse revlog case, group can become large, |
613 # impacting performances. Some bounding or slicing mecanism | 614 # impacting performances. Some bounding or slicing mecanism |
614 # would help to reduce this impact. | 615 # would help to reduce this impact. |
615 yield tuple(group) | 616 good = yield tuple(group) |
617 if good is not None: | |
618 break | |
616 yield None | 619 yield None |
617 | 620 |
618 def _findsnapshots(revlog, cache, start_rev): | 621 def _findsnapshots(revlog, cache, start_rev): |
619 """find snapshot from start_rev to tip""" | 622 """find snapshot from start_rev to tip""" |
620 deltaparent = revlog.deltaparent | 623 deltaparent = revlog.deltaparent |
845 groups = _candidategroups(self.revlog, revinfo.textlen, | 848 groups = _candidategroups(self.revlog, revinfo.textlen, |
846 p1r, p2r, cachedelta) | 849 p1r, p2r, cachedelta) |
847 candidaterevs = next(groups) | 850 candidaterevs = next(groups) |
848 while candidaterevs is not None: | 851 while candidaterevs is not None: |
849 nominateddeltas = [] | 852 nominateddeltas = [] |
853 if deltainfo is not None: | |
854 # if we already found a good delta, | |
855 # challenge it against refined candidates | |
856 nominateddeltas.append(deltainfo) | |
850 for candidaterev in candidaterevs: | 857 for candidaterev in candidaterevs: |
851 candidatedelta = self._builddeltainfo(revinfo, candidaterev, fh) | 858 candidatedelta = self._builddeltainfo(revinfo, candidaterev, fh) |
852 if isgooddeltainfo(self.revlog, candidatedelta, revinfo): | 859 if isgooddeltainfo(self.revlog, candidatedelta, revinfo): |
853 nominateddeltas.append(candidatedelta) | 860 nominateddeltas.append(candidatedelta) |
854 if nominateddeltas: | 861 if nominateddeltas: |
855 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen) | 862 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen) |
856 break | 863 if deltainfo is not None: |
857 candidaterevs = next(groups) | 864 candidaterevs = groups.send(deltainfo.base) |
865 else: | |
866 candidaterevs = next(groups) | |
858 | 867 |
859 if deltainfo is None: | 868 if deltainfo is None: |
860 deltainfo = self._fullsnapshotinfo(fh, revinfo) | 869 deltainfo = self._fullsnapshotinfo(fh, revinfo) |
861 return deltainfo | 870 return deltainfo |