hgtemplates: synchronize templates with Mercurial 3.9; r?smacleod draft
authorGregory Szorc <gps@mozilla.com>
Tue, 30 Aug 2016 19:41:19 -0700
changeset 9498 559d088e0e32947d010ff26ba978197c42b6517a
parent 9497 900df1cf8a62e36f8cded2db10c78205bfc19127
child 9499 854e0fd55e4039453cc86105ac4ffd2b224b8076
push id1197
push userbmo:gps@mozilla.com
push dateThu, 01 Sep 2016 20:01:26 +0000
reviewerssmacleod
hgtemplates: synchronize templates with Mercurial 3.9; r?smacleod The 3.9 release made a bunch of changes to JSON templates and the HTML annotate viewer. We synchronize those with upstream. Surprisingly, only a single test was impacted by this. MozReview-Commit-ID: Kpn2BDmniYp
hgext/hgmo/tests/test-json-filelog.t
hgtemplates/atom/branchentry.tmpl
hgtemplates/atom/changelogentry.tmpl
hgtemplates/atom/map
hgtemplates/gitweb/map
hgtemplates/gitweb_mozilla/map
hgtemplates/json/map
hgtemplates/paper/map
hgtemplates/rss/bookmarks.tmpl
hgtemplates/rss/changelogentry.tmpl
hgtemplates/rss/tags.tmpl
hgtemplates/static/style-gitweb.css
hgtemplates/static/style-paper.css
hgtemplates/static/style.css
--- a/hgext/hgmo/tests/test-json-filelog.t
+++ b/hgext/hgmo/tests/test-json-filelog.t
@@ -35,52 +35,72 @@ Single file with 3 commits
   >     entry['pushdate'] = [n, 0]
   >     n += 1
   > print json.dumps(data, indent = 4, sort_keys = True)
   > EOF
   $ python rmpd
   {
       "entries": [
           {
-              "author": "test", 
+              "bookmarks": [], 
+              "branch": "default", 
               "date": [
                   0.0, 
                   0
               ], 
               "desc": "NO BUG", 
               "node": "313d9c157189179b5853d16831f80aa5ab609782", 
+              "parents": [
+                  "ca92ee64ee5df95ce203c3a1ba6c72a6328963d1"
+              ], 
+              "phase": "public", 
               "pushdate": [
                   0.0, 
                   0
               ], 
-              "pushid": 3
+              "pushid": 3, 
+              "tags": [
+                  "tip"
+              ], 
+              "user": "test"
           }, 
           {
-              "author": "test", 
+              "bookmarks": [], 
+              "branch": "default", 
               "date": [
                   0.0, 
                   0
               ], 
               "desc": "Bug 159 - Do foo; r=calixte\n\nThis is related to bug 265.", 
               "node": "ca92ee64ee5df95ce203c3a1ba6c72a6328963d1", 
+              "parents": [
+                  "4de9924f06f2d653b28fda17113787fcfffb03e0"
+              ], 
+              "phase": "public", 
               "pushdate": [
                   1.0, 
                   0
               ], 
-              "pushid": 2
+              "pushid": 2, 
+              "tags": [], 
+              "user": "test"
           }, 
           {
-              "author": "test", 
+              "bookmarks": [], 
+              "branch": "default", 
               "date": [
                   0.0, 
                   0
               ], 
               "desc": "Bug 314; r=calixte", 
               "node": "4de9924f06f2d653b28fda17113787fcfffb03e0", 
+              "parents": [], 
+              "phase": "public", 
               "pushdate": [
                   2.0, 
                   0
               ], 
-              "pushid": 1
+              "pushid": 1, 
+              "tags": [], 
+              "user": "test"
           }
-      ], 
-      "file": "foo"
+      ]
   }
--- a/hgtemplates/atom/branchentry.tmpl
+++ b/hgtemplates/atom/branchentry.tmpl
@@ -1,8 +1,8 @@
  <entry>
   <title>{branch|escape}</title>
   <link rel="alternate" href="{urlbase}{url|urlescape}rev/{node|short}"/>
   <id>{urlbase}{url|urlescape}#branch-{node}</id>
   <updated>{date|rfc3339date}</updated>
   <published>{date|rfc3339date}</published>
