mercurial/hgweb/webutil.py
changeset 37988 406f945c5814
parent 37987 8cc23a46df37
child 37989 53b0a51aed72
equal deleted inserted replaced
37987:8cc23a46df37 37988:406f945c5814
   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())})