# HG changeset patch # User Yuya Nishihara # Date 2016-09-22 09:23:58 # Node ID 205c3c6c1a514d85b3a135e3515ce1a76206e8ac # Parent b4b328ea6175180a565ff20c98e5d156cdf6198e dagop: extend filectxancestors() to walk multiple files diff --git a/mercurial/dagop.py b/mercurial/dagop.py --- a/mercurial/dagop.py +++ b/mercurial/dagop.py @@ -75,8 +75,9 @@ def _walkrevtree(pfunc, revs, startdepth if prev != node.nullrev: heapq.heappush(pendingheap, (heapsign * prev, pdepth)) -def filectxancestors(fctx, followfirst=False): - """Like filectx.ancestors(), but includes the given fctx itself""" +def filectxancestors(fctxs, followfirst=False): + """Like filectx.ancestors(), but can walk from multiple files/revisions, + and includes the given fctxs themselves""" visit = {} def addvisit(fctx): rev = fctx.rev() @@ -89,7 +90,8 @@ def filectxancestors(fctx, followfirst=F else: cut = None - addvisit(fctx) + for c in fctxs: + addvisit(c) while visit: rev = max(visit) c = visit[rev].pop() diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -927,11 +927,9 @@ def _follow(repo, subset, x, name, follo files = c.manifest().walk(matcher) - s = set() - for fname in files: - fctx = c[fname].introfilectx() - a = dagop.filectxancestors(fctx, followfirst) - s = s.union(set(c.rev() for c in a)) + fctxs = [c[f].introfilectx() for f in files] + a = dagop.filectxancestors(fctxs, followfirst) + s = set(c.rev() for c in a) else: s = dagop.revancestors(repo, baseset([c.rev()]), followfirst)