[PATCH 2 of 5] paper: skip empty table cells in annotate view, use rowspan on block heads

Anton Shestakov av6 at dwimlabs.net
Thu Jul 14 03:31:27 EDT 2016


# HG changeset patch
# User Anton Shestakov <av6 at dwimlabs.net>
# Date 1468473227 -28800
#      Thu Jul 14 13:13:47 2016 +0800
# Node ID 75b968dd1b1b0f7b64abd0c6d2b2d38b5734237a
# Parent  1d5710a9fc8f764030af5c14bfef7da20eaea989
paper: skip empty table cells in annotate view, use rowspan on block heads

Apart from looking nicer, this also substantially cuts down page size that more
than doubled after the recent annotate changes in hgweb:

Annotating templates/paper/map @ 3.8.4 (style=paper):
- current stable: 81.6 KB
- hg-committed: 211 KB
- this change: 130 KB

diff --git a/mercurial/hgweb/webcommands.py b/mercurial/hgweb/webcommands.py
--- a/mercurial/hgweb/webcommands.py
+++ b/mercurial/hgweb/webcommands.py
@@ -861,6 +861,7 @@ def annotate(web, req, tmpl):
     fctx = webutil.filectx(web.repo, req)
     f = fctx.path()
     parity = paritygen(web.stripecount)
+    blockparitygen = paritygen(1)
     diffopts = patch.difffeatureopts(web.repo.ui, untrusted=True,
                                      section='annotate', whitespace=True)
 
@@ -871,6 +872,14 @@ def annotate(web, req, tmpl):
                 "rev": p.rev(),
             }
 
