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
--- a/mercurial/exchange.py Wed Oct 17 10:10:05 2018 +0200
+++ b/mercurial/exchange.py Fri Sep 14 14:56:13 2018 -0700
@@ -1316,7 +1316,7 @@
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 @@
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 @@
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 @@
``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 @@
pullop = pulloperation(repo, remote, heads, force, bookmarks=bookmarks,
streamclonerequested=streamclonerequested,
includepats=includepats, excludepats=excludepats,
+ depth=depth,
**pycompat.strkwargs(opargs))
peerlocal = pullop.remote.local()
--- a/mercurial/hg.py Wed Oct 17 10:10:05 2018 +0200
+++ b/mercurial/hg.py Fri Sep 14 14:56:13 2018 -0700
@@ -479,7 +479,7 @@
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 @@
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.