def changegroupsubset(repo, roots, heads, source, version='01'): """Compute a changegroup consisting of all the nodes that are descendants of any of the roots and ancestors of any of the heads. Return a chunkbuffer object whose read() method will return successive changegroup chunks. 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) bundler = packermap[version][0](repo) return getsubset(repo, outgoing, bundler, source, version=version)
def computeoutgoing(repo, heads, common): """Computes which revs are outgoing given a set of common and a set of heads. This is a separate function so extensions can have access to the logic. Returns a discovery.outgoing object. """ cl = repo.changelog if common: hasnode = cl.hasnode common = [n for n in common if hasnode(n)] else: common = [nullid] if not heads: heads = cl.heads() return discovery.outgoing(cl, common, heads)
def _computeoutgoing(repo, heads, common): """Computes which revs are outgoing given a set of common and a set of heads. This is a separate function so extensions can have access to the logic. Returns a discovery.outgoing object. """ cl = repo.changelog if common: hasnode = cl.hasnode common = [n for n in common if hasnode(n)] else: common = [nullid] if not heads: heads = cl.heads() return discovery.outgoing(cl, common, heads)
def getbundle(repo, source, heads=None, common=None, bundlecaps=None): """Like changegroupsubset, but returns the set difference between the ancestors of heads and the ancestors common. If heads is None, use the local heads. If common is None, use [nullid]. The nodes in common might not all be known locally due to the way the current discovery protocol works. """ cl = repo.changelog if common: hasnode = cl.hasnode common = [n for n in common if hasnode(n)] else: common = [nullid] if not heads: heads = cl.heads() outgoing = discovery.outgoing(cl, common, heads) return getlocalbundle(repo, source, outgoing, bundlecaps=bundlecaps)