discovery: move code to create outgoing from roots and heads

changegroup.changegroupsubset() contained somewhat low-level code for
constructing an "outgoing" instance from a list of roots and heads
nodes. It feels like discovery.py is a more appropriate location for
this code.

This code can definitely be optimized, as outgoing.missing will
recompute the set of changesets we've already discovered from
cl.between(). But code shouldn't be refactored during a move, so
I've simply inserted a TODO calling attention to that.
This commit is contained in:
Gregory Szorc 2016-08-03 22:07:52 -07:00
parent 000dd50a40
commit 9f5f743c8a
2 changed files with 22 additions and 11 deletions

View File

@ -946,17 +946,7 @@ def changegroupsubset(repo, roots, heads, source, version='01'):
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)

View File

@ -101,6 +101,27 @@ class outgoing(object):
self._computecommonmissing()
return self._missing
def outgoingbetween(repo, roots, heads):
"""create 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