diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -333,6 +333,8 @@ class hgsubrepo(abstractsubrepo): def addpathconfig(key, value): if value: + if not os.path.isabs(value): + value = os.path.relpath(os.path.abspath(value), root) fp.write('%s = %s\n' % (key, value)) self._repo.ui.setconfig('paths', key, value) diff --git a/tests/test-subrepo-relative-path.t b/tests/test-subrepo-relative-path.t --- a/tests/test-subrepo-relative-path.t +++ b/tests/test-subrepo-relative-path.t @@ -67,3 +67,58 @@ subrepo debug for 'main' clone revision 863c1745b441bd97a8c4a096e87793073f4fb215 $ "$TESTDIR/killdaemons.py" + + +Create repo with nested relative subrepos + + $ hg init r1 + $ hg init r1/sub + $ echo sub = sub > r1/.hgsub + $ hg add --cwd r1 .hgsub + $ hg init r1/sub/subsub + $ echo subsub = subsub > r1/sub/.hgsub + $ hg add --cwd r1/sub .hgsub + $ echo c1 > r1/sub/subsub/f + $ hg add --cwd r1/sub/subsub f + $ hg ci --cwd r1 -m0 + committing subrepository sub + committing subrepository sub/subsub + +Ensure correct relative paths are used when pulling + + $ hg init r2 + $ cd r2/ + $ hg pull -u ../r1 + pulling from ../r1 + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + pulling subrepo sub from ../r1/sub + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 2 changes to 2 files + pulling subrepo sub/subsub from ../r1/sub/subsub + requesting all changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ cd .. + +Verify subrepo default paths were set correctly + + $ hg -R r2/sub paths + default = $TESTTMP/r1/sub + $ cat r2/sub/.hg/hgrc + [paths] + default = ../../r1/sub + $ hg -R r2/sub/subsub paths + default = $TESTTMP/r1/sub/subsub + $ cat r2/sub/subsub/.hg/hgrc + [paths] + default = ../../../r1/sub/subsub