[PATCH 5 of 6] [RFC] hgweb: filter for serving from immutable URLs

Gregory Szorc gregory.szorc at gmail.com
Sat Apr 1 03:29:09 EDT 2017


# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1491028776 25200
#      Fri Mar 31 23:39:36 2017 -0700
# Node ID a5df20af0f27612eee26f04187bd92b6772a5c7e
# Parent  0b8be3d244585f5a2874821418fce41bf7631f6c
[RFC] hgweb: filter for serving from immutable URLs

Now that we have a web command for serving "immutable" content, we
need a mechanism to link to it.

This commit introduces an "immutableurl" template filter active in
hgweb. The filter accepts the path to a file in the "static" directory
for the current templater. If the requested path doesn't exist, the
filter fails fast by raising an exception. Otherwise, it opens the
file, computes its hash, and an escaped path/URL to that file+hash
using the "staticimmutable" web command is returned.

To prove the filter works, we convert all static assets in the paper
style to use this filter. There /might/ be a BC breakage here, since
the config can define web.logoimg and web.staticurl to custom entities.
We /may/ have to prevent the use of immutable URLs when one or both
of these are defined. I haven't fully thought it through yet.

As the tests show, URLs for static files now have their hashes. We'll
probably want to (glob) some of these at some point. For now, I
held off.

It's worth noting that this filter is relative expensive because it
does I/O and hashing. However, if we assume consumers are smart, can
cache, and that there will be a high cache hit rate, the overhead from
I/O and computing hashes will be offset from clients not performing
additional HTTP requests.

If there is a concern about the CPU overhead of hashing, we could
maintain an in-process cache of the hash. We'd still have to do a
stat() and invalidate the hash if the file size and/or mtime changes.
But this would avoid hashing. Since file content will be in the page
cache of most servers and the total size of content being hashed is
likely small (<1 MB), I estimate the overhead for I/O and hashing
to be no more than ~10ms per request. And this will pay for itself
by avoiding round trips on subsequent requests. I don't think it is
worth introducing a cache for this.

As of this change, we still haven't activated aggressive caching of
staticimmutable URLs. So caching clients still issue conditional
HTTP requests and the server still responds with HTTP 304. This
will be addressed shortly.

diff --git a/mercurial/hgweb/common.py b/mercurial/hgweb/common.py
--- a/mercurial/hgweb/common.py
+++ b/mercurial/hgweb/common.py
@@ -147,6 +147,37 @@ def ispathsafe(path):
 
     return True
 
