diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -198,9 +198,9 @@ def _abssource(repo, push=False, abort=T or on the top repo config. Abort or return None if no source found.""" if hasattr(repo, '_subparent'): source = util.url(repo._subsource) + if source.isabs(): + return str(source) source.path = posixpath.normpath(source.path) - if posixpath.isabs(source.path) or source.scheme: - return str(source) parent = _abssource(repo._subparent, push, abort=False) if parent: parent = util.url(parent) diff --git a/mercurial/util.py b/mercurial/util.py --- a/mercurial/util.py +++ b/mercurial/util.py @@ -1555,6 +1555,17 @@ class url(object): return (s, (None, (str(self), self.host), self.user, self.passwd or '')) + def isabs(self): + if self.scheme and self.scheme != 'file': + return True # remote URL + if hasdriveletter(self.path): + return True # absolute for our purposes - can't be joined() + if self.path.startswith(r'\\'): + return True # Windows UNC path + if self.path.startswith('/'): + return True # POSIX-style + return False + def localpath(self): if self.scheme == 'file' or self.scheme == 'bundle': path = self.path or '/'