310 def getstring(x, err): |
310 def getstring(x, err): |
311 if x and (x[0] == 'string' or x[0] == 'symbol'): |
311 if x and (x[0] == 'string' or x[0] == 'symbol'): |
312 return x[1] |
312 return x[1] |
313 raise error.ParseError(err) |
313 raise error.ParseError(err) |
314 |
314 |
|
315 def getinteger(x, err): |
|
316 try: |
|
317 return int(getstring(x, err)) |
|
318 except ValueError: |
|
319 raise error.ParseError(err) |
|
320 |
315 def getlist(x): |
321 def getlist(x): |
316 if not x: |
322 if not x: |
317 return [] |
323 return [] |
318 if x[0] == 'list': |
324 if x[0] == 'list': |
319 return list(x[1:]) |
325 return list(x[1:]) |
537 def ancestorspec(repo, subset, x, n, order): |
543 def ancestorspec(repo, subset, x, n, order): |
538 """``set~n`` |
544 """``set~n`` |
539 Changesets that are the Nth ancestor (first parents only) of a changeset |
545 Changesets that are the Nth ancestor (first parents only) of a changeset |
540 in set. |
546 in set. |
541 """ |
547 """ |
542 try: |
548 n = getinteger(n, _("~ expects a number")) |
543 n = int(n[1]) |
|
544 except (TypeError, ValueError): |
|
545 raise error.ParseError(_("~ expects a number")) |
|
546 ps = set() |
549 ps = set() |
547 cl = repo.changelog |
550 cl = repo.changelog |
548 for r in getset(repo, fullreposet(repo), x): |
551 for r in getset(repo, fullreposet(repo), x): |
549 for i in range(n): |
552 for i in range(n): |
550 r = cl.parentrevs(r)[0] |
553 r = cl.parentrevs(r)[0] |
1096 files = [f for f in repo[rev] if m(f)] |
1099 files = [f for f in repo[rev] if m(f)] |
1097 if len(files) != 1: |
1100 if len(files) != 1: |
1098 raise error.ParseError(_("followlines expects exactly one file")) |
1101 raise error.ParseError(_("followlines expects exactly one file")) |
1099 fname = files[0] |
1102 fname = files[0] |
1100 |
1103 |
1101 try: |
1104 fromline, toline = [getinteger(a, _("line range bounds must be integers")) |
1102 fromline, toline = [int(getsymbol(a)) for a in args['lines']] |
1105 for a in args['lines']] |
1103 except ValueError: |
|
1104 raise error.ParseError(_("line range bounds must be integers")) |
|
1105 if toline - fromline < 0: |
1106 if toline - fromline < 0: |
1106 raise error.ParseError(_("line range must be positive")) |
1107 raise error.ParseError(_("line range must be positive")) |
1107 if fromline < 1: |
1108 if fromline < 1: |
1108 raise error.ParseError(_("fromline must be strictly positive")) |
1109 raise error.ParseError(_("fromline must be strictly positive")) |
1109 fromline -= 1 |
1110 fromline -= 1 |
1271 """ |
1272 """ |
1272 args = getargsdict(x, 'limit', 'set n offset') |
1273 args = getargsdict(x, 'limit', 'set n offset') |
1273 if 'set' not in args: |
1274 if 'set' not in args: |
1274 # i18n: "limit" is a keyword |
1275 # i18n: "limit" is a keyword |
1275 raise error.ParseError(_("limit requires one to three arguments")) |
1276 raise error.ParseError(_("limit requires one to three arguments")) |
1276 try: |
1277 lim, ofs = 1, 0 |
1277 lim, ofs = 1, 0 |
1278 if 'n' in args: |
1278 if 'n' in args: |
|
1279 # i18n: "limit" is a keyword |
|
1280 lim = int(getstring(args['n'], _("limit requires a number"))) |
|
1281 if 'offset' in args: |
|
1282 # i18n: "limit" is a keyword |
|
1283 ofs = int(getstring(args['offset'], _("limit requires a number"))) |
|
1284 if ofs < 0: |
|
1285 raise error.ParseError(_("negative offset")) |
|
1286 except (TypeError, ValueError): |
|
1287 # i18n: "limit" is a keyword |
1279 # i18n: "limit" is a keyword |
1288 raise error.ParseError(_("limit expects a number")) |
1280 lim = getinteger(args['n'], _("limit expects a number")) |
|
1281 if 'offset' in args: |
|
1282 # i18n: "limit" is a keyword |
|
1283 ofs = getinteger(args['offset'], _("limit expects a number")) |
|
1284 if ofs < 0: |
|
1285 raise error.ParseError(_("negative offset")) |
1289 os = getset(repo, fullreposet(repo), args['set']) |
1286 os = getset(repo, fullreposet(repo), args['set']) |
1290 result = [] |
1287 result = [] |
1291 it = iter(os) |
1288 it = iter(os) |
1292 for x in xrange(ofs): |
1289 for x in xrange(ofs): |
1293 y = next(it, None) |
1290 y = next(it, None) |
1306 def last(repo, subset, x): |
1303 def last(repo, subset, x): |
1307 """Last n members of set, defaulting to 1. |
1304 """Last n members of set, defaulting to 1. |
1308 """ |
1305 """ |
1309 # i18n: "last" is a keyword |
1306 # i18n: "last" is a keyword |
1310 l = getargs(x, 1, 2, _("last requires one or two arguments")) |
1307 l = getargs(x, 1, 2, _("last requires one or two arguments")) |
1311 try: |
1308 lim = 1 |
1312 lim = 1 |
1309 if len(l) == 2: |
1313 if len(l) == 2: |
|
1314 # i18n: "last" is a keyword |
|
1315 lim = int(getstring(l[1], _("last requires a number"))) |
|
1316 except (TypeError, ValueError): |
|
1317 # i18n: "last" is a keyword |
1310 # i18n: "last" is a keyword |
1318 raise error.ParseError(_("last expects a number")) |
1311 lim = getinteger(l[1], _("last expects a number")) |
1319 os = getset(repo, fullreposet(repo), l[0]) |
1312 os = getset(repo, fullreposet(repo), l[0]) |
1320 os.reverse() |
1313 os.reverse() |
1321 result = [] |
1314 result = [] |
1322 it = iter(os) |
1315 it = iter(os) |
1323 for x in xrange(lim): |
1316 for x in xrange(lim): |