comparison mercurial/revset.py @ 32800: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
32799:b36ec65ea583 32800: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 """