+    def countspan(rev, nextlines):
+        count = 0
+        for (f, targetline), l in nextlines:
+            if f.rev() != rev:
+                break
+            count += 1
+        return count
+
     def annotate(**map):
         if util.binary(fctx.data()):
             mt = (mimetypes.guess_type(fctx.path())[0]
@@ -882,7 +891,16 @@ def annotate(web, req, tmpl):
         previousrev = None
         for lineno, ((f, targetline), l) in enumerate(lines):
             rev = f.rev()
-            blockhead = rev != previousrev or None
+            if rev != previousrev:
+                blockhead = True
+                blockparity = next(blockparitygen)
+                # row span is count(this line + all consecutive lines with the
+                # same revision after it)
+                rowspan = 1 + countspan(rev, lines[lineno + 1:])
+            else:
+                blockhead = None
+                blockparity = None
+                rowspan = None
             previousrev = rev
             yield {"parity": next(parity),
                    "node": f.hex(),
@@ -893,6 +911,8 @@ def annotate(web, req, tmpl):
                    "extra": f.extra(),
                    "file": f.path(),
                    "blockhead": blockhead,
+                   "blockparity": blockparity,
+                   "rowspan": rowspan,
                    "targetline": targetline,
                    "line": l,
                    "lineno": lineno + 1,
diff --git a/mercurial/templates/paper/map b/mercurial/templates/paper/map
--- a/mercurial/templates/paper/map
+++ b/mercurial/templates/paper/map
@@ -77,11 +77,11 @@ filelogentry = filelogentry.tmpl
 
 annotateline = '
   <tr id="{lineid}"{ifeq(node, originalnode, ' class="thisrev"')}>
-    <td class="annotate">
-      {if(blockhead,
-          '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
-             {rev}
-           </a>')}
+    {if(blockhead, '
+    <td class="annotate parity{blockparity}" rowspan="{rowspan}">
+      <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}">
@@ -94,6 +94,7 @@ annotateline = '
         <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
       </div>
     </td>
+    ')}
     <td class="source"><a href="#{lineid}">{linenumber}</a> {line|escape}</td>
   </tr>'
 annotateparent = '
diff --git a/tests/test-highlight.t b/tests/test-highlight.t
--- a/tests/test-highlight.t
+++ b/tests/test-highlight.t
@@ -289,7 +289,8 @@ hgweb fileannotate, html
   <tbody class="stripes2">
     
   <tr id="l1" class="thisrev">
-  <td class="annotate">
+  
+  <td class="annotate parity0" rowspan="33">
   <a href="/annotate/06824edf55d0/primes.py#l1">
   0
   </a>
@@ -305,550 +306,135 @@ hgweb fileannotate, html
   <a href="/rev/06824edf55d0">changeset</a>
   </div>
   </td>
+  
   <td class="source"><a href="#l1">     1</a> <span class="c">#!/usr/bin/env python</span></td>
   </tr>
   <tr id="l2" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l2">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l2">     2</a> </td>
   </tr>
   <tr id="l3" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l3">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l3">     3</a> <span class="sd">"""Fun with generators. Corresponding Haskell implementation:</span></td>
   </tr>
   <tr id="l4" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l4">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l4">     4</a> </td>
   </tr>
   <tr id="l5" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l5">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l5">     5</a> <span class="sd">primes = 2 : sieve [3, 5..]</span></td>
   </tr>
   <tr id="l6" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l6">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l6">     6</a> <span class="sd">    where sieve (p:ns) = p : sieve [n | n <- ns, mod n p /= 0]</span></td>
   </tr>
   <tr id="l7" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l7">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l7">     7</a> <span class="sd">"""</span></td>
   </tr>
   <tr id="l8" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l8">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l8">     8</a> </td>
   </tr>
   <tr id="l9" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l9">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l9">     9</a> <span class="kn">from</span> <span class="nn">itertools</span> <span class="kn">import</span> <span class="n">dropwhile</span><span class="p">,</span> <span class="n">ifilter</span><span class="p">,</span> <span class="n">islice</span><span class="p">,</span> <span class="n">count</span><span class="p">,</span> <span class="n">chain</span></td>
   </tr>
   <tr id="l10" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l10">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l10">    10</a> </td>
   </tr>
   <tr id="l11" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l11">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l11">    11</a> <span class="kn">def</span> <span class="nf">primes</span><span class="p">():</span></td>
   </tr>
   <tr id="l12" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l12">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l12">    12</a>     <span class="sd">"""Generate all primes."""</span></td>
   </tr>
   <tr id="l13" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l13">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l13">    13</a>     <span class="kn">def</span> <span class="nf">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></td>
   </tr>
   <tr id="l14" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l14">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l14">    14</a>         <span class="n">p</span> <span class="o">=</span> <span class="n">ns</span><span class="o">.</span><span class="n">next</span><span class="p">()</span></td>
   </tr>
   <tr id="l15" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l15">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l15">    15</a>         <span class="c"># It is important to yield *here* in order to stop the</span></td>
   </tr>
   <tr id="l16" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l16">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l16">    16</a>         <span class="c"># infinite recursion.</span></td>
   </tr>
   <tr id="l17" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l17">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l17">    17</a>         <span class="kn">yield</span> <span class="n">p</span></td>
   </tr>
   <tr id="l18" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l18">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l18">    18</a>         <span class="n">ns</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o">%</span> <span class="n">p</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">ns</span><span class="p">)</span></td>
   </tr>
   <tr id="l19" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l19">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l19">    19</a>         <span class="kn">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="n">sieve</span><span class="p">(</span><span class="n">ns</span><span class="p">):</span></td>
   </tr>
   <tr id="l20" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l20">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l20">    20</a>             <span class="kn">yield</span> <span class="n">n</span></td>
   </tr>
   <tr id="l21" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l21">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l21">    21</a> </td>
   </tr>
   <tr id="l22" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l22">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l22">    22</a>     <span class="n">odds</span> <span class="o">=</span> <span class="n">ifilter</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="n">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">1</span><span class="p">,</span> <span class="n">count</span><span class="p">())</span></td>
   </tr>
   <tr id="l23" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l23">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l23">    23</a>     <span class="kn">return</span> <span class="n">chain</span><span class="p">([</span><span class="mi">2</span><span class="p">],</span> <span class="n">sieve</span><span class="p">(</span><span class="n">dropwhile</span><span class="p">(</span><span class="kn">lambda</span> <span class="n">n</span><span class="p">:</span> <span class="n">n</span> <span class="o"><</span> <span class="mi">3</span><span class="p">,</span> <span class="n">odds</span><span class="p">)))</span></td>
   </tr>
   <tr id="l24" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l24">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l24">    24</a> </td>
   </tr>
   <tr id="l25" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l25">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l25">    25</a> <span class="kn">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">"__main__"</span><span class="p">:</span></td>
   </tr>
   <tr id="l26" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l26">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l26">    26</a>     <span class="kn">import</span> <span class="nn">sys</span></td>
   </tr>
   <tr id="l27" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l27">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l27">    27</a>     <span class="kn">try</span><span class="p">:</span></td>
   </tr>
   <tr id="l28" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l28">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l28">    28</a>         <span class="n">n</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span></td>
   </tr>
   <tr id="l29" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l29">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l29">    29</a>     <span class="kn">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span></td>
   </tr>
   <tr id="l30" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l30">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l30">    30</a>         <span class="n">n</span> <span class="o">=</span> <span class="mi">10</span></td>
   </tr>
   <tr id="l31" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l31">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l31">    31</a>     <span class="n">p</span> <span class="o">=</span> <span class="n">primes</span><span class="p">()</span></td>
   </tr>
   <tr id="l32" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l32">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l32">    32</a>     <span class="kn">print</span> <span class="s">"The first </span><span class="si">%d</span><span class="s"> primes: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="nb">list</span><span class="p">(</span><span class="n">islice</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">n</span><span class="p">)))</span></td>
   </tr>
   <tr id="l33" class="thisrev">
-  <td class="annotate">
   
-  <div class="annotate-info">
-  <div>
-  <a href="/annotate/06824edf55d0/primes.py#l33">
-  06824edf55d0</a>
-  a
-  </div>
-  <div><em>test</em></div>
-  <div>parents: </div>
-  <a href="/diff/06824edf55d0/primes.py">diff</a>
-  <a href="/rev/06824edf55d0">changeset</a>
-  </div>
-  </td>
   <td class="source"><a href="#l33">    33</a> </td>
   </tr>
   </tbody>


More information about the Mercurial-devel mailing list