# HG changeset patch # User Gregory Szorc # Date 2016-08-04 05:07:52 # Node ID 5684bc429e6ab59fbb2c571509cb532c3a8b51cd # Parent 39537bc644428308b050e87be430685f4282f917 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. diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py --- a/mercurial/changegroup.py +++ b/mercurial/changegroup.py @@ -946,17 +946,7 @@ def changegroupsubset(repo, roots, heads 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) diff --git a/mercurial/discovery.py b/mercurial/discovery.py --- a/mercurial/discovery.py +++ b/mercurial/discovery.py @@ -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