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