-  <content type="text"><![CDATA[{branch|strip|escape|addbreaks}]]></content>
+  <content type="text">{branch|strip|escape|addbreaks}</content>
  </entry>
--- a/hgtemplates/atom/changelogentry.tmpl
+++ b/hgtemplates/atom/changelogentry.tmpl
@@ -4,40 +4,40 @@
   <link href="{urlbase}{url|urlescape}rev/{node|short}"/>
   <author>
    <name>{author|person|escape}</name>
    <email>{author|email|obfuscate}</email>
   </author>
   <updated>{date|rfc3339date}</updated>
   <published>{date|rfc3339date}</published>
   <content type="xhtml">
-	<table xmlns="http://www.w3.org/1999/xhtml">
-	<tr>
-		<th style="text-align:left;">changeset</th>
-		<td>{node|short}</td>
-              </tr>
-              <tr>
-                              <th style="text-align:left;">branch</th>
-                              <td>{inbranch%"{name|escape}"}{branches%"{name|escape}"}</td>
-              </tr>
-              <tr>
-                              <th style="text-align:left;">bookmark</th>
-		<td>{bookmarks%"{name|escape}"}</td>
-	</tr>
-	<tr>
-		<th style="text-align:left;">tag</th>
-		<td>{tags%"{name|escape}"}</td>
-	</tr>
-	<tr>
-		<th style="text-align:left;">user</th>
-		<td>{author|obfuscate}</td>
-	</tr>
-	<tr>
-		<th style="text-align:left;vertical-align:top;">description</th>
-		<td>{desc|strip|escape|websub|addbreaks|nonempty}</td>
-	</tr>
-	<tr>
-		<th style="text-align:left;vertical-align:top;">files</th>
-		<td>{files}</td>
-	</tr>
-	</table>
+   <table xmlns="http://www.w3.org/1999/xhtml">
+    <tr>
+     <th style="text-align:left;">changeset</th>
+     <td>{node|short}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;">branch</th>
+     <td>{inbranch%"{name|escape}"}{branches%"{name|escape}"}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;">bookmark</th>
+     <td>{bookmarks%"{name|escape}"}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;">tag</th>
+     <td>{tags%"{name|escape}"}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;">user</th>
+     <td>{author|obfuscate}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;vertical-align:top;">description</th>
+     <td>{desc|strip|escape|websub|addbreaks|nonempty}</td>
+    </tr>
+    <tr>
+     <th style="text-align:left;vertical-align:top;">files</th>
+     <td>{files}</td>
+    </tr>
+   </table>
   </content>
  </entry>
--- a/hgtemplates/atom/map
+++ b/hgtemplates/atom/map
@@ -1,16 +1,15 @@
 default = 'changelog'
 feedupdated = '<updated>{date|rfc3339date}</updated>'
 mimetype = 'application/atom+xml; charset={encoding}'
 header = header.tmpl
 changelog = changelog.tmpl
 changelogentry = changelogentry.tmpl
 filelog = filelog.tmpl
-filelogentry = filelogentry.tmpl
 pushlog = pushlog.tmpl
 pushlogentry = pushlogentry.tmpl
 pushlogfile = '<li class="file">{name}</li>'
 tags = tags.tmpl
 tagentry = tagentry.tmpl
 bookmarks = bookmarks.tmpl
 bookmarkentry = bookmarkentry.tmpl
 branches = branches.tmpl
--- a/hgtemplates/gitweb/map
+++ b/hgtemplates/gitweb/map
@@ -90,24 +90,39 @@ fileentry = '
 filerevision = filerevision.tmpl
 fileannotate = fileannotate.tmpl
 filediff = filediff.tmpl
 filecomparison = filecomparison.tmpl
 filelog = filelog.tmpl
 fileline = '
   <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
 annotateline = '
