comparison mercurial/revset.py @ 32819:4710cc4dac99

smartset: extract method to slice abstractsmartset Sub classes can provide optimized implementations.
author Yuya Nishihara <yuya@tcha.org>
date Tue, 24 Mar 2015 00:14:53 +0900
parents 348b491c0934
children 8e02829bec61
comparison
equal deleted inserted replaced
32818:9ddb18ae342e 32819:4710cc4dac99
1167 # i18n: "limit" is a keyword 1167 # i18n: "limit" is a keyword
1168 ofs = getinteger(args.get('offset'), _("limit expects a number"), default=0) 1168 ofs = getinteger(args.get('offset'), _("limit expects a number"), default=0)
1169 if ofs < 0: 1169 if ofs < 0:
1170 raise error.ParseError(_("negative offset")) 1170 raise error.ParseError(_("negative offset"))
1171 os = getset(repo, fullreposet(repo), args['set']) 1171 os = getset(repo, fullreposet(repo), args['set'])
1172 result = [] 1172 ls = os.slice(ofs, ofs + lim)
1173 it = iter(os)
1174 for x in xrange(ofs):
1175 y = next(it, None)
1176 if y is None:
1177 break
1178 for x in xrange(lim):
1179 y = next(it, None)
1180 if y is None:
1181 break
1182 result.append(y)
1183 ls = baseset(result, datarepr=('<limit n=%d, offset=%d, %r>', lim, ofs, os))
1184 if order == followorder and lim > 1: 1173 if order == followorder and lim > 1:
1185 return subset & ls 1174 return subset & ls
1186 return ls & subset 1175 return ls & subset
1187 1176
1188 @predicate('last(set, [n])', safe=True, takeorder=True) 1177 @predicate('last(set, [n])', safe=True, takeorder=True)
1197 lim = getinteger(l[1], _("last expects a number")) 1186 lim = getinteger(l[1], _("last expects a number"))
1198 if lim < 0: 1187 if lim < 0:
1199 raise error.ParseError(_("negative number to select")) 1188 raise error.ParseError(_("negative number to select"))
1200 os = getset(repo, fullreposet(repo), l[0]) 1189 os = getset(repo, fullreposet(repo), l[0])
1201 os.reverse() 1190 os.reverse()
1202 result = [] 1191 ls = os.slice(0, lim)
1203 it = iter(os)
1204 for x in xrange(lim):
1205 y = next(it, None)
1206 if y is None:
1207 break
1208 result.append(y)
1209 ls = baseset(result, datarepr=('<last n=%d, %r>', lim, os))
1210 if order == followorder and lim > 1: 1192 if order == followorder and lim > 1:
1211 return subset & ls 1193 return subset & ls
1212 ls.reverse() 1194 ls.reverse()
1213 return ls & subset 1195 return ls & subset
1214 1196