Mercurial > hg
comparison mercurial/hgweb/webutil.py @ 37990:c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Bare generator can't be restarted.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Wed, 04 Apr 2018 00:08:10 +0900 |
parents | 53b0a51aed72 |
children | 4e407c7b1fbd |
comparison
equal
deleted
inserted
replaced
37989:53b0a51aed72 | 37990:c0ccbf4fbe47 |
---|---|
573 def diffs(web, ctx, basectx, files, style, linerange=None, lineidprefix=''): | 573 def diffs(web, ctx, basectx, files, style, linerange=None, lineidprefix=''): |
574 args = (web.repo, ctx, basectx, files, style, web.stripecount, | 574 args = (web.repo, ctx, basectx, files, style, web.stripecount, |
575 linerange, lineidprefix) | 575 linerange, lineidprefix) |
576 return templateutil.mappinggenerator(_diffsgen, args=args, name='diffblock') | 576 return templateutil.mappinggenerator(_diffsgen, args=args, name='diffblock') |
577 | 577 |
578 def _compline(tmpl, type, leftlineno, leftline, rightlineno, rightline): | 578 def _compline(type, leftlineno, leftline, rightlineno, rightline): |
579 lineid = leftlineno and ("l%d" % leftlineno) or '' | 579 lineid = leftlineno and ("l%d" % leftlineno) or '' |
580 lineid += rightlineno and ("r%d" % rightlineno) or '' | 580 lineid += rightlineno and ("r%d" % rightlineno) or '' |
581 llno = '%d' % leftlineno if leftlineno else '' | 581 llno = '%d' % leftlineno if leftlineno else '' |
582 rlno = '%d' % rightlineno if rightlineno else '' | 582 rlno = '%d' % rightlineno if rightlineno else '' |
583 return tmpl.generate('comparisonline', { | 583 return { |
584 'type': type, | 584 'type': type, |
585 'lineid': lineid, | 585 'lineid': lineid, |
586 'leftlineno': leftlineno, | 586 'leftlineno': leftlineno, |
587 'leftlinenumber': "% 6s" % llno, | 587 'leftlinenumber': "% 6s" % llno, |
588 'leftline': leftline or '', | 588 'leftline': leftline or '', |
589 'rightlineno': rightlineno, | 589 'rightlineno': rightlineno, |
590 'rightlinenumber': "% 6s" % rlno, | 590 'rightlinenumber': "% 6s" % rlno, |
591 'rightline': rightline or '', | 591 'rightline': rightline or '', |
592 }) | 592 } |
593 | 593 |
594 def _getcompblock(tmpl, leftlines, rightlines, opcodes): | 594 def _getcompblockgen(context, leftlines, rightlines, opcodes): |
595 for type, llo, lhi, rlo, rhi in opcodes: | 595 for type, llo, lhi, rlo, rhi in opcodes: |
596 len1 = lhi - llo | 596 len1 = lhi - llo |
597 len2 = rhi - rlo | 597 len2 = rhi - rlo |
598 count = min(len1, len2) | 598 count = min(len1, len2) |
599 for i in xrange(count): | 599 for i in xrange(count): |
600 yield _compline(tmpl, | 600 yield _compline(type=type, |
601 type=type, | |
602 leftlineno=llo + i + 1, | 601 leftlineno=llo + i + 1, |
603 leftline=leftlines[llo + i], | 602 leftline=leftlines[llo + i], |
604 rightlineno=rlo + i + 1, | 603 rightlineno=rlo + i + 1, |
605 rightline=rightlines[rlo + i]) | 604 rightline=rightlines[rlo + i]) |
606 if len1 > len2: | 605 if len1 > len2: |
607 for i in xrange(llo + count, lhi): | 606 for i in xrange(llo + count, lhi): |
608 yield _compline(tmpl, | 607 yield _compline(type=type, |
609 type=type, | |
610 leftlineno=i + 1, | 608 leftlineno=i + 1, |
611 leftline=leftlines[i], | 609 leftline=leftlines[i], |
612 rightlineno=None, | 610 rightlineno=None, |
613 rightline=None) | 611 rightline=None) |
614 elif len2 > len1: | 612 elif len2 > len1: |
615 for i in xrange(rlo + count, rhi): | 613 for i in xrange(rlo + count, rhi): |
616 yield _compline(tmpl, | 614 yield _compline(type=type, |
617 type=type, | |
618 leftlineno=None, | 615 leftlineno=None, |
619 leftline=None, | 616 leftline=None, |
620 rightlineno=i + 1, | 617 rightlineno=i + 1, |
621 rightline=rightlines[i]) | 618 rightline=rightlines[i]) |
622 | 619 |
620 def _getcompblock(leftlines, rightlines, opcodes): | |
621 args = (leftlines, rightlines, opcodes) | |
622 return templateutil.mappinggenerator(_getcompblockgen, args=args, | |
623 name='comparisonline') | |
624 | |
623 def compare(tmpl, context, leftlines, rightlines): | 625 def compare(tmpl, context, leftlines, rightlines): |
624 '''Generator function that provides side-by-side comparison data.''' | 626 '''Generator function that provides side-by-side comparison data.''' |
625 s = difflib.SequenceMatcher(None, leftlines, rightlines) | 627 s = difflib.SequenceMatcher(None, leftlines, rightlines) |
626 if context < 0: | 628 if context < 0: |
627 l = _getcompblock(tmpl, leftlines, rightlines, s.get_opcodes()) | 629 l = _getcompblock(leftlines, rightlines, s.get_opcodes()) |
628 yield tmpl.generate('comparisonblock', {'lines': l}) | 630 yield tmpl.generate('comparisonblock', {'lines': l}) |
629 else: | 631 else: |
630 for oc in s.get_grouped_opcodes(n=context): | 632 for oc in s.get_grouped_opcodes(n=context): |
631 l = _getcompblock(tmpl, leftlines, rightlines, oc) | 633 l = _getcompblock(leftlines, rightlines, oc) |
632 yield tmpl.generate('comparisonblock', {'lines': l}) | 634 yield tmpl.generate('comparisonblock', {'lines': l}) |
633 | 635 |
634 def diffstatgen(ctx, basectx): | 636 def diffstatgen(ctx, basectx): |
635 '''Generator function that provides the diffstat data.''' | 637 '''Generator function that provides the diffstat data.''' |
636 | 638 |