Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revset.py @ 32819:3e6f9bff7e3f
revset: filter first/last members by __and__ operation
This replaces 'if y in subset' with '& subset'. first(null) and last(wdir())
are fixed thanks to fullreposet.__and__.
This also revealed that first() and last() don't follow the order of the
input set. 'ls & subset' is valid only if the ordering requirement is 'define'
or 'any'.
No performance regression observed:
revset #0: limit(0:9999, 100, 9000)
0) 0.001164
1) 0.001135
revset #2: 9000 & limit(0:9999, 100, 9000)
0) 0.001224
1) 0.001181
revset #3: last(0:9999, 100)
0) 0.000237
1) 0.000199
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sat, 10 Jun 2017 19:41:42 +0900 |
parents | b36ec65ea583 |
children | 348b491c0934 |
comparison
equal
deleted
inserted
replaced
32818:b36ec65ea583 | 32819:3e6f9bff7e3f |
---|---|
1177 break | 1177 break |
1178 for x in xrange(lim): | 1178 for x in xrange(lim): |
1179 y = next(it, None) | 1179 y = next(it, None) |
1180 if y is None: | 1180 if y is None: |
1181 break | 1181 break |
1182 elif y in subset: | 1182 result.append(y) |
1183 result.append(y) | 1183 ls = baseset(result, datarepr=('<limit n=%d, offset=%d, %r>', lim, ofs, os)) |
1184 return baseset(result, datarepr=('<limit n=%d, offset=%d, %r, %r>', | 1184 return ls & subset |
1185 lim, ofs, subset, os)) | |
1186 | 1185 |
1187 @predicate('last(set, [n])', safe=True) | 1186 @predicate('last(set, [n])', safe=True) |
1188 def last(repo, subset, x): | 1187 def last(repo, subset, x): |
1189 """Last n members of set, defaulting to 1. | 1188 """Last n members of set, defaulting to 1. |
1190 """ | 1189 """ |
1202 it = iter(os) | 1201 it = iter(os) |
1203 for x in xrange(lim): | 1202 for x in xrange(lim): |
1204 y = next(it, None) | 1203 y = next(it, None) |
1205 if y is None: | 1204 if y is None: |
1206 break | 1205 break |
1207 elif y in subset: | 1206 result.append(y) |
1208 result.append(y) | 1207 ls = baseset(result, datarepr=('<last n=%d, %r>', lim, os)) |
1209 return baseset(result[::-1], datarepr=('<last n=%d, %r, %r>', | 1208 ls.reverse() |
1210 lim, subset, os)) | 1209 return ls & subset |
1211 | 1210 |
1212 @predicate('max(set)', safe=True) | 1211 @predicate('max(set)', safe=True) |
1213 def maxrev(repo, subset, x): | 1212 def maxrev(repo, subset, x): |
1214 """Changeset with highest revision number in set. | 1213 """Changeset with highest revision number in set. |
1215 """ | 1214 """ |