# HG changeset patch # User Gregory Szorc # Date 2018-09-14 21:56:13 # Node ID ac59de55c8b4833c4bb7da4b5aeddb537454e30c # Parent 00a4cd368e3f80d42f8c0b6e0d3b43868ca2f3c4 exchange: support declaring pull depth Upcoming commits will teach exchangev2 how to perform a shallow clone. This commit teaches hg.clone(), exchange.pull(), and exchange.pulloperation to recognize a request for a shallow clone by having the caller specify a numeric depth of the maximum number of ancestor changesets to fetch. There are certainly other ways we could control shallow-ness. But this one is simple to implement and is also how the narrow extension controls things. So it seems to make sense to start here. Differential Revision: https://phab.mercurial-scm.org/D5136 diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -1316,7 +1316,7 @@ class pulloperation(object): def __init__(self, repo, remote, heads=None, force=False, bookmarks=(), remotebookmarks=None, streamclonerequested=None, - includepats=None, excludepats=None): + includepats=None, excludepats=None, depth=None): # repo we pull into self.repo = repo # repo we pull from @@ -1350,6 +1350,8 @@ class pulloperation(object): self.includepats = includepats # Set of file patterns to exclude. self.excludepats = excludepats + # Number of ancestor changesets to pull from each pulled head. + self.depth = depth @util.propertycache def pulledsubset(self): @@ -1454,7 +1456,8 @@ def _fullpullbundle2(repo, pullop): pullop.rheads = set(pullop.rheads) - pullop.common def pull(repo, remote, heads=None, force=False, bookmarks=(), opargs=None, - streamclonerequested=None, includepats=None, excludepats=None): + streamclonerequested=None, includepats=None, excludepats=None, + depth=None): """Fetch repository data from a remote. This is the main function used to retrieve data from a remote repository. @@ -1475,6 +1478,9 @@ def pull(repo, remote, heads=None, force ``includepats`` and ``excludepats`` define explicit file patterns to include and exclude in storage, respectively. If not defined, narrow patterns from the repo instance are used, if available. + ``depth`` is an integer indicating the DAG depth of history we're + interested in. If defined, for each revision specified in ``heads``, we + will fetch up to this many of its ancestors and data associated with them. Returns the ``pulloperation`` created for this pull. """ @@ -1495,6 +1501,7 @@ def pull(repo, remote, heads=None, force pullop = pulloperation(repo, remote, heads, force, bookmarks=bookmarks, streamclonerequested=streamclonerequested, includepats=includepats, excludepats=excludepats, + depth=depth, **pycompat.strkwargs(opargs)) peerlocal = pullop.remote.local() diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -479,7 +479,7 @@ def _copycache(srcrepo, dstcachedir, fna def clone(ui, peeropts, source, dest=None, pull=False, revs=None, update=True, stream=False, branch=None, shareopts=None, - storeincludepats=None, storeexcludepats=None): + storeincludepats=None, storeexcludepats=None, depth=None): """Make a copy of an existing repository. Create a copy of an existing repository in a new directory. The @@ -749,7 +749,8 @@ def clone(ui, peeropts, source, dest=Non exchange.pull(local, srcpeer, revs, streamclonerequested=stream, includepats=storeincludepats, - excludepats=storeexcludepats) + excludepats=storeexcludepats, + depth=depth) elif srcrepo: # TODO lift restriction once exchange.push() accepts narrow # push.