# HG changeset patch # User Martin Geisler # Date 2011-05-09 15:15:44 # Node ID ccb7240acf3270d12dfd58b17aa62e2dacca0e3e # Parent 98e4d3914c2e807bc68b04d2d28a8fd1edaa5e81 subrepo: create subrepos using clone instead of pull Subrepositories used to be created empty and then filled with data using pull. This is wasteful when you do a clone from a local source since it means that no hardlinks are created for the subrepos. This patch make the hgsubrepo._get method check for an empty subrepo and in that case do a clone instead of a pull. This brings in the same data as before, but creates hardlinks when possible. diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py --- a/mercurial/subrepo.py +++ b/mercurial/subrepo.py @@ -342,8 +342,11 @@ class hgsubrepo(abstractsubrepo): create = True util.makedirs(root) self._repo = hg.repository(r.ui, root, create=create) - self._repo._subparent = r - self._repo._subsource = state[0] + self._initrepo(r, state[0], create) + + def _initrepo(self, parentrepo, source, create): + self._repo._subparent = parentrepo + self._repo._subsource = source if create: fp = self._repo.opener("hgrc", "w", text=True) @@ -431,10 +434,19 @@ class hgsubrepo(abstractsubrepo): if revision not in self._repo: self._repo._subsource = source srcurl = _abssource(self._repo) - self._repo.ui.status(_('pulling subrepo %s from %s\n') - % (subrelpath(self), srcurl)) other = hg.repository(self._repo.ui, srcurl) - self._repo.pull(other) + if len(self._repo) == 0: + self._repo.ui.status(_('cloning subrepo %s from %s\n') + % (subrelpath(self), srcurl)) + parentrepo = self._repo._subparent + shutil.rmtree(self._repo.root) + other, self._repo = hg.clone(self._repo._subparent.ui, other, + self._repo.root, update=False) + self._initrepo(parentrepo, source, create=True) + else: + self._repo.ui.status(_('pulling subrepo %s from %s\n') + % (subrelpath(self), srcurl)) + self._repo.pull(other) bookmarks.updatefromremote(self._repo.ui, self._repo, other) def get(self, state, overwrite=False): diff --git a/tests/test-static-http.t b/tests/test-static-http.t --- a/tests/test-static-http.t +++ b/tests/test-static-http.t @@ -117,7 +117,7 @@ test with "/" URI (issue 747) and subrep adding file changes added 1 changesets with 3 changes to 3 files updating to branch default - pulling subrepo sub from static-http://localhost:$HGPORT/sub + cloning subrepo sub from static-http://localhost:$HGPORT/sub requesting all changes adding changesets adding manifests diff --git a/tests/test-subrepo-deep-nested-change.t b/tests/test-subrepo-deep-nested-change.t --- a/tests/test-subrepo-deep-nested-change.t +++ b/tests/test-subrepo-deep-nested-change.t @@ -27,12 +27,7 @@ Preparing the 'main' repo which depends $ echo "sub1 = ../sub1" > main/.hgsub $ hg clone sub1 main/sub1 updating to branch default - pulling subrepo sub2 from $TESTTMP/sub2 - requesting all changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files + cloning subrepo sub2 from $TESTTMP/sub2 3 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg add -R main adding main/.hgsub @@ -55,18 +50,8 @@ Clone main $ hg clone main cloned updating to branch default - pulling subrepo sub1 from $TESTTMP/sub1 - requesting all changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 3 changes to 3 files - pulling subrepo sub1/sub2 from $TESTTMP/sub2 - requesting all changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files + cloning subrepo sub1 from $TESTTMP/sub1 + cloning subrepo sub1/sub2 from $TESTTMP/sub2 3 files updated, 0 files merged, 0 files removed, 0 files unresolved Checking cloned repo ids diff --git a/tests/test-subrepo-recursion.t b/tests/test-subrepo-recursion.t --- a/tests/test-subrepo-recursion.t +++ b/tests/test-subrepo-recursion.t @@ -313,18 +313,8 @@ Clone and test outgoing: $ cd .. $ hg clone repo repo2 updating to branch default - pulling subrepo foo from $TESTTMP/repo/foo - requesting all changes - adding changesets - adding manifests - adding file changes - added 4 changesets with 7 changes to 3 files - pulling subrepo foo/bar from $TESTTMP/repo/foo/bar - requesting all changes - adding changesets - adding manifests - adding file changes - added 3 changesets with 3 changes to 1 files + cloning subrepo foo from $TESTTMP/repo/foo + cloning subrepo foo/bar from $TESTTMP/repo/foo/bar 3 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd repo2 $ hg outgoing -S 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 @@ -44,7 +44,7 @@ Clone main from hgweb adding file changes added 1 changesets with 3 changes to 3 files updating to branch default - pulling subrepo sub from http://localhost:$HGPORT/sub + cloning subrepo sub from http://localhost:$HGPORT/sub requesting all changes adding changesets adding manifests @@ -79,7 +79,7 @@ subrepo paths with ssh urls adding file changes added 1 changesets with 3 changes to 3 files updating to branch default - pulling subrepo sub from ssh://user@dummy/sub + cloning subrepo sub from ssh://user@dummy/sub requesting all changes adding changesets adding manifests diff --git a/tests/test-subrepo.t b/tests/test-subrepo.t --- a/tests/test-subrepo.t +++ b/tests/test-subrepo.t @@ -239,24 +239,9 @@ clone $ cd .. $ hg clone t tc updating to branch default - pulling subrepo s from $TESTTMP/sub/t/s - requesting all changes - adding changesets - adding manifests - adding file changes - added 4 changesets with 5 changes to 3 files - pulling subrepo s/ss from $TESTTMP/sub/t/s/ss - requesting all changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files - pulling subrepo t from $TESTTMP/sub/t/t - requesting all changes - adding changesets - adding manifests - adding file changes - added 4 changesets with 4 changes to 1 files (+1 heads) + cloning subrepo s from $TESTTMP/sub/t/s + cloning subrepo s/ss from $TESTTMP/sub/t/s/ss + cloning subrepo t from $TESTTMP/sub/t/t 3 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd tc $ hg debugsub @@ -563,12 +548,7 @@ Issue1977: multirepo push should fail if committing subrepository s $ hg clone repo repo2 updating to branch default - pulling subrepo s from $TESTTMP/sub/repo/s - requesting all changes - adding changesets - adding manifests - adding file changes - added 1 changesets with 1 changes to 1 files + cloning subrepo s from $TESTTMP/sub/repo/s 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg -q -R repo2 pull -u $ echo 1 > repo2/s/a @@ -639,12 +619,7 @@ Try the same, but with pull -u adding manifests adding file changes added 1 changesets with 2 changes to 2 files - pulling subrepo sub/repo from issue1852a/sub/repo - requesting all changes - adding changesets - adding manifests - adding file changes - added 2 changesets with 2 changes to 1 files + cloning subrepo sub/repo from issue1852a/sub/repo 2 files updated, 0 files merged, 0 files removed, 0 files unresolved Try to push from the other side