From patchwork Sat Nov 23 20:28:03 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [4,of,5] clone: add --subrev option From: Angel Ezquerra X-Patchwork-Id: 3115 Message-Id: <1dfe3011f816afbd233f.1385238483@Angel-PC.localdomain> To: mercurial-devel@selenic.com Date: Sat, 23 Nov 2013 21:28:03 +0100 # HG changeset patch # User Angel Ezquerra # Date 1362270678 -3600 # Sun Mar 03 01:31:18 2013 +0100 # Node ID 1dfe3011f816afbd233f559bfe0afefcf7ab9b0c # Parent 4b1f0241786e8c6b5e5117950f4e1d4857718618 clone: add --subrev option This flag is similar to the pull --subrev option. With this flag mercurial will look for subrepos on the revisions on the cloned repository specified by the --subrev revision set(s). Mercurial will clone all the subrepos that it finds, even if you use the --noupdate clone flag. With this new flag, pull --subrev will now also work as expected when a new subrepo containing subrepos is cloned into the repository. # HG changeset patch # User Angel Ezquerra # Date 1362270678 -3600 # Sun Mar 03 01:31:18 2013 +0100 # Node ID 1dfe3011f816afbd233f559bfe0afefcf7ab9b0c # Parent 4b1f0241786e8c6b5e5117950f4e1d4857718618 clone: add --subrev option This flag is similar to the pull --subrev option. With this flag mercurial will look for subrepos on the revisions on the cloned repository specified by the --subrev revision set(s). Mercurial will clone all the subrepos that it finds, even if you use the --noupdate clone flag. With this new flag, pull --subrev will now also work as expected when a new subrepo containing subrepos is cloned into the repository. diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -1176,6 +1176,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', 'subrev', [], _('clone subrepos from these revisions')), ] + remoteopts, _('[OPTION]... SOURCE [DEST]')) def clone(ui, source, dest=None, **opts): @@ -1282,7 +1283,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'), + subrev=opts.get('subrev')) return r is None diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -227,7 +227,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, subrev=None): """Make a copy of an existing repository. Create a copy of an existing repository in a new directory. The @@ -261,6 +261,8 @@ anything else is treated as a revision) branch: branches to clone + + subrev: recursively clone all subrepos found on these revsets """ if isinstance(source, str): @@ -370,6 +372,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) @@ -406,6 +410,9 @@ destrepo.ui.setconfig('paths', 'default', defaulturl) + if subrev: + destrepo.getsubrepos(subrev=subrev, 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 @@ -2423,12 +2423,14 @@ finally: lock.release() - def clone(self, remote, heads=[], stream=False): + def clone(self, remote, heads=[], stream=False, subrev=None): '''clone remote repository. keyword arguments: heads: list of revs to clone (forces use of pull) - stream: use streaming clone if possible''' + stream: use streaming clone if possible + subrev: list of revisions to look for subrepos to pull + ''' # now, all clients that can request uncompressed clones can # read repo formats supported by all servers that can serve @@ -2445,15 +2447,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 subrev: + self.getsubrepos(subrev=subrev, 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 subrev: + self.getsubrepos(subrev=subrev, source=remote.url()) + return res + return self.pull(remote, heads, subrev=subrev) 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 @@ -679,7 +679,7 @@ shutil.rmtree(self._repo.path) other, cloned = hg.clone(self._repo._subparent.baseui, {}, other, self._repo.root, - update=False, heads=heads) + update=False, subrev=subrev) self._repo = cloned.local() self._initrepo(parentrepo, source, create=True) self._cachestorehash(srcurl) diff --git a/tests/test-completion.t b/tests/test-completion.t --- a/tests/test-completion.t +++ b/tests/test-completion.t @@ -198,7 +198,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, subrev, ssh, remotecmd, insecure commit: addremove, close-branch, amend, secret, 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