Mercurial > public > mercurial-scm > hg
comparison mercurial/subrepo.py @ 13771:ce6227306c9a
subrepos: use url.url when normalizing repo paths
This works around an issue in older versions of Python that would
strip double slashes from SSH URLs when using urlunparse() on a parsed
URL.
Related issues:
- issue1755: WinXP: cmd line hg 1.3 clone of subrepo fails, due to %5C
'\'? (originally fixed by f783bb979fb3).
author | Brodie Rao <brodie@bitheap.org> |
---|---|
date | Fri, 25 Mar 2011 22:59:04 -0700 |
parents | 78a0a815fd41 |
children | ba1f98f877ec |
comparison
equal
deleted
inserted
replaced
13770:4e8f2310f310 | 13771:ce6227306c9a |
---|---|
3 # Copyright 2009-2010 Matt Mackall <mpm@selenic.com> | 3 # Copyright 2009-2010 Matt Mackall <mpm@selenic.com> |
4 # | 4 # |
5 # This software may be used and distributed according to the terms of the | 5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. | 6 # GNU General Public License version 2 or any later version. |
7 | 7 |
8 import errno, os, re, xml.dom.minidom, shutil, urlparse, posixpath | 8 import errno, os, re, xml.dom.minidom, shutil, posixpath |
9 import stat, subprocess, tarfile | 9 import stat, subprocess, tarfile |
10 from i18n import _ | 10 from i18n import _ |
11 import config, util, node, error, cmdutil, bookmarks | 11 import config, util, node, error, cmdutil, url, bookmarks |
12 hg = None | 12 hg = None |
13 | 13 |
14 nullstate = ('', '', 'empty') | 14 nullstate = ('', '', 'empty') |
15 | 15 |
16 def state(ctx, ui): | 16 def state(ctx, ui): |
191 | 191 |
192 def _abssource(repo, push=False, abort=True): | 192 def _abssource(repo, push=False, abort=True): |
193 """return pull/push path of repo - either based on parent repo .hgsub info | 193 """return pull/push path of repo - either based on parent repo .hgsub info |
194 or on the top repo config. Abort or return None if no source found.""" | 194 or on the top repo config. Abort or return None if no source found.""" |
195 if hasattr(repo, '_subparent'): | 195 if hasattr(repo, '_subparent'): |
196 source = repo._subsource | 196 source = url.url(repo._subsource) |
197 if source.startswith('/') or '://' in source: | 197 source.path = posixpath.normpath(source.path) |
198 return source | 198 if posixpath.isabs(source.path) or source.scheme: |
199 return str(source) | |
199 parent = _abssource(repo._subparent, push, abort=False) | 200 parent = _abssource(repo._subparent, push, abort=False) |
200 if parent: | 201 if parent: |
201 if '://' in parent: | 202 parent = url.url(parent) |
202 if parent[-1] == '/': | 203 parent.path = posixpath.join(parent.path, source.path) |
203 parent = parent[:-1] | 204 parent.path = posixpath.normpath(parent.path) |
204 r = urlparse.urlparse(parent + '/' + source) | 205 return str(parent) |
205 r = urlparse.urlunparse((r[0], r[1], | |
206 posixpath.normpath(r[2]), | |
207 r[3], r[4], r[5])) | |
208 return r | |
209 else: # plain file system path | |
210 return posixpath.normpath(os.path.join(parent, repo._subsource)) | |
211 else: # recursion reached top repo | 206 else: # recursion reached top repo |
212 if hasattr(repo, '_subtoppath'): | 207 if hasattr(repo, '_subtoppath'): |
213 return repo._subtoppath | 208 return repo._subtoppath |
214 if push and repo.ui.config('paths', 'default-push'): | 209 if push and repo.ui.config('paths', 'default-push'): |
215 return repo.ui.config('paths', 'default-push') | 210 return repo.ui.config('paths', 'default-push') |