-  <tr id="{lineid}" style="font-family:monospace" class="parity{parity}">
-    <td class="linenr" style="text-align: right;">
-      <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}"
-         title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
+  <tr id="{lineid}" style="font-family:monospace" class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
+    <td class="annotate linenr parity{blockparity}" style="text-align: right;">
+      {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><pre><a class="linenr" href="#{lineid}">{linenumber}</a></pre></td>
     <td><pre>{line|escape}</pre></td>
   </tr>'
+annotateparent = '
+  <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
 difflineplus = '
   <a href="#{lineid}"></a><span id="{lineid}" class="difflineplus">{strip(line|escape, '\r\n')}</span>'
 difflineminus = '
   <a href="#{lineid}"></a><span id="{lineid}" class="difflineminus">{strip(line|escape, '\r\n')}</span>'
 difflineat = '
   <a href="#{lineid}"></a><span id="{lineid}" class="difflineat">{strip(line|escape, '\r\n')}</span>'
 diffline = '
   <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
--- a/hgtemplates/gitweb_mozilla/map
+++ b/hgtemplates/gitweb_mozilla/map
@@ -91,24 +91,39 @@ fileentry = '
 filerevision = filerevision.tmpl
 fileannotate = fileannotate.tmpl
 filediff = filediff.tmpl
 filecomparison = filecomparison.tmpl
 filelog = filelog.tmpl
 fileline = '
   <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
 annotateline = '
-  <tr id="{lineid}" style="font-family:monospace" class="parity{parity}">
-    <td class="linenr" style="text-align: right;">
-      <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}"
-         title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
+  <tr id="{lineid}" style="font-family:monospace" class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
+    <td class="annotate parity{blockparity}" style="text-align: right;">
+      {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><pre><a class="linenr" href="#{lineid}">{linenumber}</a></pre></td>
     <td><pre>{line|escape}</pre></td>
   </tr>'
+annotateparent = '
+  <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
 difflineplus = '
   <a href="#{lineid}"></a><span id="{lineid}" class="difflineplus">{strip(line|escape, '\r\n')}</span>'
 difflineminus = '
   <a href="#{lineid}"></a><span id="{lineid}" class="difflineminus">{strip(line|escape, '\r\n')}</span>'
 difflineat = '
   <a href="#{lineid}"></a><span id="{lineid}" class="difflineat">{strip(line|escape, '\r\n')}</span>'
 diffline = '
   <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
--- a/hgtemplates/json/map
+++ b/hgtemplates/json/map
@@ -21,31 +21,54 @@ pushes2 = '\{
   "lastpushid": {lastpushid|json},
   "pushes": {pushes|json}
   }'
 headdivergence = '\{
   "commitsbehind": {commitsbehind|json},
   "filemerges": {filemerges|json},
   "filemergesignored": {filemergesignored|json}
   }'
-
-filerevision = '"not yet implemented"'
-search = '"not yet implemented"'
+filerevision = '\{
+  "node": {node|json},
+  "path": {file|json},
+  "date": {date|json},
+  "desc": {desc|utf8|json},
+  "branch": {if(branch, branch%changesetbranch, "default"|json)},
+  "bookmarks": [{join(bookmarks%changelistentryname, ", ")}],
+  "tags": [{join(tags%changelistentryname, ", ")}],
+  "user": {author|utf8|json},
+  "parents": [{join(parent%changesetparent, ", ")}],
+  "phase": {phase|json},
+  "lines": [{join(text%lineentry, ", ")}]
+  }'
+lineentry = '\{
+  "line": {line|json}
+  }'
+search = '\{
+  "node": {node|json},
+  "query": {query|json},
+  "entries": [{join(entries%searchentry, ", ")}]
+  }'
+searchentry = '{changelistentry}'
 # changelog and shortlog are the same web API but with different
 # number of entries.
 changelog = changelist.tmpl
 shortlog = changelist.tmpl
 changelistentry = '\{
   "node": {node|json},
   "date": {date|json},
   "desc": {desc|utf8|json},
+  "branch": {if(branch, branch%changesetbranch, "default"|json)},
   "bookmarks": [{join(bookmarks%changelistentryname, ", ")}],
   "tags": [{join(tags%changelistentryname, ", ")}],
   "user": {author|utf8|json},
