comparison mercurial/revset.py @ 20534:4849f574aa24

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
author Lucas Moscovicz <lmoscovicz@fb.com>
date Wed, 19 Feb 2014 12:56:41 -0800
parents bde426f18e0a
children 532b114a6e02
comparison
equal deleted inserted replaced
20533:87e52e642562 20534:4849f574aa24
970 lim = int(getstring(l[1], _("last requires a number"))) 970 lim = int(getstring(l[1], _("last requires a number")))
971 except (TypeError, ValueError): 971 except (TypeError, ValueError):
972 # i18n: "last" is a keyword 972 # i18n: "last" is a keyword
973 raise error.ParseError(_("last expects a number")) 973 raise error.ParseError(_("last expects a number"))
974 ss = subset.set() 974 ss = subset.set()
975 os = getset(repo, spanset(repo), l[0])[-lim:] 975 os = getset(repo, spanset(repo), l[0])
976 return baseset([r for r in os if r in ss]) 976 os.reverse()
977 bs = baseset([])
978 it = iter(os)
979 for x in xrange(lim):
980 try:
981 y = it.next()
982 if y in ss:
983 bs.append(y)
984 except (StopIteration):
985 break
986 return bs
977 987
978 def maxrev(repo, subset, x): 988 def maxrev(repo, subset, x):
979 """``max(set)`` 989 """``max(set)``
980 Changeset with highest revision number in set. 990 Changeset with highest revision number in set.
981 """ 991 """