##// END OF EJS Templates
typing: add some type hints for bundle2 capabilities...
typing: add some type hints for bundle2 capabilities Somewhere between hg 3dbc7b1ecaba and hg 8e3f6b5bf720, pytype determined the signature of `bundle20.capabilities` changed from `Dict[bytes, Tuple[bytes]]` to `Dict[bytes, Union[List[bytes], Tuple[bytes]]]`. First, I did try to simply be explicit about the previously inferred type, but it does seem to mix and match list/tuple now (e.g. in `writenewbundle()`). I tried changing the new list usage to tuple, but a couple of things complained, (and I think lists of one item are a little more clear to read anyway). So then I typed the dict value as `Sequence[bytes]`, which worked fine. But there's also a module level `capabilities` field, and when that's typed, pytype complains about `Sequence[bytes]` lacking `__add__`[1]. So I gave up, and just assigned it the type it wanted, with an alias. If somebody feels motivated to make the type consistent, it's simple enough to change the alias. The mutable default value to the constructor was removed to appease PyCharm's type checking on the field. (I didn't bother running the code through pytype prior to changing it, because we've previously made an effort to remove this pattern anyway.) I'm not sure why `getrepocaps()` has a default value for `role` that apparently raises an exception. It's just flagged for now so this series can land without risking additional problems. [1] https://foss.heptapod.net/mercurial/mercurial-devel/-/jobs/2466903

File last commit:

