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.
--- a/mercurial/subrepo.py Mon May 09 16:41:45 2011 +0200
+++ b/mercurial/subrepo.py Mon May 09 17:15:44 2011 +0200
@@ -342,8 +342,11 @@
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 @@
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):
--- a/tests/test-static-http.t Mon May 09 16:41:45 2011 +0200
+++ b/tests/test-static-http.t Mon May 09 17:15:44 2011 +0200
@@ -117,7 +117,7 @@
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
--- a/tests/test-subrepo-deep-nested-change.t Mon May 09 16:41:45 2011 +0200
+++ b/tests/test-subrepo-deep-nested-change.t Mon May 09 17:15:44 2011 +0200
@@ -27,12 +27,7 @@
$ 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 @@
$ 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
--- a/tests/test-subrepo-recursion.t Mon May 09 16:41:45 2011 +0200
+++ b/tests/test-subrepo-recursion.t Mon May 09 17:15:44 2011 +0200
@@ -313,18 +313,8 @@
$ 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
--- a/tests/test-subrepo-relative-path.t Mon May 09 16:41:45 2011 +0200
+++ b/tests/test-subrepo-relative-path.t Mon May 09 17:15:44 2011 +0200
@@ -44,7 +44,7 @@
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 @@
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
--- a/tests/test-subrepo.t Mon May 09 16:41:45 2011 +0200
+++ b/tests/test-subrepo.t Mon May 09 17:15:44 2011 +0200
@@ -239,24 +239,9 @@
$ 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 @@
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 @@
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