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

Augie Fackler raf at durin42.com
Mon Apr 3 15:43:25 EDT 2017


On Sat, Apr 01, 2017 at 12:29:09AM -0700, Gregory Szorc wrote:
> # 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.

We should probably figure that out and then just land this series - it
seems like the right thing to do.

>
> 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.

I'm not sure how I feel about redoing the hash constantly, but would
like to hear from others.

>
> 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>
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list