diff -r 089755743050 -r c6888ec28e9e hgfastobs.py --- a/hgfastobs.py Tue Sep 03 21:46:50 2013 +0200 +++ b/hgfastobs.py Sat Nov 16 20:43:44 2013 -0500 @@ -24,8 +24,9 @@ from mercurial import base85 from mercurial import commands from mercurial import extensions +from mercurial import node from mercurial import obsolete -from mercurial import node +from mercurial import revset from mercurial.i18n import _ _strategies = { @@ -57,6 +58,27 @@ f = sys._getframe(4) return f.f_locals['outgoing'] + +def _precursors(repo, s): + """Precursor of a changeset""" + cs = set() + nm = repo.changelog.nodemap + markerbysubj = repo.obsstore.precursors + for r in s: + for p in markerbysubj.get(repo[r].node(), ()): + pr = nm.get(p[0]) + if pr is not None: + cs.add(pr) + return cs + +def _revsetprecursors(repo, subset, x): + s = revset.getset(repo, range(len(repo)), x) + cs = _precursors(repo, s) + return [r for r in subset if r in cs] + +revset.symbols['_fastobs_precursors'] = _revsetprecursors + + @_strategy('boxfill', default=True) def boxfill(repo, remote): """The "fill in the box" strategy from the 2.6 sprint. @@ -75,7 +97,8 @@ # kill markers for dead nodes descended from any of the precursors # of outgoing.missing. boxedges = urepo.revs( - '(descendants(precursors(%ln)) or descendants(%ln)) and hidden()', + '(descendants(_fastobs_precursors(%ln)) or ' + ' descendants(%ln)) and hidden()', outgoing.missing, outgoing.missing) transmit = [] for node in outgoing.missing: