Mercurial > public > mercurial-scm > hg-stable
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 """ |