Show More
@@ -329,6 +329,20 b' def getlist(x):' | |||||
329 | return list(x[1:]) |
|
329 | return list(x[1:]) | |
330 | return [x] |
|
330 | return [x] | |
331 |
|
331 | |||
|
332 | def getrange(x, err): | |||
|
333 | if not x: | |||
|
334 | raise error.ParseError(err) | |||
|
335 | op = x[0] | |||
|
336 | if op == 'range': | |||
|
337 | return x[1], x[2] | |||
|
338 | elif op == 'rangepre': | |||
|
339 | return None, x[1] | |||
|
340 | elif op == 'rangepost': | |||
|
341 | return x[1], None | |||
|
342 | elif op == 'rangeall': | |||
|
343 | return None, None | |||
|
344 | raise error.ParseError(err) | |||
|
345 | ||||
332 | def getargs(x, min, max, err): |
|
346 | def getargs(x, min, max, err): | |
333 | l = getlist(x) |
|
347 | l = getlist(x) | |
334 | if len(l) < min or (max >= 0 and len(l) > max): |
|
348 | if len(l) < min or (max >= 0 and len(l) > max): | |
@@ -1083,7 +1097,7 b' def _followfirst(repo, subset, x):' | |||||
1083 | # of every revisions or files revisions. |
|
1097 | # of every revisions or files revisions. | |
1084 | return _follow(repo, subset, x, '_followfirst', followfirst=True) |
|
1098 | return _follow(repo, subset, x, '_followfirst', followfirst=True) | |
1085 |
|
1099 | |||
1086 |
@predicate('followlines(file, fromline |
|
1100 | @predicate('followlines(file, fromline:toline[, startrev=.])', safe=True) | |
1087 | def followlines(repo, subset, x): |
|
1101 | def followlines(repo, subset, x): | |
1088 | """Changesets modifying `file` in line range ('fromline', 'toline'). |
|
1102 | """Changesets modifying `file` in line range ('fromline', 'toline'). | |
1089 |
|
1103 | |||
@@ -1094,8 +1108,8 b' def followlines(repo, subset, x):' | |||||
1094 | from . import context # avoid circular import issues |
|
1108 | from . import context # avoid circular import issues | |
1095 |
|
1109 | |||
1096 | args = getargsdict(x, 'followlines', 'file *lines startrev') |
|
1110 | args = getargsdict(x, 'followlines', 'file *lines startrev') | |
1097 |
if len(args['lines']) != |
|
1111 | if len(args['lines']) != 1: | |
1098 |
raise error.ParseError(_("followlines |
|
1112 | raise error.ParseError(_("followlines requires a line range")) | |
1099 |
|
1113 | |||
1100 | rev = '.' |
|
1114 | rev = '.' | |
1101 | if 'startrev' in args: |
|
1115 | if 'startrev' in args: | |
@@ -1115,8 +1129,9 b' def followlines(repo, subset, x):' | |||||
1115 | raise error.ParseError(_("followlines expects exactly one file")) |
|
1129 | raise error.ParseError(_("followlines expects exactly one file")) | |
1116 | fname = files[0] |
|
1130 | fname = files[0] | |
1117 |
|
1131 | |||
|
1132 | lr = getrange(args['lines'][0], _("followlines expects a line range")) | |||
1118 | fromline, toline = [getinteger(a, _("line range bounds must be integers")) |
|
1133 | fromline, toline = [getinteger(a, _("line range bounds must be integers")) | |
1119 |
for a in |
|
1134 | for a in lr] | |
1120 | if toline - fromline < 0: |
|
1135 | if toline - fromline < 0: | |
1121 | raise error.ParseError(_("line range must be positive")) |
|
1136 | raise error.ParseError(_("line range must be positive")) | |
1122 | if fromline < 1: |
|
1137 | if fromline < 1: |
@@ -486,43 +486,43 b' annotate removed file' | |||||
486 |
|
486 | |||
487 | Test followlines() revset |
|
487 | Test followlines() revset | |
488 |
|
488 | |||
489 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3 |
|
489 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5)' | |
490 | 16: baz:0 |
|
490 | 16: baz:0 | |
491 | 19: baz:3 |
|
491 | 19: baz:3 | |
492 | 20: baz:4 |
|
492 | 20: baz:4 | |
493 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3 |
|
493 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=20)' | |
494 | 16: baz:0 |
|
494 | 16: baz:0 | |
495 | 19: baz:3 |
|
495 | 19: baz:3 | |
496 | 20: baz:4 |
|
496 | 20: baz:4 | |
497 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3 |
|
497 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=.^)' | |
498 | 16: baz:0 |
|
498 | 16: baz:0 | |
499 | 19: baz:3 |
|
499 | 19: baz:3 | |
500 | $ printf "0\n0\n" | cat - baz > baz1 |
|
500 | $ printf "0\n0\n" | cat - baz > baz1 | |
501 | $ mv baz1 baz |
|
501 | $ mv baz1 baz | |
502 | $ hg ci -m 'added two lines with 0' |
|
502 | $ hg ci -m 'added two lines with 0' | |
503 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5 |
|
503 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)' | |
504 | 16: baz:0 |
|
504 | 16: baz:0 | |
505 | 19: baz:3 |
|
505 | 19: baz:3 | |
506 | 20: baz:4 |
|
506 | 20: baz:4 | |
507 | $ echo 6 >> baz |
|
507 | $ echo 6 >> baz | |
508 | $ hg ci -m 'added line 8' |
|
508 | $ hg ci -m 'added line 8' | |
509 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5 |
|
509 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)' | |
510 | 16: baz:0 |
|
510 | 16: baz:0 | |
511 | 19: baz:3 |
|
511 | 19: baz:3 | |
512 | 20: baz:4 |
|
512 | 20: baz:4 | |
513 | $ sed 's/3/3+/' baz > baz.new |
|
513 | $ sed 's/3/3+/' baz > baz.new | |
514 | $ mv baz.new baz |
|
514 | $ mv baz.new baz | |
515 | $ hg ci -m 'baz:3->3+' |
|
515 | $ hg ci -m 'baz:3->3+' | |
516 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5 |
|
516 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)' | |
517 | 16: baz:0 |
|
517 | 16: baz:0 | |
518 | 19: baz:3 |
|
518 | 19: baz:3 | |
519 | 20: baz:4 |
|
519 | 20: baz:4 | |
520 | 23: baz:3->3+ |
|
520 | 23: baz:3->3+ | |
521 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 1 |
|
521 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 1:2)' | |
522 | 21: added two lines with 0 |
|
522 | 21: added two lines with 0 | |
523 |
|
523 | |||
524 | file patterns are okay |
|
524 | file patterns are okay | |
525 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines("path:baz", 1 |
|
525 | $ hg log -T '{rev}: {desc}\n' -r 'followlines("path:baz", 1:2)' | |
526 | 21: added two lines with 0 |
|
526 | 21: added two lines with 0 | |
527 |
|
527 | |||
528 | renames are followed |
|
528 | renames are followed | |
@@ -530,7 +530,7 b' renames are followed' | |||||
530 | $ sed 's/4/4+/' qux > qux.new |
|
530 | $ sed 's/4/4+/' qux > qux.new | |
531 | $ mv qux.new qux |
|
531 | $ mv qux.new qux | |
532 | $ hg ci -m 'qux:4->4+' |
|
532 | $ hg ci -m 'qux:4->4+' | |
533 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5 |
|
533 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)' | |
534 | 16: baz:0 |
|
534 | 16: baz:0 | |
535 | 19: baz:3 |
|
535 | 19: baz:3 | |
536 | 20: baz:4 |
|
536 | 20: baz:4 | |
@@ -545,7 +545,7 b' merge' | |||||
545 | $ sed 's/3+/3-/' baz > baz.new |
|
545 | $ sed 's/3+/3-/' baz > baz.new | |
546 | $ mv baz.new baz |
|
546 | $ mv baz.new baz | |
547 | $ hg ci -m 'baz:3+->3-' |
|
547 | $ hg ci -m 'baz:3+->3-' | |
548 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5 |
|
548 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7)' | |
549 | 16: baz:0 |
|
549 | 16: baz:0 | |
550 | 19: baz:3 |
|
550 | 19: baz:3 | |
551 | 20: baz:4 |
|
551 | 20: baz:4 | |
@@ -556,7 +556,7 b' merge' | |||||
556 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved |
|
556 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |
557 | (branch merge, don't forget to commit) |
|
557 | (branch merge, don't forget to commit) | |
558 | $ hg ci -m merge |
|
558 | $ hg ci -m merge | |
559 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5 |
|
559 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)' | |
560 | 16: baz:0 |
|
560 | 16: baz:0 | |
561 | 19: baz:3 |
|
561 | 19: baz:3 | |
562 | 20: baz:4 |
|
562 | 20: baz:4 | |
@@ -571,7 +571,7 b' merge' | |||||
571 | (branch merge, don't forget to commit) |
|
571 | (branch merge, don't forget to commit) | |
572 | $ hg ci -m 'merge from other side' |
|
572 | $ hg ci -m 'merge from other side' | |
573 | created new head |
|
573 | created new head | |
574 |
$ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5 |
|
574 | $ hg log -T '{rev}: {desc}\n' -r 'followlines(qux, 5:7)' | |
575 | 16: baz:0 |
|
575 | 16: baz:0 | |
576 | 19: baz:3 |
|
576 | 19: baz:3 | |
577 | 20: baz:4 |
|
577 | 20: baz:4 | |
@@ -586,27 +586,33 b' check error cases' | |||||
586 | hg: parse error: followlines takes at least 1 positional arguments |
|
586 | hg: parse error: followlines takes at least 1 positional arguments | |
587 | [255] |
|
587 | [255] | |
588 | $ hg log -r 'followlines(baz)' |
|
588 | $ hg log -r 'followlines(baz)' | |
589 |
hg: parse error: followlines |
|
589 | hg: parse error: followlines requires a line range | |
590 | [255] |
|
590 | [255] | |
591 | $ hg log -r 'followlines(baz, 1)' |
|
591 | $ hg log -r 'followlines(baz, 1)' | |
592 |
hg: parse error: followlines |
|
592 | hg: parse error: followlines expects a line range | |
593 | [255] |
|
593 | [255] | |
594 |
$ hg log -r 'followlines(baz, 1 |
|
594 | $ hg log -r 'followlines(baz, 1:2, startrev=desc("b"))' | |
595 | hg: parse error: followlines expects exactly one revision |
|
595 | hg: parse error: followlines expects exactly one revision | |
596 | [255] |
|
596 | [255] | |
597 |
$ hg log -r 'followlines("glob:*", 1 |
|
597 | $ hg log -r 'followlines("glob:*", 1:2)' | |
598 | hg: parse error: followlines expects exactly one file |
|
598 | hg: parse error: followlines expects exactly one file | |
599 | [255] |
|
599 | [255] | |
600 |
$ hg log -r 'followlines(baz, |
|
600 | $ hg log -r 'followlines(baz, 1:)' | |
|
601 | hg: parse error: line range bounds must be integers | |||
|
602 | [255] | |||
|
603 | $ hg log -r 'followlines(baz, :1)' | |||
601 | hg: parse error: line range bounds must be integers |
|
604 | hg: parse error: line range bounds must be integers | |
602 | [255] |
|
605 | [255] | |
603 |
$ hg log -r 'followlines(baz, |
|
606 | $ hg log -r 'followlines(baz, x:4)' | |
|
607 | hg: parse error: line range bounds must be integers | |||
|
608 | [255] | |||
|
609 | $ hg log -r 'followlines(baz, 5:4)' | |||
604 | hg: parse error: line range must be positive |
|
610 | hg: parse error: line range must be positive | |
605 | [255] |
|
611 | [255] | |
606 |
$ hg log -r 'followlines(baz, 0 |
|
612 | $ hg log -r 'followlines(baz, 0:4)' | |
607 | hg: parse error: fromline must be strictly positive |
|
613 | hg: parse error: fromline must be strictly positive | |
608 | [255] |
|
614 | [255] | |
609 |
$ hg log -r 'followlines(baz, 2 |
|
615 | $ hg log -r 'followlines(baz, 2:40)' | |
610 | abort: line range exceeds file size |
|
616 | abort: line range exceeds file size | |
611 | [255] |
|
617 | [255] | |
612 |
|
618 |
General Comments 0
You need to be logged in to leave comments.
Login now