##// END OF EJS Templates
revset: abuse x:y syntax to specify line range of followlines()...
Yuya Nishihara -
r30804:4227f80f default
parent child Browse files
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, toline[, startrev=.])', safe=True)
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']) != 2:
1111 if len(args['lines']) != 1:
1098 raise error.ParseError(_("followlines takes at least three arguments"))
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 args['lines']]
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, 5)'
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, 5, startrev=20)'
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, 5, startrev=.^)'
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, 7)'
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, 7)'
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, 7)'
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, 2)'
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, 2)'
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, 7)'
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, 7)'
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, 7)'
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, 7)'
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 takes at least three arguments
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 takes at least three arguments
592 hg: parse error: followlines expects a line range
593 [255]
593 [255]
594 $ hg log -r 'followlines(baz, 1, 2, startrev=desc("b"))'
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, 2)'
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, x, 4)'
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, 5, 4)'
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, 4)'
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, 40)'
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