[PATCH 1 of 1] hgwebdir_mod.py can now handle 'baseurl' configurations with leading slash
Wujek Srujek
wujek.srujek at googlemail.com
Mon Aug 1 13:24:43 CDT 2011
Hi,
On Mon, Aug 1, 2011 at 8:10 PM, Matt Mackall <mpm at selenic.com> wrote:
> On Mon, 2011-08-01 at 12:03 +0200, wujek.srujek at googlemail.com wrote:
> > # HG changeset patch
> > # User wujek
> > # Date 1312184890 -7200
> > # Node ID 060a118fc62277c5cd71751503db19a7b4183a21
> > # Parent cc2c22511707b13d045f17bb34e865d2393c53cf
> > hgwebdir_mod.py can now handle 'baseurl' configurations with leading
> slash
>
> I've queued the fix for stable, without the test.
>
> Testing hgweb's path handling is known to be extremely trick. We can't
> reasonably emulate all the existing web environments and configs in our
> test suite. So a doctest-style unit test is the right way to move
> forward here. That means:
>
> a) making a purely functional helper function that does the path
> manipulations (no environment or config inputs)
> b) replace the current inline code with a call to the helper function
> c) test all the interesting permutations in a doctest
>
> Here's what I've done on the default branch:
>
> diff -r 00862c7d3eec mercurial/hgweb/hgwebdir_mod.py
> --- a/mercurial/hgweb/hgwebdir_mod.py Mon Aug 01 12:54:00 2011 -0500
> +++ b/mercurial/hgweb/hgwebdir_mod.py Mon Aug 01 13:08:14 2011 -0500
> @@ -51,6 +51,29 @@
> yield (prefix + '/' +
> util.pconvert(path[len(roothead):]).lstrip('/')).strip('/'),
> path
>
> +def geturlcgivars(baseurl, port):
> + """
> + Extract CGI variables from baseurl
> +
> + >>> geturlcgivars("http://host.org/base", "80")
> + ('host.org', '80', '/base')
> + >>> geturlcgivars("http://host.org:8000/base", "80")
> + ('host.org', '8000', '/base')
> + >>> geturlcgivars('/base', 8000)
> + ('', '8000', '/base')
> + >>> geturlcgivars("base", '8000')
> + ('', '8000', '/base')
> + """
> + u = util.url(baseurl)
> + name = u.host or ''
> + if u.port:
> + port = u.port
> + path = u.path
> + if not path.startswith('/'):
> + path = '/' + path
> +
> + return name, str(port), path
> +
> class hgwebdir(object):
> refreshinterval = 20
>
>
Now that I look at the patch, I think the code should be:
path = u.path
if path is not None and not path.startswith('/'):
path = '/' + path
elif path is None:
path = "/"
This handles cases like 'http://host.org/' and 'http://host.org' correctly -
especially the latter results in u.path being None, as in:
>>> from mercurial import util as u
>>> url = u.url('http://host.org')
>>> print url.path
None
and the line 'if not path.startswith('/')' raises TypeError.
What do you think?
Regards,
wujek
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://selenic.com/pipermail/mercurial-devel/attachments/20110801/4a6ec235/attachment.html>
More information about the Mercurial-devel
mailing list