-  "parents": [{join(allparents%changesetparent, ", ")}]
+  "phase": {phase|json},
+  "parents": [{if(allparents, join(allparents%changesetparent, ", "),
+                  join(parent%changesetparent, ", "))}],
+  "pushid": {pushid|json}
   }'
 changelistentryname = '{name|utf8|json}'
 changeset = '\{
   "node": {node|json},
   "date": {date|json},
   "desc": {desc|utf8|json},
   "backedoutby": {if(backedoutbynode, backedoutbynode|json, ""|json)},
   "branch": {if(branch, branch%changesetbranch, "default"|json)},
@@ -105,17 +128,33 @@ branches = '\{
   "branches": [{join(entries%branchentry, ", ")}]
   }'
 branchentry = '\{
   "branch": {branch|utf8|json},
   "node": {node|json},
   "date": {date|json},
   "status": {status|json}
   }'
-summary = '"not yet implemented"'
+shortlogentry = '{changelistentry}'
+summary = '\{
+  "node": {node|json},
+  "lastchange": {lastchange|json},
+  "bookmarks": [{join(bookmarks%bookmarkentry, ", ")}],
+  "branches": [{join(branches%branchentry, ", ")}],
+  "shortlog": [{join(shortlog%shortlogentry, ", ")}],
+  "tags": [{join(tags%tagentry, ", ")}],
+  "archives": [{join(archives%archiveentry, ", ")}],
+  "labels": {labels|json}
+  }'
+archiveentry = '\{
+  "node": {node|json},
+  "extension": {extension|json},
+  "type": {type|json},
+  "url": {"{urlbase}{url}archive/{node}{extension}"|json}
+  }'
 filediff = '\{
   "path": {file|json},
   "node": {node|json},
   "date": {date|json},
   "desc": {desc|utf8|json},
   "author": {author|utf8|json},
   "parents": [{join(parent%changesetparent, ", ")}],
   "children": [{join(child%changesetparent, ", ")}],
@@ -183,28 +222,19 @@ fileannotation = '\{
   "author": {author|utf8|json},
   "desc": {desc|utf8|json},
   "abspath": {file|json},
   "targetline": {targetline|json},
   "line": {line|json},
   "lineno": {lineno|json},
   "revdate": {revdate|json}
   }'
-filelogentry = '\{
-  "node": {node|json},
-  "author": {author|json},
-  "date": {date|json},
-  "pushid": {pushid|json},
-  "pushdate": {pushdate|json},
-  "desc": {desc|json}
+filelog = '\{
+  "entries": [{join(entries%changelistentry, ", ")}]
   }'
-filelog = '\{
-  "file": {file|json},
-   "entries": [{join(entries%filelogentry, ", ")}]
-   }'
 graph = '"not yet implemented"'
 helptopics = '\{
   "topics": [{join(topics%helptopicentry, ", ")}],
   "earlycommands": [{join(earlycommands%helptopicentry, ", ")}],
   "othercommands": [{join(othercommands%helptopicentry, ", ")}]
   }'
 helptopicentry = '\{
   "topic": {topic|utf8|json},
@@ -218,10 +248,11 @@ filenodelink = ''
 filenolink = ''
 index = '\{
   "entries": [{join(entries%indexentry, ", ")}]
   }'
 indexentry = '\{
   "name": {name|utf8|json},
   "description": {description|utf8|json},
   "contact": {contact|utf8|json},
-  "lastchange": {lastchange|json}
-  }'
\ No newline at end of file
+  "lastchange": {lastchange|json},
+  "labels": {labels|json}
+  }'
--- a/hgtemplates/paper/map
+++ b/hgtemplates/paper/map
@@ -71,24 +71,38 @@ 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}">
-    <td class="annotate">
-      <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}"
-         title="{node|short}: {desc|escape|firstline}">{author|user}@{rev}</a>
+  <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"><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 = '
--- a/hgtemplates/rss/bookmarks.tmpl
+++ b/hgtemplates/rss/bookmarks.tmpl
@@ -1,6 +1,6 @@
 {header}
-    <title>{repo|escape}: bookmarks </title>
+    <title>{repo|escape}: bookmarks</title>
     <description>{repo|escape} bookmark history</description>
     {entries%bookmarkentry}
   </channel>
 </rss>
