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): |
|
579 lineid = leftlineno and ("l%d" % leftlineno) or '' |
|
580 lineid += rightlineno and ("r%d" % rightlineno) or '' |
|
581 llno = '%d' % leftlineno if leftlineno else '' |
|
582 rlno = '%d' % rightlineno if rightlineno else '' |
|
583 return tmpl.generate('comparisonline', { |
|
584 'type': type, |
|
585 'lineid': lineid, |
|
586 'leftlineno': leftlineno, |
|
587 'leftlinenumber': "% 6s" % llno, |
|
588 'leftline': leftline or '', |
|
589 'rightlineno': rightlineno, |
|
590 'rightlinenumber': "% 6s" % rlno, |
|
591 'rightline': rightline or '', |
|
592 }) |
|
593 |
578 def compare(tmpl, context, leftlines, rightlines): |
594 def compare(tmpl, context, leftlines, rightlines): |
579 '''Generator function that provides side-by-side comparison data.''' |
595 '''Generator function that provides side-by-side comparison data.''' |
580 |
|
581 def compline(type, leftlineno, leftline, rightlineno, rightline): |
|
582 lineid = leftlineno and ("l%d" % leftlineno) or '' |
|
583 lineid += rightlineno and ("r%d" % rightlineno) or '' |
|
584 llno = '%d' % leftlineno if leftlineno else '' |
|
585 rlno = '%d' % rightlineno if rightlineno else '' |
|
586 return tmpl.generate('comparisonline', { |
|
587 'type': type, |
|
588 'lineid': lineid, |
|
589 'leftlineno': leftlineno, |
|
590 'leftlinenumber': "% 6s" % llno, |
|
591 'leftline': leftline or '', |
|
592 'rightlineno': rightlineno, |
|
593 'rightlinenumber': "% 6s" % rlno, |
|
594 'rightline': rightline or '', |
|
595 }) |
|
596 |
596 |
597 def getblock(opcodes): |
597 def getblock(opcodes): |
598 for type, llo, lhi, rlo, rhi in opcodes: |
598 for type, llo, lhi, rlo, rhi in opcodes: |
599 len1 = lhi - llo |
599 len1 = lhi - llo |
600 len2 = rhi - rlo |
600 len2 = rhi - rlo |
601 count = min(len1, len2) |
601 count = min(len1, len2) |
602 for i in xrange(count): |
602 for i in xrange(count): |
603 yield compline(type=type, |
603 yield _compline(tmpl, |
604 leftlineno=llo + i + 1, |
604 type=type, |
605 leftline=leftlines[llo + i], |
605 leftlineno=llo + i + 1, |
606 rightlineno=rlo + i + 1, |
606 leftline=leftlines[llo + i], |
607 rightline=rightlines[rlo + i]) |
607 rightlineno=rlo + i + 1, |
|
608 rightline=rightlines[rlo + i]) |
608 if len1 > len2: |
609 if len1 > len2: |
609 for i in xrange(llo + count, lhi): |
610 for i in xrange(llo + count, lhi): |
610 yield compline(type=type, |
611 yield _compline(tmpl, |
611 leftlineno=i + 1, |
612 type=type, |
612 leftline=leftlines[i], |
613 leftlineno=i + 1, |
613 rightlineno=None, |
614 leftline=leftlines[i], |
614 rightline=None) |
615 rightlineno=None, |
|
616 rightline=None) |
615 elif len2 > len1: |
617 elif len2 > len1: |
616 for i in xrange(rlo + count, rhi): |
618 for i in xrange(rlo + count, rhi): |
617 yield compline(type=type, |
619 yield _compline(tmpl, |
618 leftlineno=None, |
620 type=type, |
619 leftline=None, |
621 leftlineno=None, |
620 rightlineno=i + 1, |
622 leftline=None, |
621 rightline=rightlines[i]) |
623 rightlineno=i + 1, |
|
624 rightline=rightlines[i]) |
622 |
625 |
623 s = difflib.SequenceMatcher(None, leftlines, rightlines) |
626 s = difflib.SequenceMatcher(None, leftlines, rightlines) |
624 if context < 0: |
627 if context < 0: |
625 yield tmpl.generate('comparisonblock', |
628 yield tmpl.generate('comparisonblock', |
626 {'lines': getblock(s.get_opcodes())}) |
629 {'lines': getblock(s.get_opcodes())}) |