+def immutablestaticurl(templatepaths, baseurl, path):
+    """Resolve an immutable URL for a static asset."""
+    if not ispathsafe(path):
+        raise ValueError('argument contains illegal path or '
+                         'directory separator: %s' % path)
+
+    directories = [os.path.join(p, 'static') for p in templatepaths]
+    fpath = os.path.join(*path.split('/'))
+
+    hash = None
+
+    for directory in directories:
+        full = os.path.join(directory, fpath)
+
+        try:
+            with open(full, 'rb') as fh:
+                hash = hashlib.sha1(fh.read()).hexdigest()
+                break
+        except OSError as e:
+            if e.errno != errno.ENOENT:
+                raise
+
+    # The path requested by the template function could not be found.
+    # Fail fast.
+    if not hash:
+        raise ValueError('could not find static file: %s' % path)
+
+    url = '%sstaticimmutable/%s/%s' % (baseurl, hash, path)
+
+    return util.urlreq.quote(url)
+
 def staticfile(directory, fname, req, immutablehash=None):
     """return a file inside directory with guessed Content-Type header
 
diff --git a/mercurial/hgweb/hgweb_mod.py b/mercurial/hgweb/hgweb_mod.py
--- a/mercurial/hgweb/hgweb_mod.py
+++ b/mercurial/hgweb/hgweb_mod.py
@@ -20,6 +20,7 @@ from .common import (
     HTTP_SERVER_ERROR,
     caching,
     cspvalues,
+    immutablestaticurl,
     permhooks,
 )
 from .request import wsgirequest
@@ -190,6 +191,13 @@ class requestcontext(object):
         def websubfilter(text):
             return templatefilters.websub(text, self.websubtable)
 
+        def immutableurl(path):
+            tp = self.templatepath or templater.templatepaths()
+            if isinstance(tp, str):
+                tp = [tp]
+
+            return immutablestaticurl(tp, req.url, path)
+
         # create the templater
 
         defaults = {
@@ -207,7 +215,10 @@ class requestcontext(object):
             'nonce': self.nonce,
         }
         tmpl = templater.templater.frommapfile(mapfile,
-                                               filters={'websub': websubfilter},
+                                               filters={
+                                                   'immutableurl': immutableurl,
+                                                   'websub': websubfilter,
+                                               },
                                                defaults=defaults)
         return tmpl
 
diff --git a/mercurial/hgweb/hgwebdir_mod.py b/mercurial/hgweb/hgwebdir_mod.py
--- a/mercurial/hgweb/hgwebdir_mod.py
+++ b/mercurial/hgweb/hgwebdir_mod.py
@@ -22,6 +22,7 @@ from .common import (
     cspvalues,
     get_contact,
     get_mtime,
+    immutablestaticurl,
     ismember,
     paritygen,
     staticfile,
@@ -513,6 +514,13 @@ class hgwebdir(object):
         if not staticurl.endswith('/'):
             staticurl += '/'
 
+        def immutableurl(path):
+            tp = self.templatepath or templater.templatepaths()
+            if isinstance(tp, str):
+                tp = [tp]
+
+            return immutablestaticurl(tp, url, path)
+
         defaults = {
             "encoding": encoding.encoding,
             "motd": motd,
@@ -524,7 +532,11 @@ class hgwebdir(object):
             "style": style,
             "nonce": nonce,
         }
-        tmpl = templater.templater.frommapfile(mapfile, defaults=defaults)
+        tmpl = templater.templater.frommapfile(mapfile,
+                                               filters={
+                                                   'immutableurl': immutableurl,
+                                               },
+                                               defaults=defaults)
         return tmpl
 
     def updatereqenv(self, env):
diff --git a/mercurial/templates/paper/bookmarks.tmpl b/mercurial/templates/paper/bookmarks.tmpl
--- a/mercurial/templates/paper/bookmarks.tmpl
+++ b/mercurial/templates/paper/bookmarks.tmpl
@@ -11,7 +11,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
@@ -25,7 +25,7 @@
 </ul>
 <div class="atom-logo">
 <a href="{url|urlescape}atom-bookmarks" title="subscribe to atom feed">
-<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+<img class="atom-logo" src="{"feed-icon-14x14.png"|immutableurl}" alt="atom feed" />
 </a>
 </div>
 </div>
diff --git a/mercurial/templates/paper/branches.tmpl b/mercurial/templates/paper/branches.tmpl
--- a/mercurial/templates/paper/branches.tmpl
+++ b/mercurial/templates/paper/branches.tmpl
@@ -11,7 +11,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
@@ -25,7 +25,7 @@
 </ul>
 <div class="atom-logo">
 <a href="{url|urlescape}atom-branches" title="subscribe to atom feed">
-<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+<img class="atom-logo" src="{"feed-icon-14x14.png"|immutableurl}" alt="atom feed" />
 </a>
 </div>
 </div>
diff --git a/mercurial/templates/paper/changeset.tmpl b/mercurial/templates/paper/changeset.tmpl
--- a/mercurial/templates/paper/changeset.tmpl
+++ b/mercurial/templates/paper/changeset.tmpl
@@ -6,7 +6,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
  <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/error.tmpl b/mercurial/templates/paper/error.tmpl
--- a/mercurial/templates/paper/error.tmpl
+++ b/mercurial/templates/paper/error.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" width=75 height=90 border=0 alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" width=75 height=90 border=0 alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/fileannotate.tmpl b/mercurial/templates/paper/fileannotate.tmpl
--- a/mercurial/templates/paper/fileannotate.tmpl
+++ b/mercurial/templates/paper/fileannotate.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/filecomparison.tmpl b/mercurial/templates/paper/filecomparison.tmpl
--- a/mercurial/templates/paper/filecomparison.tmpl
+++ b/mercurial/templates/paper/filecomparison.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/filediff.tmpl b/mercurial/templates/paper/filediff.tmpl
--- a/mercurial/templates/paper/filediff.tmpl
+++ b/mercurial/templates/paper/filediff.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/filelog.tmpl b/mercurial/templates/paper/filelog.tmpl
--- a/mercurial/templates/paper/filelog.tmpl
+++ b/mercurial/templates/paper/filelog.tmpl
@@ -11,7 +11,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
@@ -37,7 +37,7 @@
 </ul>
 <div class="atom-logo">
 <a href="{url|urlescape}atom-log/tip/{file|urlescape}" title="subscribe to atom feed">
-<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+<img class="atom-logo" src="{"feed-icon-14x14.png"|immutableurl}" alt="atom feed" />
 </a>
 </div>
 </div>
diff --git a/mercurial/templates/paper/filerevision.tmpl b/mercurial/templates/paper/filerevision.tmpl
--- a/mercurial/templates/paper/filerevision.tmpl
+++ b/mercurial/templates/paper/filerevision.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
@@ -74,7 +74,7 @@
 <pre class="sourcelines stripes4 wrap bottomline" data-logurl="{url|urlescape}log/{symrev}/{file|urlescape}">{text%fileline}</pre>
 </div>
 
-<script type="text/javascript" src="{staticurl|urlescape}linerangelog.js"></script>
+<script type="text/javascript" src="{"linerangelog.js"|immutableurl}"></script>
 
 </div>
 </div>
diff --git a/mercurial/templates/paper/graph.tmpl b/mercurial/templates/paper/graph.tmpl
--- a/mercurial/templates/paper/graph.tmpl
+++ b/mercurial/templates/paper/graph.tmpl
@@ -4,7 +4,7 @@
    href="{url|urlescape}atom-log" title="Atom feed for {repo|escape}: log" />
 <link rel="alternate" type="application/rss+xml"
    href="{url|urlescape}rss-log" title="RSS feed for {repo|escape}: log" />
-<!--[if IE]><script type="text/javascript" src="{staticurl|urlescape}excanvas.js"></script><![endif]-->
+<!--[if IE]><script type="text/javascript" src="{"excanvas.js"|immutableurl}"></script><![endif]-->
 </head>
 <body>
 
@@ -12,7 +12,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
@@ -30,7 +30,7 @@
 </ul>
 <div class="atom-logo">
 <a href="{url|urlescape}atom-log" title="subscribe to atom feed">
-<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+<img class="atom-logo" src="{"feed-icon-14x14.png"|immutableurl}" alt="atom feed" />
 </a>
 </div>
 </div>
diff --git a/mercurial/templates/paper/header.tmpl b/mercurial/templates/paper/header.tmpl
--- a/mercurial/templates/paper/header.tmpl
+++ b/mercurial/templates/paper/header.tmpl
@@ -1,7 +1,7 @@
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
 <head>
-<link rel="icon" href="{staticurl|urlescape}hgicon.png" type="image/png" />
+<link rel="icon" href="{"hgicon.png"|immutableurl}" type="image/png" />
 <meta name="robots" content="index, nofollow" />
-<link rel="stylesheet" href="{staticurl|urlescape}style-paper.css" type="text/css" />
-<script type="text/javascript" src="{staticurl|urlescape}mercurial.js"></script>
+<link rel="stylesheet" href="{"style-paper.css"|immutableurl}" type="text/css" />
+<script type="text/javascript" src="{"mercurial.js"|immutableurl}"></script>
diff --git a/mercurial/templates/paper/help.tmpl b/mercurial/templates/paper/help.tmpl
--- a/mercurial/templates/paper/help.tmpl
+++ b/mercurial/templates/paper/help.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/helptopics.tmpl b/mercurial/templates/paper/helptopics.tmpl
--- a/mercurial/templates/paper/helptopics.tmpl
+++ b/mercurial/templates/paper/helptopics.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/index.tmpl b/mercurial/templates/paper/index.tmpl
--- a/mercurial/templates/paper/index.tmpl
+++ b/mercurial/templates/paper/index.tmpl
@@ -6,7 +6,7 @@
 <div class="container">
 <div class="menu">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" width=75 height=90 border=0 alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" width=75 height=90 border=0 alt="mercurial" /></a>
 </div>
 <div class="main">
 <h2 class="breadcrumb"><a href="/">Mercurial</a> {pathdef%breadcrumb}</h2>
diff --git a/mercurial/templates/paper/manifest.tmpl b/mercurial/templates/paper/manifest.tmpl
--- a/mercurial/templates/paper/manifest.tmpl
+++ b/mercurial/templates/paper/manifest.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog/{symrev}{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/map b/mercurial/templates/paper/map
--- a/mercurial/templates/paper/map
+++ b/mercurial/templates/paper/map
@@ -45,7 +45,7 @@ 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}/
+        <img src="{"coal-folder.png"|immutableurl}" alt="dir."/> {basename|escape}/
       </a>
       <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
         {emptydirs|escape}
@@ -59,7 +59,7 @@ 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}
+        <img src="{"coal-file.png"|immutableurl}" alt="file"/> {basename|escape}
       </a>
     </td>
     <td class="size">{size}</td>
@@ -226,7 +226,7 @@ indexentry = '
     <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">
+                <img class="atom-logo" src="{"feed-icon-14x14.png"|immutableurl}" alt="subscribe to repository atom feed">
             </a>'
             )}
     </td>
diff --git a/mercurial/templates/paper/search.tmpl b/mercurial/templates/paper/search.tmpl
--- a/mercurial/templates/paper/search.tmpl
+++ b/mercurial/templates/paper/search.tmpl
@@ -7,7 +7,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" width=75 height=90 border=0 alt="mercurial"></a>
+<img src="{logoimg|immutableurl}" width=75 height=90 border=0 alt="mercurial"></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
diff --git a/mercurial/templates/paper/shortlog.tmpl b/mercurial/templates/paper/shortlog.tmpl
--- a/mercurial/templates/paper/shortlog.tmpl
+++ b/mercurial/templates/paper/shortlog.tmpl
@@ -11,7 +11,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li class="active">log</li>
@@ -32,7 +32,7 @@
 </ul>
 <div class="atom-logo">
 <a href="{url|urlescape}atom-log" title="subscribe to atom feed">
-<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+<img class="atom-logo" src="{"feed-icon-14x14.png"|immutableurl}" alt="atom feed" />
 </a>
 </div>
 </div>
diff --git a/mercurial/templates/paper/tags.tmpl b/mercurial/templates/paper/tags.tmpl
--- a/mercurial/templates/paper/tags.tmpl
+++ b/mercurial/templates/paper/tags.tmpl
@@ -11,7 +11,7 @@
 <div class="menu">
 <div class="logo">
 <a href="{logourl}">
-<img src="{staticurl|urlescape}{logoimg}" alt="mercurial" /></a>
+<img src="{logoimg|immutableurl}" alt="mercurial" /></a>
 </div>
 <ul>
 <li><a href="{url|urlescape}shortlog{sessionvars%urlparameter}">log</a></li>
@@ -25,7 +25,7 @@
 </ul>
 <div class="atom-logo">
 <a href="{url|urlescape}atom-tags" title="subscribe to atom feed">
-<img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="atom feed" />
+<img class="atom-logo" src="{"feed-icon-14x14.png"|immutableurl}" alt="atom feed" />
 </a>
 </div>
 </div>
diff --git a/tests/test-help.t b/tests/test-help.t
--- a/tests/test-help.t
+++ b/tests/test-help.t
@@ -1860,10 +1860,10 @@ Dish up an empty repo; serve it cold.
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Help: Index</title>
   </head>
@@ -1873,7 +1873,7 @@ Dish up an empty repo; serve it cold.
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -2443,10 +2443,10 @@ Dish up an empty repo; serve it cold.
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Help: add</title>
   </head>
@@ -2456,7 +2456,7 @@ Dish up an empty repo; serve it cold.
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -2623,10 +2623,10 @@ Dish up an empty repo; serve it cold.
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Help: remove</title>
   </head>
@@ -2636,7 +2636,7 @@ Dish up an empty repo; serve it cold.
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -2824,10 +2824,10 @@ Dish up an empty repo; serve it cold.
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Help: dates</title>
   </head>
@@ -2837,7 +2837,7 @@ Dish up an empty repo; serve it cold.
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -2931,10 +2931,10 @@ Sub-topic indexes rendered properly
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Help: internals</title>
   </head>
@@ -2944,7 +2944,7 @@ Sub-topic indexes rendered properly
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -3034,10 +3034,10 @@ Sub-topic topics rendered properly
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Help: internals.changegroups</title>
   </head>
@@ -3047,7 +3047,7 @@ Sub-topic topics rendered properly
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
diff --git a/tests/test-hgweb-commands.t b/tests/test-hgweb-commands.t
--- a/tests/test-hgweb-commands.t
+++ b/tests/test-hgweb-commands.t
@@ -700,10 +700,10 @@ Logs and changes
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: log</title>
   <link rel="alternate" type="application/atom+xml"
@@ -717,7 +717,7 @@ Logs and changes
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li class="active">log</li>
@@ -738,7 +738,7 @@ Logs and changes
   </ul>
   <div class="atom-logo">
   <a href="/atom-log" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -840,10 +840,10 @@ Logs and changes
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: 2ef0ac749a14</title>
   </head>
@@ -852,7 +852,7 @@ Logs and changes
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
    <li><a href="/shortlog/0">log</a></li>
@@ -988,10 +988,10 @@ Logs and changes
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: searching for base</title>
   </head>
@@ -1001,7 +1001,7 @@ Logs and changes
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -1265,10 +1265,10 @@ File-related
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a4f92ed23982 foo</title>
   </head>
@@ -1278,7 +1278,7 @@ File-related
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/1">log</a></li>
@@ -1347,7 +1347,7 @@ File-related
   <span id="l1">foo</span><a href="#l1"></a></pre>
   </div>
   
-  <script type="text/javascript" src="/static/linerangelog.js"></script>
+  <script type="text/javascript" src="/staticimmutable/bb35aa7fc76ca8e870885a4dd268fa767ac4c790/linerangelog.js"></script>
   
   </div>
   </div>
@@ -1393,10 +1393,10 @@ File-related
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: 1d22e65f027e foo</title>
   </head>
@@ -1406,7 +1406,7 @@ File-related
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/2">log</a></li>
@@ -1475,7 +1475,7 @@ File-related
   <span id="l1">another</span><a href="#l1"></a></pre>
   </div>
   
-  <script type="text/javascript" src="/static/linerangelog.js"></script>
+  <script type="text/javascript" src="/staticimmutable/bb35aa7fc76ca8e870885a4dd268fa767ac4c790/linerangelog.js"></script>
   
   </div>
   </div>
diff --git a/tests/test-hgweb-csp.t b/tests/test-hgweb-csp.t
--- a/tests/test-hgweb-csp.t
+++ b/tests/test-hgweb-csp.t
@@ -64,8 +64,8 @@ repo page should send CSP by default, in
 nonce should not be added to html if CSP doesn't use it
 
   $ get-with-headers.py localhost:$HGPORT repo1/graph/tip | egrep 'content-security-policy|<script'
-  <script type="text/javascript" src="/repo1/static/mercurial.js"></script>
-  <!--[if IE]><script type="text/javascript" src="/repo1/static/excanvas.js"></script><![endif]-->
+  <script type="text/javascript" src="/repo1/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
+  <!--[if IE]><script type="text/javascript" src="/repo1/staticimmutable/f0e4d90b4b7b5ce7a48c24f1252a06a35a3bcc84/excanvas.js"></script><![endif]-->
   <script type="text/javascript">
   <script type="text/javascript">
 
@@ -101,8 +101,8 @@ nonce should be added to html when used
 
   $ get-with-headers.py localhost:$HGPORT repo1/graph/tip content-security-policy | egrep 'content-security-policy|<script'
   content-security-policy: image-src 'self'; script-src https://example.com/ 'nonce-*' (glob)
-  <script type="text/javascript" src="/repo1/static/mercurial.js"></script>
-  <!--[if IE]><script type="text/javascript" src="/repo1/static/excanvas.js"></script><![endif]-->
+  <script type="text/javascript" src="/repo1/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
+  <!--[if IE]><script type="text/javascript" src="/repo1/staticimmutable/f0e4d90b4b7b5ce7a48c24f1252a06a35a3bcc84/excanvas.js"></script><![endif]-->
   <script type="text/javascript" nonce="*"> (glob)
   <script type="text/javascript" nonce="*"> (glob)
 
@@ -123,7 +123,7 @@ nonce included in <script> and headers
 
   $ get-with-headers.py localhost:$HGPORT graph/tip content-security-policy  | egrep 'content-security-policy|<script'
   content-security-policy: image-src 'self'; script-src https://example.com/ 'nonce-*' (glob)
-  <script type="text/javascript" src="/static/mercurial.js"></script>
-  <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
+  <!--[if IE]><script type="text/javascript" src="/staticimmutable/f0e4d90b4b7b5ce7a48c24f1252a06a35a3bcc84/excanvas.js"></script><![endif]-->
   <script type="text/javascript" nonce="*"> (glob)
   <script type="text/javascript" nonce="*"> (glob)
diff --git a/tests/test-hgweb-descend-empties.t b/tests/test-hgweb-descend-empties.t
--- a/tests/test-hgweb-descend-empties.t
+++ b/tests/test-hgweb-descend-empties.t
@@ -35,10 +35,10 @@ manifest with descending (paper)
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: c9f45f7a1659 /</title>
   </head>
@@ -48,7 +48,7 @@ manifest with descending (paper)
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -101,7 +101,7 @@ manifest with descending (paper)
   <tr class="fileline">
   <td class="name">
   <a href="/file/tip/a1">
-  <img src="/static/coal-folder.png" alt="dir."/> a1/
+  <img src="/staticimmutable/4344acdae382132a3d57b077eeae0f59087a0be6/coal-folder.png" alt="dir."/> a1/
   </a>
   <a href="/file/tip/a1/a2/a3/a4">
   a2/a3/a4
@@ -113,7 +113,7 @@ manifest with descending (paper)
   <tr class="fileline">
   <td class="name">
   <a href="/file/tip/b1">
-  <img src="/static/coal-folder.png" alt="dir."/> b1/
+  <img src="/staticimmutable/4344acdae382132a3d57b077eeae0f59087a0be6/coal-folder.png" alt="dir."/> b1/
   </a>
   <a href="/file/tip/b1/b2/b3">
   b2/b3
@@ -125,7 +125,7 @@ manifest with descending (paper)
   <tr class="fileline">
   <td class="name">
   <a href="/file/tip/d1">
-  <img src="/static/coal-folder.png" alt="dir."/> d1/
+  <img src="/staticimmutable/4344acdae382132a3d57b077eeae0f59087a0be6/coal-folder.png" alt="dir."/> d1/
   </a>
   <a href="/file/tip/d1/d2">
   d2
@@ -167,7 +167,7 @@ manifest with descending (coal)
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip?style=coal">log</a></li>
@@ -220,7 +220,7 @@ manifest with descending (coal)
   <tr class="fileline">
   <td class="name">
   <a href="/file/tip/a1?style=coal">
-  <img src="/static/coal-folder.png" alt="dir."/> a1/
+  <img src="/staticimmutable/4344acdae382132a3d57b077eeae0f59087a0be6/coal-folder.png" alt="dir."/> a1/
   </a>
   <a href="/file/tip/a1/a2/a3/a4?style=coal">
   a2/a3/a4
@@ -232,7 +232,7 @@ manifest with descending (coal)
   <tr class="fileline">
   <td class="name">
   <a href="/file/tip/b1?style=coal">
-  <img src="/static/coal-folder.png" alt="dir."/> b1/
+  <img src="/staticimmutable/4344acdae382132a3d57b077eeae0f59087a0be6/coal-folder.png" alt="dir."/> b1/
   </a>
   <a href="/file/tip/b1/b2/b3?style=coal">
   b2/b3
@@ -244,7 +244,7 @@ manifest with descending (coal)
   <tr class="fileline">
   <td class="name">
   <a href="/file/tip/d1?style=coal">
-  <img src="/static/coal-folder.png" alt="dir."/> d1/
+  <img src="/staticimmutable/4344acdae382132a3d57b077eeae0f59087a0be6/coal-folder.png" alt="dir."/> d1/
   </a>
   <a href="/file/tip/d1/d2?style=coal">
   d2
diff --git a/tests/test-hgweb-diffs.t b/tests/test-hgweb-diffs.t
--- a/tests/test-hgweb-diffs.t
+++ b/tests/test-hgweb-diffs.t
@@ -42,10 +42,10 @@ revision
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: 0cd96de13884</title>
   </head>
@@ -54,7 +54,7 @@ revision
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
    <li><a href="/shortlog/0">log</a></li>
@@ -209,10 +209,10 @@ diff removed file
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: b diff</title>
   </head>
@@ -222,7 +222,7 @@ diff removed file
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -318,10 +318,10 @@ revision
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: 0cd96de13884</title>
   </head>
@@ -330,7 +330,7 @@ revision
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
    <li><a href="/shortlog/0">log</a></li>
@@ -489,10 +489,10 @@ diff modified file
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a diff</title>
   </head>
@@ -502,7 +502,7 @@ diff modified file
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -594,10 +594,10 @@ comparison new file
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a comparison</title>
   </head>
@@ -607,7 +607,7 @@ comparison new file
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/0">log</a></li>
@@ -723,10 +723,10 @@ comparison existing file
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a comparison</title>
   </head>
@@ -736,7 +736,7 @@ comparison existing file
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -854,10 +854,10 @@ comparison removed file
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a comparison</title>
   </head>
@@ -867,7 +867,7 @@ comparison removed file
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -991,10 +991,10 @@ comparison not-modified file
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: e comparison</title>
   </head>
@@ -1004,7 +1004,7 @@ comparison not-modified file
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
diff --git a/tests/test-hgweb-empty.t b/tests/test-hgweb-empty.t
--- a/tests/test-hgweb-empty.t
+++ b/tests/test-hgweb-empty.t
@@ -12,10 +12,10 @@ Some tests for hgweb in an empty reposit
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: log</title>
   <link rel="alternate" type="application/atom+xml"
@@ -29,7 +29,7 @@ Some tests for hgweb in an empty reposit
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li class="active">log</li>
@@ -50,7 +50,7 @@ Some tests for hgweb in an empty reposit
   </ul>
   <div class="atom-logo">
   <a href="/atom-log" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -122,10 +122,10 @@ Some tests for hgweb in an empty reposit
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: log</title>
   <link rel="alternate" type="application/atom+xml"
@@ -139,7 +139,7 @@ Some tests for hgweb in an empty reposit
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li class="active">log</li>
@@ -160,7 +160,7 @@ Some tests for hgweb in an empty reposit
   </ul>
   <div class="atom-logo">
   <a href="/atom-log" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -230,17 +230,17 @@ Some tests for hgweb in an empty reposit
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: revision graph</title>
   <link rel="alternate" type="application/atom+xml"
      href="/atom-log" title="Atom feed for test: log" />
   <link rel="alternate" type="application/rss+xml"
      href="/rss-log" title="RSS feed for test: log" />
-  <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
+  <!--[if IE]><script type="text/javascript" src="/staticimmutable/f0e4d90b4b7b5ce7a48c24f1252a06a35a3bcc84/excanvas.js"></script><![endif]-->
   </head>
   <body>
   
@@ -248,7 +248,7 @@ Some tests for hgweb in an empty reposit
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -266,7 +266,7 @@ Some tests for hgweb in an empty reposit
   </ul>
   <div class="atom-logo">
   <a href="/atom-log" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -383,10 +383,10 @@ Some tests for hgweb in an empty reposit
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: 000000000000 /</title>
   </head>
@@ -396,7 +396,7 @@ Some tests for hgweb in an empty reposit
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
diff --git a/tests/test-hgweb-filelog.t b/tests/test-hgweb-filelog.t
--- a/tests/test-hgweb-filelog.t
+++ b/tests/test-hgweb-filelog.t
@@ -137,10 +137,10 @@ tip - two revisions
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a history</title>
   <link rel="alternate" type="application/atom+xml"
@@ -154,7 +154,7 @@ tip - two revisions
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -180,7 +180,7 @@ tip - two revisions
   </ul>
   <div class="atom-logo">
   <a href="/atom-log/tip/a" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -259,10 +259,10 @@ second version - two revisions
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a history</title>
   <link rel="alternate" type="application/atom+xml"
@@ -276,7 +276,7 @@ second version - two revisions
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/4">log</a></li>
@@ -302,7 +302,7 @@ second version - two revisions
   </ul>
   <div class="atom-logo">
   <a href="/atom-log/tip/a" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -381,10 +381,10 @@ first deleted - one revision
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a history</title>
   <link rel="alternate" type="application/atom+xml"
@@ -398,7 +398,7 @@ first deleted - one revision
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/3">log</a></li>
@@ -424,7 +424,7 @@ first deleted - one revision
   </ul>
   <div class="atom-logo">
   <a href="/atom-log/tip/a" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -494,10 +494,10 @@ first version - one revision
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a history</title>
   <link rel="alternate" type="application/atom+xml"
@@ -511,7 +511,7 @@ first version - one revision
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/1">log</a></li>
@@ -537,7 +537,7 @@ first version - one revision
   </ul>
   <div class="atom-logo">
   <a href="/atom-log/tip/a" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -607,10 +607,10 @@ before addition - error
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: error</title>
   </head>
@@ -620,7 +620,7 @@ before addition - error
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -683,10 +683,10 @@ before addition - error
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: c history</title>
   <link rel="alternate" type="application/atom+xml"
@@ -700,7 +700,7 @@ before addition - error
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -726,7 +726,7 @@ before addition - error
   </ul>
   <div class="atom-logo">
   <a href="/atom-log/tip/c" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -802,10 +802,10 @@ before addition - error
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: c history</title>
   <link rel="alternate" type="application/atom+xml"
@@ -819,7 +819,7 @@ before addition - error
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip?revcount=1">log</a></li>
@@ -845,7 +845,7 @@ before addition - error
   </ul>
   <div class="atom-logo">
   <a href="/atom-log/tip/c" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -1038,10 +1038,10 @@ filelog with patch
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a history</title>
   <link rel="alternate" type="application/atom+xml"
@@ -1055,7 +1055,7 @@ filelog with patch
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/4">log</a></li>
@@ -1081,7 +1081,7 @@ filelog with patch
   </ul>
   <div class="atom-logo">
   <a href="/atom-log/tip/a" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
@@ -1318,10 +1318,10 @@ filelog with 'linerange' and 'patch'
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: c history</title>
   <link rel="alternate" type="application/atom+xml"
@@ -1335,7 +1335,7 @@ filelog with 'linerange' and 'patch'
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -1361,7 +1361,7 @@ filelog with 'linerange' and 'patch'
   </ul>
   <div class="atom-logo">
   <a href="/atom-log/tip/c" title="subscribe to atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   </a>
   </div>
   </div>
diff --git a/tests/test-hgweb-removed.t b/tests/test-hgweb-removed.t
--- a/tests/test-hgweb-removed.t
+++ b/tests/test-hgweb-removed.t
@@ -23,10 +23,10 @@ revision
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: c78f6c5cbea9</title>
   </head>
@@ -35,7 +35,7 @@ revision
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
    <li><a href="/shortlog/tip">log</a></li>
@@ -145,10 +145,10 @@ diff removed file
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: a diff</title>
   </head>
@@ -158,7 +158,7 @@ diff removed file
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
diff --git a/tests/test-hgweb.t b/tests/test-hgweb.t
--- a/tests/test-hgweb.t
+++ b/tests/test-hgweb.t
@@ -49,10 +49,10 @@ should give a 404 - static file that doe
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: error</title>
   </head>
@@ -62,7 +62,7 @@ should give a 404 - static file that doe
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -114,10 +114,10 @@ staticimmutable without all path compone
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: error</title>
   </head>
@@ -127,7 +127,7 @@ staticimmutable without all path compone
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -179,10 +179,10 @@ staticimmutable with a bogus hash should
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: error</title>
   </head>
@@ -192,7 +192,7 @@ staticimmutable with a bogus hash should
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -286,10 +286,10 @@ should give a 404 - file does not exist
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: error</title>
   </head>
@@ -299,7 +299,7 @@ should give a 404 - file does not exist
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog">log</a></li>
@@ -357,10 +357,10 @@ try bad style
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>test: 2ef0ac749a14 /</title>
   </head>
@@ -370,7 +370,7 @@ try bad style
   <div class="menu">
   <div class="logo">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   </div>
   <ul>
   <li><a href="/shortlog/tip">log</a></li>
@@ -423,7 +423,7 @@ try bad style
   <tr class="fileline">
   <td class="name">
   <a href="/file/tip/da">
-  <img src="/static/coal-folder.png" alt="dir."/> da/
+  <img src="/staticimmutable/4344acdae382132a3d57b077eeae0f59087a0be6/coal-folder.png" alt="dir."/> da/
   </a>
   <a href="/file/tip/da/">
   
@@ -436,7 +436,7 @@ try bad style
   <tr class="fileline">
   <td class="filename">
   <a href="/file/tip/foo">
-  <img src="/static/coal-file.png" alt="file"/> foo
+  <img src="/staticimmutable/0345c7e277ff8bacfa2044a045f24ca3c96b8a75/coal-file.png" alt="file"/> foo
   </a>
   </td>
   <td class="size">4</td>
diff --git a/tests/test-hgwebdir.t b/tests/test-hgwebdir.t
--- a/tests/test-hgwebdir.t
+++ b/tests/test-hgwebdir.t
@@ -422,10 +422,10 @@ should succeed, slashy names
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Mercurial repositories index</title>
   </head>
@@ -434,7 +434,7 @@ should succeed, slashy names
   <div class="container">
   <div class="menu">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
   </div>
   <div class="main">
   <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
@@ -460,7 +460,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/t/a/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -473,7 +473,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/b/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -486,7 +486,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/coll/a/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -499,7 +499,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/coll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -512,7 +512,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/coll/b/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -525,7 +525,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/coll/c/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -538,7 +538,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/coll/notrepo/e/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -551,7 +551,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/coll/notrepo/f/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -564,7 +564,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/a/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -577,7 +577,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -590,7 +590,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/b/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -603,7 +603,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/b/d/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -616,7 +616,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/c/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -629,7 +629,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/notrepo/e/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -642,7 +642,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -655,7 +655,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/notrepo/f/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -668,7 +668,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/rcoll/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -681,7 +681,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/star/webdir/a/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -694,7 +694,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/star/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -707,7 +707,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/star/webdir/b/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -720,7 +720,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/star/webdir/c/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -733,7 +733,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/star/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -746,7 +746,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/star/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -759,7 +759,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/a/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -772,7 +772,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -785,7 +785,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/b/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -798,7 +798,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/b/d/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -811,7 +811,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/c/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -824,7 +824,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -837,7 +837,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -850,7 +850,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -863,7 +863,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/starstar/webdir/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -876,7 +876,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/astar/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -889,7 +889,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/astar/.hg/patches/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -921,10 +921,10 @@ should succeed, slashy names
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Mercurial repositories index</title>
   </head>
@@ -933,7 +933,7 @@ should succeed, slashy names
   <div class="container">
   <div class="menu">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
   </div>
   <div class="main">
   <h2 class="breadcrumb"><a href="/">Mercurial</a> > <a href="/t">t</a> </h2>
@@ -959,7 +959,7 @@ should succeed, slashy names
   <td class="indexlinks"></td>
   <td>
   <a href="/t/a/atom-log" title="subscribe to repository atom feed">
-  <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
+  <img class="atom-logo" src="/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="subscribe to repository atom feed">
   </a>
   </td>
   </tr>
@@ -1371,10 +1371,10 @@ test inexistent and inaccessible repo sh
   <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
   <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
   <head>
-  <link rel="icon" href="/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   
   <title>Mercurial repositories index</title>
   </head>
@@ -1383,7 +1383,7 @@ test inexistent and inaccessible repo sh
   <div class="container">
   <div class="menu">
   <a href="https://mercurial-scm.org/">
-  <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
+  <img src="/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
   </div>
   <div class="main">
   <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
@@ -1605,13 +1605,13 @@ immediately.
   <a href="/dir1/a_repo/b_repo/atom-log" title="subscribe to repository atom feed">
 
   $ get-with-headers.py localhost:$HGPORT1 'dir1/a_repo' | grep 'a_repo'
-  <link rel="icon" href="/dir1/a_repo/static/hgicon.png" type="image/png" />
-  <link rel="stylesheet" href="/dir1/a_repo/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/dir1/a_repo/static/mercurial.js"></script>
+  <link rel="icon" href="/dir1/a_repo/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
+  <link rel="stylesheet" href="/dir1/a_repo/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/dir1/a_repo/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   <title>dir1/a_repo: log</title>
      href="/dir1/a_repo/atom-log" title="Atom feed for dir1/a_repo" />
      href="/dir1/a_repo/rss-log" title="RSS feed for dir1/a_repo" />
-  <img src="/dir1/a_repo/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/dir1/a_repo/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   <li><a href="/dir1/a_repo/graph/tip">graph</a></li>
   <li><a href="/dir1/a_repo/tags">tags</a></li>
   <li><a href="/dir1/a_repo/bookmarks">bookmarks</a></li>
@@ -1620,7 +1620,7 @@ immediately.
   <li><a href="/dir1/a_repo/file/tip">browse</a></li>
    <li><a href="/dir1/a_repo/help">help</a></li>
   <a href="/dir1/a_repo/atom-log" title="subscribe to atom feed">
-  <img class="atom-logo" src="/dir1/a_repo/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/dir1/a_repo/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   <h2 class="breadcrumb"><a href="/">Mercurial</a> > <a href="/dir1">dir1</a> > <a href="/dir1/a_repo">a_repo</a> </h2>
   <form class="search" action="/dir1/a_repo/log">
   number or hash, or <a href="/dir1/a_repo/help/revsets">revset expression</a>.</div>
@@ -1649,14 +1649,14 @@ Files named 'index' are not blocked
 Repos named 'index' take precedence over the index file
 
   $ get-with-headers.py localhost:$HGPORT1 'dir1/dir2/index' | grep 'index'
-  <link rel="icon" href="/dir1/dir2/index/static/hgicon.png" type="image/png" />
+  <link rel="icon" href="/dir1/dir2/index/staticimmutable/5b5e826e12e562cbca299328fdb05f1f19c9f10c/hgicon.png" type="image/png" />
   <meta name="robots" content="index, nofollow" />
-  <link rel="stylesheet" href="/dir1/dir2/index/static/style-paper.css" type="text/css" />
-  <script type="text/javascript" src="/dir1/dir2/index/static/mercurial.js"></script>
+  <link rel="stylesheet" href="/dir1/dir2/index/staticimmutable/a203ad86ce2f3fc6ac1185034afcb03512c85f53/style-paper.css" type="text/css" />
+  <script type="text/javascript" src="/dir1/dir2/index/staticimmutable/9f766e7826f00cb53fd8665c1f3090b140619bb8/mercurial.js"></script>
   <title>dir1/dir2/index: log</title>
      href="/dir1/dir2/index/atom-log" title="Atom feed for dir1/dir2/index" />
      href="/dir1/dir2/index/rss-log" title="RSS feed for dir1/dir2/index" />
-  <img src="/dir1/dir2/index/static/hglogo.png" alt="mercurial" /></a>
+  <img src="/dir1/dir2/index/staticimmutable/e8690644d0bb4d35db4a08e469905a0c5ce363b7/hglogo.png" alt="mercurial" /></a>
   <li><a href="/dir1/dir2/index/graph/tip">graph</a></li>
   <li><a href="/dir1/dir2/index/tags">tags</a></li>
   <li><a href="/dir1/dir2/index/bookmarks">bookmarks</a></li>
@@ -1665,7 +1665,7 @@ Repos named 'index' take precedence over
   <li><a href="/dir1/dir2/index/file/tip">browse</a></li>
    <li><a href="/dir1/dir2/index/help">help</a></li>
   <a href="/dir1/dir2/index/atom-log" title="subscribe to atom feed">
-  <img class="atom-logo" src="/dir1/dir2/index/static/feed-icon-14x14.png" alt="atom feed" />
+  <img class="atom-logo" src="/dir1/dir2/index/staticimmutable/30733f525b9d191ac4720041a49fc2d17f4c99a1/feed-icon-14x14.png" alt="atom feed" />
   <h2 class="breadcrumb"><a href="/">Mercurial</a> > <a href="/dir1">dir1</a> > <a href="/dir1/dir2">dir2</a> > <a href="/dir1/dir2/index">index</a> </h2>
   <form class="search" action="/dir1/dir2/index/log">
   number or hash, or <a href="/dir1/dir2/index/help/revsets">revset expression</a>.</div>


More information about the Mercurial-devel mailing list