##// END OF EJS Templates
templater: return data in increasing chunk sizes...
templater: return data in increasing chunk sizes Currently hgweb is not streaming its output -- it accumulates the entire response before sending it. This patch restores streaming behaviour. To avoid having to synchronously write many tiny fragments, this patch also adds buffering to the template generator. Local testing of a fetch of a 100,000 line file with wget produces a slight slowdown overall (up from 6.5 seconds to 7.2 seconds), but instead of waiting 6 seconds for headers to arrive, output begins immediately.

File last commit:

r7345:55651328 default
r7396:526c40a7 default
Show More
graph.tmpl
113 lines | 3.3 KiB | application/x-cheetah | CheetahLexer
{header}
<title>{repo|escape}: revision graph</title>
<link rel="alternate" type="application/atom+xml"
href="{url}atom-log" title="Atom feed for {repo|escape}: log">
<link rel="alternate" type="application/rss+xml"
href="{url}rss-log" title="RSS feed for {repo|escape}: log">
<!--[if IE]><script type="text/javascript" src="{staticurl}excanvas.js"></script><![endif]-->
</head>
<body>
<div class="container">
<div class="menu">
<div class="logo">
<a href="http://www.selenic.com/mercurial/">
<img src="{staticurl}hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
</div>
<ul>
<li><a href="{url}shortlog/{node|short}{sessionvars%urlparameter}">log</a></li>
<li class="active">graph</li>
<li><a href="{url}tags{sessionvars%urlparameter}">tags</a></li>
</ul>
<ul>
<li><a href="{url}rev/{node|short}{sessionvars%urlparameter}">changeset</a></li>
<li><a href="{url}file/{node|short}{path|urlescape}{sessionvars%urlparameter}">browse</a></li>
</ul>
</div>
<div class="main">
<h2><a href="{url}{sessionvars%urlparameter}">{repo|escape}</a></h2>
<h3>graph</h3>
<form class="search" action="{url}log">
{sessionvars%hiddenformentry}
<p><input name="rev" id="search1" type="text" size="30"></p>
<span>find changesets by author, revision,
files, or words in the commit message</span>
</form>
<div class="navigate">
<a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
<a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
| rev {rev}: {changenav%navgraphentry}
</div>
<noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
<div id="wrapper">
<ul id="nodebgs"></ul>
<canvas id="graph" width="224" height="{canvasheight}"></canvas>
<ul id="graphnodes"></ul>
</div>
<script type="text/javascript" src="{staticurl}graph.js"></script>
<script type="text/javascript">
<!-- hide script content
var data = {jsdata|json};
var graph = new Graph();
graph.scale({bg_height});
graph.edge = function(x0, y0, x1, y1, color) {
this.setColor(color, 0.0, 0.65);
this.ctx.beginPath();
this.ctx.moveTo(x0, y0);
this.ctx.lineTo(x1, y1);
this.ctx.stroke();
}
var revlink = '<li style="_STYLE"><span class="desc">';
revlink += '<a href="{url}rev/_NODEID{sessionvars%urlparameter}" title="_NODEID">_DESC</a>';
revlink += '</span><span class="tag">_TAGS</span>';
revlink += '<span class="info">_DATE ago, by _USER</span></li>';
graph.vertex = function(x, y, color, parity, cur) {
this.ctx.beginPath();
color = this.setColor(color, 0.25, 0.75);
this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
this.ctx.fill();
var bg = '<li class="bg parity' + parity + '"></li>';
var left = (this.columns + 1) * this.bg_height;
var nstyle = 'padding-left: ' + left + 'px;';
var item = revlink.replace(/_STYLE/, nstyle);
item = item.replace(/_PARITY/, 'parity' + parity);
item = item.replace(/_NODEID/, cur[0]);
item = item.replace(/_NODEID/, cur[0]);
item = item.replace(/_DESC/, cur[3]);
item = item.replace(/_USER/, cur[4]);
item = item.replace(/_DATE/, cur[5]);
item = item.replace(/_TAGS/, cur[7].join('&nbsp; '));
return [bg, item];
}
graph.render(data);
// stop hiding script -->
</script>
<div class="navigate">
<a href="{url}graph/{rev}{lessvars%urlparameter}">less</a>
<a href="{url}graph/{rev}{morevars%urlparameter}">more</a>
| rev {rev}: {changenav%navgraphentry}
</div>
</div>
</div>
{footer}