--- a/hgtemplates/rss/changelogentry.tmpl
+++ b/hgtemplates/rss/changelogentry.tmpl
@@ -1,40 +1,41 @@
 <item>
     <title>{inbranch%"{if(name, '[{name|escape}] ')}"}{branches%"{if(name, '[{name|escape}] ')}"}{desc|strip|firstline|strip|escape}</title>
     <guid isPermaLink="true">{urlbase}{url|urlescape}rev/{node|short}</guid>
-             <link>{urlbase}{url|urlescape}rev/{node|short}</link>
+    <link>{urlbase}{url|urlescape}rev/{node|short}</link>
     <description>
-              <![CDATA[
-	<table>
-	<tr>
-		<th style="text-align:left;">changeset</th>
-		<td>{node|short}</td>
-              </tr>
-              <tr>
-                              <th style="text-align:left;">branch</th>
-                              <td>{inbranch%"{name|escape}"}{branches%"{name|escape}"}</td>
-              </tr>
-              <tr>
-                              <th style="text-align:left;">bookmark</th>
-		<td>{bookmarks%"{name|escape}"}</td>
-	</tr>
-	<tr>
-		<th style="text-align:left;">tag</th>
-		<td>{tags%"{name|escape}"}</td>
-	</tr>
-	<tr>
-		<th style="text-align:left;vertical-align:top;">user</th>
-		<td>{author|obfuscate}</td>
-	</tr>
-	<tr>
-		<th style="text-align:left;vertical-align:top;">description</th>
-		<td>{desc|strip|escape|websub|addbreaks|nonempty}</td>
-	</tr>
-	<tr>
-		<th style="text-align:left;vertical-align:top;">files</th>
-		<td>{files}</td>
-	</tr>
-	</table>
-	]]></description>
+    <![CDATA[
+        <table>
+            <tr>
+                <th style="text-align:left;">changeset</th>
+                <td>{node|short}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;">branch</th>
+                <td>{inbranch%"{name|escape}"}{branches%"{name|escape}"}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;">bookmark</th>
+                <td>{bookmarks%"{name|escape}"}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;">tag</th>
+                <td>{tags%"{name|escape}"}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;vertical-align:top;">user</th>
+                <td>{author|obfuscate}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;vertical-align:top;">description</th>
+                <td>{desc|strip|escape|websub|addbreaks|nonempty}</td>
+            </tr>
+            <tr>
+                <th style="text-align:left;vertical-align:top;">files</th>
+                <td>{files}</td>
+            </tr>
+        </table>
+    ]]>
+    </description>
     <author>{author|obfuscate}</author>
     <pubDate>{date|rfc822date}</pubDate>
 </item>
--- a/hgtemplates/rss/tags.tmpl
+++ b/hgtemplates/rss/tags.tmpl
@@ -1,6 +1,6 @@
 {header}
-    <title>{repo|escape}: tags </title>
+    <title>{repo|escape}: tags</title>
     <description>{repo|escape} tag history</description>
     {entriesnotip%tagentry}
   </channel>
 </rss>
