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 |