diff --git a/hgext/schemes.py b/hgext/schemes.py --- a/hgext/schemes.py +++ b/hgext/schemes.py @@ -72,9 +72,10 @@ class ShortRepository(object): return hg._peerlookup(url).instance(ui, url, create) def hasdriveletter(orig, path): - for scheme in schemes: - if path.startswith(scheme + ':'): - return False + if path: + for scheme in schemes: + if path.startswith(scheme + ':'): + return False return orig(path) schemes = { diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -1629,6 +1629,8 @@ class url(object): 'path' >>> str(url('file:///tmp/foo/bar')) 'file:///tmp/foo/bar' + >>> str(url('file:///c:/tmp/foo/bar')) + 'file:///c%3A/tmp/foo/bar' >>> print url(r'bundle:foo\bar') bundle:foo\bar """ @@ -1643,8 +1645,11 @@ class url(object): s = self.scheme + ':' if self.user or self.passwd or self.host: s += '//' - elif self.scheme and (not self.path or self.path.startswith('/')): + elif self.scheme and (not self.path or self.path.startswith('/') + or hasdriveletter(self.path)): s += '//' + if hasdriveletter(self.path): + s += '/' if self.user: s += urllib.quote(self.user, safe=self._safechars) if self.passwd: @@ -1716,7 +1721,7 @@ def hasscheme(path): return bool(url(path).scheme) def hasdriveletter(path): - return path[1:2] == ':' and path[0:1].isalpha() + return path and path[1:2] == ':' and path[0:1].isalpha() def urllocalpath(path): return url(path, parsequery=False, parsefragment=False).localpath() diff --git a/tests/test-url.py b/tests/test-url.py --- a/tests/test-url.py +++ b/tests/test-url.py @@ -219,7 +219,7 @@ def test_url(): >>> u >>> str(u) - 'file:f%3Aoo/bar/baz' + 'file:///f%3Aoo/bar/baz' >>> u.localpath() 'f:oo/bar/baz'