changeset 9842:d3dbdca92458

hgweb: don't choke when an inexistent style is requested (issue1901)
author Dirkjan Ochtman <dirkjan@ochtman.nl>
date Thu, 12 Nov 2009 16:39:11 +0100
parents 7cd6dee6fe37
children d1043c2ffe6c
files mercurial/hgweb/hgweb_mod.py mercurial/hgweb/hgwebdir_mod.py mercurial/templater.py tests/test-hgweb tests/test-hgweb.out
diffstat 5 files changed, 126 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/hgweb/hgweb_mod.py	Thu Nov 12 10:29:40 2009 -0500
+++ b/mercurial/hgweb/hgweb_mod.py	Thu Nov 12 16:39:11 2009 +0100
@@ -237,14 +237,17 @@
         # figure out which style to use
 
         vars = {}
-        style = self.config("web", "style", "paper")
-        if 'style' in req.form:
-            style = req.form['style'][0]
+        styles = (
+            req.form.get('style', [None])[0],
+            self.config('web', 'style'),
+            'paper',
+        )
+        style, mapfile = templater.stylemap(styles, self.templatepath)
+        if style == styles[0]:
             vars['style'] = style
 
         start = req.url[-1] == '?' and '&' or '?'
         sessionvars = webutil.sessionvars(vars, start)
-        mapfile = templater.stylemap(style, self.templatepath)
 
         if not self.reponame:
             self.reponame = (self.config("web", "name")
--- a/mercurial/hgweb/hgwebdir_mod.py	Thu Nov 12 10:29:40 2009 -0500
+++ b/mercurial/hgweb/hgwebdir_mod.py	Thu Nov 12 16:39:11 2009 +0100
@@ -315,18 +315,21 @@
             url += '/'
 
         vars = {}
-        style = self.style
-        if 'style' in req.form:
-            vars['style'] = style = req.form['style'][0]
+        styles = (
+            req.form.get('style', [None])[0],
+            config('web', 'style'),
+            'paper'
+        )
+        style, mapfile = templater.stylemap(styles)
+        if style == styles[0]:
+            vars['style'] = style
+        
         start = url[-1] == '?' and '&' or '?'
         sessionvars = webutil.sessionvars(vars, start)
-
         staticurl = config('web', 'staticurl') or url + 'static/'
         if not staticurl.endswith('/'):
             staticurl += '/'
 
-        style = 'style' in req.form and req.form['style'][0] or self.style
-        mapfile = templater.stylemap(style)
         tmpl = templater.templater(mapfile,
                                    defaults={"header": header,
                                              "footer": footer,
--- a/mercurial/templater.py	Thu Nov 12 10:29:40 2009 -0500
+++ b/mercurial/templater.py	Thu Nov 12 16:39:11 2009 +0100
@@ -220,7 +220,7 @@
 
     return normpaths
 
-def stylemap(style, paths=None):
+def stylemap(styles, paths=None):
     """Return path to mapfile for a given style.
 
     Searches mapfile in the following locations:
@@ -234,12 +234,20 @@
     elif isinstance(paths, str):
         paths = [paths]
 
-    locations = style and [os.path.join(style, "map"), "map-" + style] or []
-    locations.append("map")
-    for path in paths:
-        for location in locations:
-            mapfile = os.path.join(path, location)
-            if os.path.isfile(mapfile):
-                return mapfile
+    if isinstance(styles, str):
+        styles = [styles]
+
+    for style in styles:
+    	
+        if not style:
+            continue
+        locations = [os.path.join(style, 'map'), 'map-' + style]
+        locations.append('map')
+
+        for path in paths:
+            for location in locations:
+                mapfile = os.path.join(path, location)
+                if os.path.isfile(mapfile):
+                    return style, mapfile
 
     raise RuntimeError("No hgweb templates found in %r" % paths)
--- a/tests/test-hgweb	Thu Nov 12 10:29:40 2009 -0500
+++ b/tests/test-hgweb	Thu Nov 12 16:39:11 2009 +0100
@@ -7,8 +7,10 @@
 echo foo > da/foo
 echo foo > foo
 hg ci -Ambase
+
 hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
 cat hg.pid >> $DAEMON_PIDS
+
 echo % manifest
 ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/?style=raw')
 ("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/da?style=raw')
@@ -30,6 +32,9 @@
 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/bork'
 "$TESTDIR/get-with-headers.py" localhost:$HGPORT '/diff/tip/bork?style=raw'
 
+echo % try bad style
+("$TESTDIR/get-with-headers.py" localhost:$HGPORT '/file/tip/?style=foobar')
+
 echo % stop and restart
 "$TESTDIR/killdaemons.py"
 hg serve -p $HGPORT -d --pid-file=hg.pid -A access.log
--- a/tests/test-hgweb.out	Thu Nov 12 10:29:40 2009 -0500
+++ b/tests/test-hgweb.out	Thu Nov 12 16:39:11 2009 +0100
@@ -148,8 +148,96 @@
 
 
 error: bork@2ef0ac749a14: not found in manifest
+% try bad style
+200 Script output follows
+
+<!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" />
+<meta name="robots" content="index, nofollow" />
+<link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
+
+<title>test: 2ef0ac749a14 /</title>
+</head>
+<body>
+
+<div class="container">
+<div class="menu">
+<div class="logo">
+<a href="http://mercurial.selenic.com/">
+<img src="/static/hglogo.png" alt="mercurial" /></a>
+</div>
+<ul>
+<li><a href="/shortlog/2ef0ac749a14">log</a></li>
+<li><a href="/graph/2ef0ac749a14">graph</a></li>
+<li><a href="/tags">tags</a></li>
+<li><a href="/branches">branches</a></li>
+</ul>
+<ul>
+<li><a href="/rev/2ef0ac749a14">changeset</a></li>
+<li class="active">browse</li>
+</ul>
+<ul>
+
+</ul>
+</div>
+
+<div class="main">
+<h2><a href="/">test</a></h2>
+<h3>directory / @ 0:2ef0ac749a14 <span class="tag">tip</span> </h3>
+
+<form class="search" action="/log">
+
+<p><input name="rev" id="search1" type="text" size="30" /></p>
+<div id="hint">find changesets by author, revision,
+files, or words in the commit message</div>
+</form>
+
+<table class="bigtable">
+<tr>
+  <th class="name">name</th>
+  <th class="size">size</th>
+  <th class="permissions">permissions</th>
+</tr>
+<tr class="fileline parity0">
+  <td class="name"><a href="/file/2ef0ac749a14/">[up]</a></td>
+  <td class="size"></td>
+  <td class="permissions">drwxr-xr-x</td>
+</tr>
+
+<tr class="fileline parity1">
+<td class="name">
+<a href="/file/2ef0ac749a14/da">
+<img src="/static/coal-folder.png" alt="dir."/> da/
+</a>
+<a href="/file/2ef0ac749a14/da/">
+
+</a>
+</td>
+<td class="size"></td>
+<td class="permissions">drwxr-xr-x</td>
+</tr>
+
+<tr class="fileline parity0">
+<td class="filename">
+<a href="/file/2ef0ac749a14/foo">
+<img src="/static/coal-file.png" alt="file"/> foo
+</a>
+</td>
+<td class="size">4</td>
+<td class="permissions">-rw-r--r--</td>
+</tr>
+</table>
+</div>
+</div>
+
+
+</body>
+</html>
+
 % stop and restart
-9 log lines written
+10 log lines written
 % static file
 200 Script output follows