Comments
Patch
@@ -941,27 +941,17 @@ def changegroupsubset(repo, roots, heads
It is fairly complex as determining which filenodes and which
manifest nodes need to be included for the changeset to be complete
is non-trivial.
Another wrinkle is doing the reverse, figuring out which changeset in
the changegroup a particular filenode or manifestnode belongs to.
"""
- cl = repo.changelog
- if not roots:
- roots = [nullid]
- discbases = []
- for n in roots:
- discbases.extend([p for p in cl.parents(n) if p != nullid])
- # TODO: remove call to nodesbetween.
- csets, roots, heads = cl.nodesbetween(roots, heads)
- included = set(csets)
- discbases = [n for n in discbases if n not in included]
- outgoing = discovery.outgoing(cl, discbases, heads)
+ outgoing = discovery.outgoingbetween(repo, roots, heads)
bundler = getbundler(version, repo)
return getsubset(repo, outgoing, bundler, source)
def getlocalchangegroupraw(repo, source, outgoing, bundlecaps=None,
version='01'):
"""Like getbundle, but taking a discovery.outgoing as an argument.
This is only implemented for local repos and reuses potentially
@@ -96,16 +96,37 @@ class outgoing(object):
return self._common
@util.propertycache
def missing(self):
if self._missing is None:
self._computecommonmissing()
return self._missing
+def outgoingbetween(repo, roots, heads):
+ """Compute an ``outgoing`` consisting of nodes between roots and heads.
+
+ The ``missing`` nodes will be descendants of any of the ``roots`` and
+ ancestors of any of the ``heads``, both are which are defined as a list
+ of binary nodes.
+ """
+ cl = repo.changelog
+ if not roots:
+ roots = [nullid]
+ discbases = []
+ for n in roots:
+ discbases.extend([p for p in cl.parents(n) if p != nullid])
+ # TODO remove call to nodesbetween.
+ # TODO populate attributes on outgoing instance instead of setting
+ # discbases.
+ csets, roots, heads = cl.nodesbetween(roots, heads)
+ included = set(csets)
+ discbases = [n for n in discbases if n not in included]
+ return outgoing(cl, discbases, heads)
+
def findcommonoutgoing(repo, other, onlyheads=None, force=False,
commoninc=None, portable=False):
'''Return an outgoing instance to identify the nodes present in repo but
not in other.
If onlyheads is given, only nodes ancestral to nodes in onlyheads
(inclusive) are included. If you already know the local repo's heads,
passing them in onlyheads is faster than letting them be recomputed here.