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