diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py --- a/mercurial/changegroup.py +++ b/mercurial/changegroup.py @@ -490,3 +490,23 @@ def getlocalbundle(repo, source, outgoin bundler = bundle10(repo, bundlecaps) return getsubset(repo, outgoing, bundler, source) +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) + diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -1129,8 +1129,8 @@ def bundle(ui, repo, fname, dest=None, * "a destination")) common = [repo.lookup(rev) for rev in base] heads = revs and map(repo.lookup, revs) or revs - cg = repo.getbundle('bundle', heads=heads, common=common, - bundlecaps=bundlecaps) + cg = changegroup.getbundle(repo, 'bundle', heads=heads, common=common, + bundlecaps=bundlecaps) outgoing = None else: dest = ui.expandpath(dest or 'default-push', dest or 'default') diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -6,7 +6,7 @@ # GNU General Public License version 2 or any later version. from node import hex, nullid, short from i18n import _ -import peer, changegroup, subrepo, discovery, pushkey, obsolete, repoview +import peer, changegroup, subrepo, pushkey, obsolete, repoview import changelog, dirstate, filelog, manifest, context, bookmarks, phases import lock as lockmod import transaction, store, encoding, exchange @@ -104,8 +104,8 @@ class localpeer(peer.peerrepository): return self._repo.known(nodes) def getbundle(self, source, heads=None, common=None, bundlecaps=None): - return self._repo.getbundle(source, heads=heads, common=common, - bundlecaps=None) + return changegroup.getbundle(self._repo, source, heads=heads, + common=common, bundlecaps=None) # TODO We might want to move the next two calls into legacypeer and add # unbundle instead. @@ -1683,27 +1683,6 @@ class localrepository(object): def push(self, remote, force=False, revs=None, newbranch=False): return exchange.push(self, remote, force, revs, newbranch) - def getbundle(self, 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 = self.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 changegroup.getlocalbundle(self, source, outgoing, - bundlecaps=bundlecaps) - def changegroup(self, basenodes, source): # to avoid a race we use changegroupsubset() (issue1320) return changegroup.changegroupsubset(self, basenodes, self.heads(), diff --git a/mercurial/wireproto.py b/mercurial/wireproto.py --- a/mercurial/wireproto.py +++ b/mercurial/wireproto.py @@ -602,7 +602,7 @@ def getbundle(repo, proto, others): opts[k] = decodelist(v) elif k == 'bundlecaps': opts[k] = set(v.split(',')) - cg = repo.getbundle('serve', **opts) + cg = changegroupmod.getbundle(repo, 'serve', **opts) return streamres(proto.groupchunks(cg)) @wireprotocommand('heads')