diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -5,7 +5,7 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -import errno, os, re, xml.dom.minidom, shutil +import errno, os, re, xml.dom.minidom, shutil, urlparse, posixpath from i18n import _ import config, util, node, error hg = None @@ -135,8 +135,12 @@ def _abssource(repo, push=False): if '://' in parent: if parent[-1] == '/': parent = parent[:-1] - return parent + '/' + source - return os.path.join(parent, repo._subsource) + r = urlparse.urlparse(parent + '/' + source) + r = urlparse.urlunparse((r[0], r[1], + posixpath.normpath(r.path), + r[3], r[4], r[5])) + return r + return posixpath.normpath(os.path.join(parent, repo._subsource)) if push and repo.ui.config('paths', 'default-push'): return repo.ui.config('paths', 'default-push', repo.root) return repo.ui.config('paths', 'default', repo.root) diff --git a/tests/test-subrepo-relative-path b/tests/test-subrepo-relative-path new file mode 100755 --- /dev/null +++ b/tests/test-subrepo-relative-path @@ -0,0 +1,40 @@ +#!/bin/sh + +echo % Preparing the subrepository 'sub' +hg init sub +echo sub > sub/sub +hg add -R sub +hg commit -R sub -m "sub import" + +echo % Preparing the 'main' repo which depends on the subrepo 'sub' +hg init main +echo main > main/main +echo "sub = ../sub" > main/.hgsub +hg clone sub main/sub | sed 's/ .*sub/ ...sub/g' +hg add -R main +hg commit -R main -m "main import" + +echo % Cleaning both repositories, just as a clone -U +hg up -C -R sub null +hg up -C -R main null +rm -rf main/sub + +echo % Serving them both using hgweb +printf '[paths]\n/main = main\nsub = sub\n' > webdir.conf +hg serve --webdir-conf webdir.conf -a localhost -p $HGPORT \ + -A /dev/null -E /dev/null --pid-file hg.pid -d +cat hg.pid >> $DAEMON_PIDS + +echo % Clone main from hgweb +hg clone "http://localhost:$HGPORT/main" cloned | sed 's/ .*sub/ ...sub/g' + +echo % Checking cloned repo ids +hg id -R cloned +hg id -R cloned/sub + +echo % subrepo debug for 'main' clone +hg debugsub -R cloned + +"$TESTDIR/killdaemons.py" + +exit 0 diff --git a/tests/test-subrepo-relative-path.out b/tests/test-subrepo-relative-path.out new file mode 100644 --- /dev/null +++ b/tests/test-subrepo-relative-path.out @@ -0,0 +1,33 @@ +% Preparing the subrepository sub +adding sub/sub +% Preparing the main repo which depends on the subrepo sub +updating to branch default +1 files updated, 0 files merged, 0 files removed, 0 files unresolved +adding main/.hgsub +adding main/main +committing subrepository sub +% Cleaning both repositories, just as a clone -U +0 files updated, 0 files merged, 1 files removed, 0 files unresolved +0 files updated, 0 files merged, 3 files removed, 0 files unresolved +% Serving them both using hgweb +% Clone main from hgweb +requesting all changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 3 changes to 3 files +updating to branch default +pulling ...sub +requesting all changes +adding changesets +adding manifests +adding file changes +added 1 changesets with 1 changes to 1 files +3 files updated, 0 files merged, 0 files removed, 0 files unresolved +% Checking cloned repo ids +fdfeeb3e979e tip +863c1745b441 tip +% subrepo debug for main clone +path sub + source ../sub + revision 863c1745b441bd97a8c4a096e87793073f4fb215 diff --git a/tests/test-subrepo.out b/tests/test-subrepo.out --- a/tests/test-subrepo.out +++ b/tests/test-subrepo.out @@ -275,7 +275,7 @@ 2 files updated, 0 files merged, 0 files [paths] default = $HGTMP/test-subrepo/sub/mercurial/nested_absolute [paths] -default = $HGTMP/test-subrepo/sub/mercurial/main/../nested_relative +default = $HGTMP/test-subrepo/sub/mercurial/nested_relative % issue 1977 adding a adding .hgsub