--- a/hgtemplates/static/style-gitweb.css
+++ b/hgtemplates/static/style-gitweb.css
@@ -24,16 +24,17 @@ div.log_link {
 	font-size:10px; font-family:sans-serif; font-style:normal;
 	position:relative; float:left; width:136px;
 }
 div.list_head { padding:6px 8px 4px; border:solid #d9d8d1; border-width:1px 0px 0px; font-style:italic; }
 a.list { text-decoration:none; color:#000000; }
 a.list:hover { text-decoration:underline; color:#880000; }
 table { padding:8px 4px; }
 th { padding:2px 5px; font-size:12px; text-align:left; }
+.parity0 { background-color:#ffffff; }
 tr.dark, .parity1, pre.sourcelines.stripes > :nth-child(4n+4) { background-color:#f6f6f0; }
 tr.light:hover, .parity0:hover, tr.dark:hover, .parity1:hover,
 pre.sourcelines.stripes > :nth-child(4n+2):hover,
 pre.sourcelines.stripes > :nth-child(4n+4):hover,
 pre.sourcelines.stripes > :nth-child(4n+1):hover + :nth-child(4n+2),
 pre.sourcelines.stripes > :nth-child(4n+3):hover + :nth-child(4n+4) { background-color:#edece6; }
 td { padding:2px 5px; font-size:12px; vertical-align:top; }
 td.closed { background-color: #99f; }
@@ -47,16 +48,29 @@ td.indexlinks a {
   font-weight: bold;  text-align: center; text-decoration: none;
   font-size: 10px;
 }
 td.indexlinks a:hover { background-color: #6666aa; }
 div.pre { font-family:monospace; font-size:12px; white-space:pre; }
 div.diff_info { font-family:monospace; color:#000099; background-color:#edece6; font-style:italic; }
 div.index_include { border:solid #d9d8d1; border-width:0px 0px 1px; padding:12px 8px; }
 div.search { margin:4px 8px; position:absolute; top:56px; right:12px }
+tr.thisrev a { color:#999999; text-decoration: none; }
+tr.thisrev pre { color:#009900; }
+div.annotate-info {
+  display: none;
+  position: absolute;
+  background-color: #FFFFFF;
+  border: 1px solid #d9d8d1;
+  text-align: left;
+  color: #000000;
+  padding: 5px;
+}
+div.annotate-info a { color: #0000FF; text-decoration: underline; }
+td.annotate:hover div.annotate-info { display: inline; }
 .linenr { color:#999999; text-decoration:none }
 div.rss_logo { float: right; white-space: nowrap; }
 div.rss_logo a {
 	padding:3px 6px; line-height:10px;
 	border:1px solid; border-color:#fcc7a5 #7d3302 #3e1a01 #ff954e;
 	color:#ffffff; background-color:#ff6600;
 	font-weight:bold; font-family:sans-serif; font-size:10px;
 	text-align:center; text-decoration:none;
--- a/hgtemplates/static/style-paper.css
+++ b/hgtemplates/static/style-paper.css
@@ -203,17 +203,29 @@ h3 {
 .bigtable .description { }
 .bigtable .description .base { font-size: 70%; float: right; line-height: 1.66; }
 .bigtable .node { width: 5em; font-family: monospace;}
 .bigtable .permissions { width: 8em; text-align: left;}
 .bigtable .size { width: 5em; text-align: right; }
 .bigtable .annotate { text-align: right; }
 .bigtable td.annotate { font-size: smaller; }
 .bigtable td.source { font-size: inherit; }
-
+tr.thisrev a { color:#999999; text-decoration: none; }
+tr.thisrev td.source { color:#009900; }
+div.annotate-info {
+  display: none;
+  position: absolute;
+  background-color: #FFFFFF;
+  border: 1px solid #999;
+  text-align: left;
+  color: #000000;
+  padding: 5px;
+}
+div.annotate-info a { color: #0000FF; }
+td.annotate:hover div.annotate-info { display: inline; }
 .source, .sourcefirst {
   font-family: monospace;
   white-space: pre;
   padding: 1px 4px;
   font-size: 90%;
 }
 .sourcefirst { border-bottom: 1px solid #999; font-weight: bold; }
 .source a { color: #999; font-size: smaller; font-family: monospace;}
--- a/hgtemplates/static/style.css
+++ b/hgtemplates/static/style.css
@@ -5,16 +5,29 @@ a { text-decoration:none; }
 .parity0 { background-color: #ddd; color: #000; }
 .parity1 { background-color: #eee; color: #000; }
 .lineno { width: 60px; color: #aaa; font-size: smaller;
           text-align: right; }
 .plusline { color: green; }
 .minusline { color: red; }
 .atline { color: purple; }
 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
+tr.thisrev a { color:#999999; text-decoration: none; }
+tr.thisrev pre { color:#009900; }
+div.annotate-info {
+  display: none;
+  position: absolute;
+  background-color: #FFFFFF;
+  border: 1px solid #000000;
+  text-align: left;
+  color: #000000;
+  padding: 5px;
+}
+div.annotate-info a { color: #0000FF; }
+td.annotate:hover div.annotate-info { display: inline; }
 .buttons a {
   background-color: #666;
   padding: 2pt;
   color: white;
   font-family: sans-serif;
   font-weight: bold;
 }
 .navigate a {