Patchwork [4,of,5,V2] clone: add --subrepos flag

login
register
mail settings
Submitter Angel Ezquerra
Date March 3, 2013, 9:05 p.m.
Message ID <3afce3036bc8c06a3aa3.1362344748@Angel-PC.localdomain>
Download mbox | patch
Permalink /patch/1078/
State Rejected, archived
Headers show

Comments

Angel Ezquerra - March 3, 2013, 9:05 p.m.
# HG changeset patch
# User Angel Ezquerra <angel.ezquerra@gmail.com>
# Date 1362270678 -3600
# Node ID 3afce3036bc8c06a3aa32d9a54ca2c9c67379153
# Parent  70724cf5d021de541cf545440dd0937dade6e471
clone: add --subrepos flag

This flag is similar to the pull --subrepos flag. With this flag mercurial will
look for subrepos on all the revisions on the cloned repository. Mercurial will
clone all the subrepos that it finds, even if you use the --noupdate clone flag.

With this new flag, pull --subrepos will now also work as expected when a new
subrepo containing subrepos is cloned into the repository.

Patch

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -1127,6 +1127,7 @@ 
     ('b', 'branch', [], _('clone only the specified branch'), _('BRANCH')),
     ('', 'pull', None, _('use pull protocol to copy metadata')),
     ('', 'uncompressed', None, _('use uncompressed transfer (fast over LAN)')),
+    ('S', 'subrepos', None, _('clone all subrepos')),
     ] + remoteopts,
     _('[OPTION]... SOURCE [DEST]'))
 def clone(ui, source, dest=None, **opts):
@@ -1233,7 +1234,8 @@ 
                  stream=opts.get('uncompressed'),
                  rev=opts.get('rev'),
                  update=opts.get('updaterev') or not opts.get('noupdate'),
-                 branch=opts.get('branch'))
+                 branch=opts.get('branch'),
+                 subrepos=opts.get('subrepos'))
 
     return r is None
 
diff --git a/mercurial/hg.py b/mercurial/hg.py
--- a/mercurial/hg.py
+++ b/mercurial/hg.py
@@ -225,7 +225,7 @@ 
         raise
 
 def clone(ui, peeropts, source, dest=None, pull=False, rev=None,
-          update=True, stream=False, branch=None):
+          update=True, stream=False, branch=None, subrepos=None):
     """Make a copy of an existing repository.
 
     Create a copy of an existing repository in a new directory.  The
@@ -259,6 +259,8 @@ 
     anything else is treated as a revision)
 
     branch: branches to clone
+
+    subrepos: clone all subrepos recursively
     """
 
     if isinstance(source, str):
@@ -368,6 +370,8 @@ 
                 revs = [srcpeer.lookup(r) for r in rev]
                 checkout = revs[0]
             if destpeer.local():
+                # do not pass the subrepos option to clone,
+                # that will be handled once the hgrc file has been written
                 destpeer.local().clone(srcpeer, heads=revs, stream=stream)
             elif srcrepo:
                 srcrepo.push(destpeer, revs=revs)
@@ -404,6 +408,9 @@ 
 
             destrepo.ui.setconfig('paths', 'default', defaulturl)
 
+            if subrepos:
+                destrepo.getsubrepos(source=source)
+
             if update:
                 if update is not True:
                     checkout = srcpeer.lookup(update)
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -10,7 +10,7 @@ 
 import changelog, dirstate, filelog, manifest, context, bookmarks, phases
 import lock, transaction, store, encoding, base85
 import scmutil, util, extensions, hook, error, revset
-import config
+import config, urllib2
 import match as matchmod
 import merge as mergemod
 import tags as tagsmod
@@ -2547,7 +2547,7 @@ 
         finally:
             lock.release()
 
-    def clone(self, remote, heads=[], stream=False):
+    def clone(self, remote, heads=[], stream=False, subrepos=False):
         '''clone remote repository.
 
         keyword arguments:
@@ -2569,15 +2569,21 @@ 
         if stream and not heads:
             # 'stream' means remote revlog format is revlogv1 only
             if remote.capable('stream'):
-                return self.stream_in(remote, set(('revlogv1',)))
+                res = self.stream_in(remote, set(('revlogv1',)))
+                if subrepos:
+                    self.getsubrepos(source=remote.url())
+                return res
             # otherwise, 'streamreqs' contains the remote revlog format
             streamreqs = remote.capable('streamreqs')
             if streamreqs:
                 streamreqs = set(streamreqs.split(','))
                 # if we support it, stream in and adjust our requirements
                 if not streamreqs - self.supportedformats:
-                    return self.stream_in(remote, streamreqs)
-        return self.pull(remote, heads)
+                    res = self.stream_in(remote, streamreqs)
+                    if subrepos:
+                        self.getsubrepos(source=remote.url())
+                    return res
+        return self.pull(remote, heads, subrepos=subrepos)
 
     def pushkey(self, namespace, key, old, new):
         self.hook('prepushkey', throw=True, namespace=namespace, key=key,
diff --git a/mercurial/subrepo.py b/mercurial/subrepo.py
--- a/mercurial/subrepo.py
+++ b/mercurial/subrepo.py
@@ -551,7 +551,7 @@ 
                 shutil.rmtree(self._repo.path)
                 other, cloned = hg.clone(self._repo._subparent.baseui, {},
                                          other, self._repo.root,
-                                         update=False)
+                                         update=False, subrepos=subrepos)
                 self._repo = cloned.local()
                 self._initrepo(parentrepo, source, create=True)
             else:
diff --git a/tests/test-debugcomplete.t b/tests/test-debugcomplete.t
--- a/tests/test-debugcomplete.t
+++ b/tests/test-debugcomplete.t
@@ -196,7 +196,7 @@ 
   $ hg debugcommands
   add: include, exclude, subrepos, dry-run
   annotate: rev, follow, no-follow, text, user, file, date, number, changeset, line-number, ignore-all-space, ignore-space-change, ignore-blank-lines, include, exclude
-  clone: noupdate, updaterev, rev, branch, pull, uncompressed, ssh, remotecmd, insecure
+  clone: noupdate, updaterev, rev, branch, pull, uncompressed, subrepos, ssh, remotecmd, insecure
   commit: addremove, close-branch, amend, include, exclude, message, logfile, date, user, subrepos
   diff: rev, change, text, git, nodates, show-function, reverse, ignore-all-space, ignore-space-change, ignore-blank-lines, unified, stat, include, exclude, subrepos
   export: output, switch-parent, rev, text, git, nodates