comparison mercurial/hgweb/webutil.py @ 37019:c97b936d8bb5

templater: use named function to expand template against mapping dict (API) And replace __call__(t, **mapping) in favor of generate(t, mapping). I prefer a named function here since the templater isn't a simple function-like object. .. api:: The templater is no longer callable. Use ``templater.generate(t, mapping)`` instead of ``templater(t, **pycompat.strkwargs(mapping))``.
author Yuya Nishihara <yuya@tcha.org>
date Fri, 16 Mar 2018 21:39:32 +0900
parents f21798a6bc20
children b235bde38a83
comparison
equal deleted inserted replaced
37018:3e74d3cc500f 37019:c97b936d8bb5
241 if branch != 'default': 241 if branch != 'default':
242 branches.append({"name": branch}) 242 branches.append({"name": branch})
243 return branches 243 return branches
244 244
245 def showtag(repo, tmpl, t1, node=nullid, **args): 245 def showtag(repo, tmpl, t1, node=nullid, **args):
246 args = pycompat.byteskwargs(args)
246 for t in repo.nodetags(node): 247 for t in repo.nodetags(node):
247 yield tmpl(t1, tag=t, **args) 248 lm = args.copy()
249 lm['tag'] = t
250 yield tmpl.generate(t1, lm)
248 251
249 def showbookmark(repo, tmpl, t1, node=nullid, **args): 252 def showbookmark(repo, tmpl, t1, node=nullid, **args):
253 args = pycompat.byteskwargs(args)
250 for t in repo.nodebookmarks(node): 254 for t in repo.nodebookmarks(node):
251 yield tmpl(t1, bookmark=t, **args) 255 lm = args.copy()
256 lm['bookmark'] = t
257 yield tmpl.generate(t1, lm)
252 258
253 def branchentries(repo, stripecount, limit=0): 259 def branchentries(repo, stripecount, limit=0):
254 tips = [] 260 tips = []
255 heads = repo.heads() 261 heads = repo.heads()
256 parity = paritygen(stripecount) 262 parity = paritygen(stripecount)
441 447
442 files = [] 448 files = []
443 parity = paritygen(web.stripecount) 449 parity = paritygen(web.stripecount)
444 for blockno, f in enumerate(ctx.files()): 450 for blockno, f in enumerate(ctx.files()):
445 template = 'filenodelink' if f in ctx else 'filenolink' 451 template = 'filenodelink' if f in ctx else 'filenolink'
446 files.append(web.tmpl(template, 452 files.append(web.tmpl.generate(template, {
447 node=ctx.hex(), file=f, blockno=blockno + 1, 453 'node': ctx.hex(),
448 parity=next(parity))) 454 'file': f,
455 'blockno': blockno + 1,
456 'parity': next(parity),
457 }))
449 458
450 basectx = basechangectx(web.repo, web.req) 459 basectx = basechangectx(web.repo, web.req)
451 if basectx is None: 460 if basectx is None:
452 basectx = ctx.p1() 461 basectx = ctx.p1()
453 462
474 archives=web.archivelist(ctx.hex()), 483 archives=web.archivelist(ctx.hex()),
475 **pycompat.strkwargs(commonentry(web.repo, ctx))) 484 **pycompat.strkwargs(commonentry(web.repo, ctx)))
476 485
477 def listfilediffs(tmpl, files, node, max): 486 def listfilediffs(tmpl, files, node, max):
478 for f in files[:max]: 487 for f in files[:max]:
479 yield tmpl('filedifflink', node=hex(node), file=f) 488 yield tmpl.generate('filedifflink', {'node': hex(node), 'file': f})
480 if len(files) > max: 489 if len(files) > max:
481 yield tmpl('fileellipses') 490 yield tmpl.generate('fileellipses', {})
482 491
483 def diffs(web, ctx, basectx, files, style, linerange=None, 492 def diffs(web, ctx, basectx, files, style, linerange=None,
484 lineidprefix=''): 493 lineidprefix=''):
485 494
486 def prettyprintlines(lines, blockno): 495 def prettyprintlines(lines, blockno):
492 ltype = "difflineminus" 501 ltype = "difflineminus"
493 elif l.startswith('@'): 502 elif l.startswith('@'):
494 ltype = "difflineat" 503 ltype = "difflineat"
495 else: 504 else:
496 ltype = "diffline" 505 ltype = "diffline"
497 yield web.tmpl( 506 yield web.tmpl.generate(ltype, {
498 ltype, 507 'line': l,
499 line=l, 508 'lineno': lineno,
500 lineno=lineno, 509 'lineid': lineidprefix + "l%s" % difflineno,
501 lineid=lineidprefix + "l%s" % difflineno, 510 'linenumber': "% 8s" % difflineno,
502 linenumber="% 8s" % difflineno) 511 })
503 512
504 repo = web.repo 513 repo = web.repo
505 if files: 514 if files:
506 m = match.exact(repo.root, repo.getcwd(), files) 515 m = match.exact(repo.root, repo.getcwd(), files)
507 else: 516 else:
522 s1, l1, s2, l2 = hunkrange 531 s1, l1, s2, l2 = hunkrange
523 if not mdiff.hunkinrange((s2, l2), linerange): 532 if not mdiff.hunkinrange((s2, l2), linerange):
524 continue 533 continue
525 lines.extend(hunklines) 534 lines.extend(hunklines)
526 if lines: 535 if lines:
527 yield web.tmpl('diffblock', parity=next(parity), blockno=blockno, 536 yield web.tmpl.generate('diffblock', {
528 lines=prettyprintlines(lines, blockno)) 537 'parity': next(parity),
538 'blockno': blockno,
539 'lines': prettyprintlines(lines, blockno),
540 })
529 541
530 def compare(tmpl, context, leftlines, rightlines): 542 def compare(tmpl, context, leftlines, rightlines):
531 '''Generator function that provides side-by-side comparison data.''' 543 '''Generator function that provides side-by-side comparison data.'''
532 544
533 def compline(type, leftlineno, leftline, rightlineno, rightline): 545 def compline(type, leftlineno, leftline, rightlineno, rightline):
534 lineid = leftlineno and ("l%d" % leftlineno) or '' 546 lineid = leftlineno and ("l%d" % leftlineno) or ''
535 lineid += rightlineno and ("r%d" % rightlineno) or '' 547 lineid += rightlineno and ("r%d" % rightlineno) or ''
536 llno = '%d' % leftlineno if leftlineno else '' 548 llno = '%d' % leftlineno if leftlineno else ''
537 rlno = '%d' % rightlineno if rightlineno else '' 549 rlno = '%d' % rightlineno if rightlineno else ''
538 return tmpl('comparisonline', 550 return tmpl.generate('comparisonline', {
539 type=type, 551 'type': type,
540 lineid=lineid, 552 'lineid': lineid,
541 leftlineno=leftlineno, 553 'leftlineno': leftlineno,
542 leftlinenumber="% 6s" % llno, 554 'leftlinenumber': "% 6s" % llno,
543 leftline=leftline or '', 555 'leftline': leftline or '',
544 rightlineno=rightlineno, 556 'rightlineno': rightlineno,
545 rightlinenumber="% 6s" % rlno, 557 'rightlinenumber': "% 6s" % rlno,
546 rightline=rightline or '') 558 'rightline': rightline or '',
559 })
547 560
548 def getblock(opcodes): 561 def getblock(opcodes):
549 for type, llo, lhi, rlo, rhi in opcodes: 562 for type, llo, lhi, rlo, rhi in opcodes:
550 len1 = lhi - llo 563 len1 = lhi - llo
551 len2 = rhi - rlo 564 len2 = rhi - rlo
571 rightlineno=i + 1, 584 rightlineno=i + 1,
572 rightline=rightlines[i]) 585 rightline=rightlines[i])
573 586
574 s = difflib.SequenceMatcher(None, leftlines, rightlines) 587 s = difflib.SequenceMatcher(None, leftlines, rightlines)
575 if context < 0: 588 if context < 0:
576 yield tmpl('comparisonblock', lines=getblock(s.get_opcodes())) 589 yield tmpl.generate('comparisonblock',
590 {'lines': getblock(s.get_opcodes())})
577 else: 591 else:
578 for oc in s.get_grouped_opcodes(n=context): 592 for oc in s.get_grouped_opcodes(n=context):
579 yield tmpl('comparisonblock', lines=getblock(oc)) 593 yield tmpl.generate('comparisonblock', {'lines': getblock(oc)})
580 594
581 def diffstatgen(ctx, basectx): 595 def diffstatgen(ctx, basectx):
582 '''Generator function that provides the diffstat data.''' 596 '''Generator function that provides the diffstat data.'''
583 597
584 stats = patch.diffstatdata( 598 stats = patch.diffstatdata(
608 fileno = 0 622 fileno = 0
609 for filename, adds, removes, isbinary in stats: 623 for filename, adds, removes, isbinary in stats:
610 template = 'diffstatlink' if filename in files else 'diffstatnolink' 624 template = 'diffstatlink' if filename in files else 'diffstatnolink'
611 total = adds + removes 625 total = adds + removes
612 fileno += 1 626 fileno += 1
613 yield tmpl(template, node=ctx.hex(), file=filename, fileno=fileno, 627 yield tmpl.generate(template, {
614 total=total, addpct=pct(adds), removepct=pct(removes), 628 'node': ctx.hex(),
615 parity=next(parity)) 629 'file': filename,
630 'fileno': fileno,
631 'total': total,
632 'addpct': pct(adds),
633 'removepct': pct(removes),
634 'parity': next(parity),
635 })
616 636
617 class sessionvars(object): 637 class sessionvars(object):
618 def __init__(self, vars, start='?'): 638 def __init__(self, vars, start='?'):
619 self.start = start 639 self.start = start
620 self.vars = vars 640 self.vars = vars