r38201:c2e3bc99 default
r52564:6fc31e7b default
Show More
map
292 lines | 11.6 KiB | text/plain | TextLexer
default = 'shortlog'
mimetype = 'text/html; charset={encoding}'
header = header.tmpl
footer = footer.tmpl
search = search.tmpl
changelog = shortlog.tmpl
shortlog = shortlog.tmpl
shortlogentry = shortlogentry.tmpl
graph = graph.tmpl
graphentry = graphentry.tmpl
help = help.tmpl
helptopics = helptopics.tmpl
helpentry = '
<tr><td>
<a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
{if(basename, '{basename|escape}', '{topic|escape}')}
</a>
</td><td>
{summary|escape}
</td></tr>'
naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
filenolink = '{file|escape} '
fileellipses = '...'
diffstatlink = diffstat.tmpl
diffstatnolink = diffstat.tmpl
changelogentry = shortlogentry.tmpl
changeset = changeset.tmpl
manifest = manifest.tmpl
nav = '{before%naventry} {after%naventry}'
navshort = '{before%navshortentry}{after%navshortentry}'
navgraph = '{before%navgraphentry}{after%navgraphentry}'
filenav = '{before%filenaventry}{after%filenaventry}'
updirentry = '
<tr class="fileline">
<td class="name">
<a href="{url|urlescape}file/{symrev}{up|urlescape}{sessionvars%urlparameter}">[up]</a>
</td>
<td class="size"></td>
<td class="permissions">drwxr-xr-x</td>
</tr>'
direntry = '
<tr class="fileline">
<td class="name">
<a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">
<img src="{staticurl|urlescape}coal-folder.png" alt="dir."/> {basename|escape}/
</a>
<a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
{emptydirs|escape}
</a>
</td>
<td class="size"></td>
<td class="permissions">drwxr-xr-x</td>
</tr>'
fileentry = '
<tr class="fileline">
<td class="filename">
<a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">
<img src="{staticurl|urlescape}coal-file.png" alt="file"/> {basename|escape}
</a>
</td>
<td class="size">{size}</td>
<td class="permissions">{permissions|permissions}</td>
</tr>'
filerevision = filerevision.tmpl
fileannotate = fileannotate.tmpl
filediff = filediff.tmpl
filecomparison = filecomparison.tmpl
filelog = filelog.tmpl
fileline = '
<span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
filelogentry = filelogentry.tmpl
annotateline = '
<tr id="{lineid}"{ifeq(node, originalnode, ' class="thisrev"')}>
<td class="annotate parity{blockparity}">
{if(blockhead,
'<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
{rev}
</a>')}
<div class="annotate-info">
<div>
<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
{node|short}</a>
{desc|escape|firstline}
</div>
<div><em>{author|obfuscate}</em></div>
<div>parents: {parents%annotateparent}</div>
<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
</div>
</td>
<td class="source followlines-btn-parent"><a href="#{lineid}">{linenumber}</a> {line|escape}</td>
</tr>'
annotateparent = '
<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
diffblock = '<div class="bottomline inc-lineno"><pre class="sourcelines wrap">{lines}</pre></div>'
difflineplus = '
<span id="{lineid}" class="plusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
difflineminus = '
<span id="{lineid}" class="minusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
difflineat = '
<span id="{lineid}" class="atline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
diffline = '
<span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
comparisonblock ='
<tbody class="block">
{lines}
</tbody>'
comparisonline = '
<tr id="{lineid}">
<td class="source {type}"><a href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
<td class="source {type}"><a href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
</tr>'
changesetparent = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
changesetparentdiff = '
{changesetparent}
{ifeq(node, basenode, '(current diff)', '({difffrom})')}'
difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
filerevparent = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
filerevchild = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
filerename = '{file|escape}@'
filelogrename = '
<span class="base">
base
<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
{file|escape}@{node|short}
</a>
</span>'
fileannotateparent = '
<tr>
<td class="metatag">parent:</td>
<td>
<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
{rename%filerename}{node|short}
</a>
</td>
</tr>'
changesetchild = ' <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
fileannotatechild = '
<tr>
<td class="metatag">child:</td>
<td>
<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
{node|short}
</a>
</td>
</tr>'
tags = tags.tmpl
tagentry = '
<tr class="tagEntry">
<td>
<a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">
{tag|escape}
</a>
</td>
<td class="node">
<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
{node|short}
</a>
</td>
</tr>'
bookmarks = bookmarks.tmpl
bookmarkentry = '
<tr class="tagEntry">
<td>
<a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">
{bookmark|escape}
</a>
</td>
<td class="node">
<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
{node|short}
</a>
</td>
</tr>'
branches = branches.tmpl
branchentry = '
<tr class="tagEntry">
<td>
<a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}" class="{status}">
{branch|escape}
</a>
</td>
<td class="node">
<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
{node|short}
</a>
</td>
</tr>'
phasetag = '{ifeq(phase, 'public', '', '<span class="phase">{phase|escape}</span> ')}'
obsoletetag = '{if(obsolete, '<span class="obsolete">obsolete</span> ')}'
instabilitytag = '<span class="instability">{instability|escape}</span> '
changelogtag = '<span class="tag">{name|escape}</span> '
changesettag = '<span class="tag">{tag|escape}</span> '
changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
changelogbranchname = '<span class="branchname">{name|escape}</span> '
alltags = '{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
successorlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
obsfatesuccessors = '{if(successors, ' as ')}{successors%successorlink}'
obsfateverb = '{obsfateverb(successors, markers)}'
obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
obsfateusers = '{if(obsfateusers(markers), ' by {join(obsfateusers(markers)%'{user|obfuscate}', ', ')}')}'
obsfatedate = '{if(obsfatedate(markers), ' {ifeq(min(obsfatedate(markers)), max(obsfatedate(markers)), '<span class="age">{min(obsfatedate(markers))|rfc822date}</span>', 'between <span class="age">{min(obsfatedate(markers))|rfc822date}</span> and <span class="age">{max(obsfatedate(markers))|rfc822date}</span>')}')}'
obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}{obsfateusers}{obsfatedate}'
instabilitychangesetlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
divergentnode = '{instabilitychangesetlink} ({phase})'
whyunstableentry = '{instability}: {if(divergentnodes, divergentnodes%divergentnode)} {reason} {instabilitychangesetlink}'
filediffparent = '
<tr>
<th class="parent">parent {rev}:</th>
<td class="parent"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
</tr>'
filediffchild = '
<tr>
<th class="child">child {rev}:</th>
<td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
</td>
</tr>'
indexentry = '
<tr>
<td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
<td>{description}</td>
<td>{contact|obfuscate}</td>
<td class="age">{lastchange|rfc822date}</td>
<td class="indexlinks">{archives%indexarchiveentry}</td>
<td>
{if(isdirectory, '',
'<a href="{url|urlescape}atom-log" title="subscribe to repository atom feed">
<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="subscribe to repository atom feed">
</a>'
)}
</td>
</tr>\n'
indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
index = index.tmpl
archiveentry = '
<li>
<a href="{url|urlescape}archive/{symrev}{extension|urlescape}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a>
</li>'
notfound = notfound.tmpl
error = error.tmpl
urlparameter = '{separator}{name}={value|urlescape}'
hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
searchform = '
<form class="search" action="{url|urlescape}log">
{sessionvars%hiddenformentry}
<p><input name="rev" id="search1" type="text" size="30" value="{query|escape}" /></p>
<div id="hint">{searchhint}</div>
</form>'
searchhint = 'Find changesets by keywords (author, files, the commit message), revision
number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
diffoptsform = '
<form id="diffopts-form"
data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
<span>Ignore whitespace changes - </span>
<span>Everywhere:</span>
<input id="ignorews-checkbox" type="checkbox" />
<span>Within whitespace:</span>
<input id="ignorewsamount-checkbox" type="checkbox" />
<span>At end of lines:</span>
<input id="ignorewseol-checkbox" type="checkbox" />
</form>'