subrepo: create subrepos using clone instead of pull
authorMartin Geisler <mg@aragost.com>
Mon, 09 May 2011 17:15:44 +0200
changeset 14281 ccb7240acf32
parent 14280 98e4d3914c2e
child 14282 10286a04fbd9
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.
mercurial/subrepo.py
tests/test-static-http.t
tests/test-subrepo-deep-nested-change.t
tests/test-subrepo-recursion.t
tests/test-subrepo-relative-path.t
tests/test-subrepo.t
--- 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