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