# HG changeset patch # User Lucas Moscovicz # Date 2014-02-19 20:56:41 # Node ID 4849f574aa24b6619e0613d3b6e9f04f54447bc4 # Parent 87e52e6425625ea4f7645cfe2fc491a21f9a6b51 revset: changed last implementation to use lazy classes Instead of using getitem just reverse the revision list and get the first 'lim' elements. With classes like spanset which are easily reversible this will work faster. Performance Benchmarking: $ time hg log -qr "last(all())" ... real 0m0.569s user 0m0.447s sys 0m0.122s $ time ./hg log -qr "last(all())" ... real 0m0.215s user 0m0.150s sys 0m0.063s diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -972,8 +972,18 @@ def last(repo, subset, x): # i18n: "last" is a keyword raise error.ParseError(_("last expects a number")) ss = subset.set() - os = getset(repo, spanset(repo), l[0])[-lim:] - return baseset([r for r in os if r in ss]) + os = getset(repo, spanset(repo), l[0]) + os.reverse() + bs = baseset([]) + it = iter(os) + for x in xrange(lim): + try: + y = it.next() + if y in ss: + bs.append(y) + except (StopIteration): + break + return bs def maxrev(repo, subset, x): """``max(set)``