Mercurial > public > mercurial-scm > hg-stable
diff mercurial/changegroup.py @ 19202:0455fc94ae00
bundle-ng: move gengroup into bundler, pass repo object to bundler
No semantic changes made.
author | Sune Foldager <cryo@cyanite.org> |
---|---|
date | Fri, 10 May 2013 21:35:49 +0200 |
parents | 309c439cdbaa |
children | e9c5b1c246dc |
line wrap: on
line diff
--- a/mercurial/changegroup.py Sat Feb 09 23:42:03 2013 +0100 +++ b/mercurial/changegroup.py Fri May 10 21:35:49 2013 +0200 @@ -6,7 +6,7 @@ # GNU General Public License version 2 or any later version. from i18n import _ -from node import nullrev +from node import nullrev, hex import mdiff, util, dagutil import struct, os, bz2, zlib, tempfile @@ -225,11 +225,26 @@ class bundle10(object): deltaheader = _BUNDLE10_DELTA_HEADER - def __init__(self, bundlecaps=None): + def __init__(self, repo, bundlecaps=None): + """Given a source repo, construct a bundler. + + bundlecaps is optional and can be used to specify the set of + capabilities which can be used to build the bundle. + """ # Set of capabilities we can use to build the bundle. if bundlecaps is None: bundlecaps = set() self._bundlecaps = bundlecaps + self._changelog = repo.changelog + self._manifest = repo.manifest + reorder = repo.ui.config('bundle', 'reorder', 'auto') + if reorder == 'auto': + reorder = None + else: + reorder = util.parsebool(reorder) + self._repo = repo + self._reorder = reorder + self.count = [0, 0] def start(self, lookup): self._lookup = lookup def close(self): @@ -276,6 +291,43 @@ yield self.close() + def generate(self, clnodes, getmfnodes, getfiles, getfilenodes, source): + '''yield a sequence of changegroup chunks (strings)''' + repo = self._repo + cl = self._changelog + mf = self._manifest + reorder = self._reorder + progress = repo.ui.progress + count = self.count + _bundling = _('bundling') + + count[:] = [0, len(clnodes)] + for chunk in self.group(clnodes, cl, reorder=reorder): + yield chunk + progress(_bundling, None) + + for chunk in self.group(getmfnodes(), mf, reorder=reorder): + yield chunk + progress(_bundling, None) + + changedfiles = getfiles() + count[:] = [0, len(changedfiles)] + for fname in sorted(changedfiles): + filerevlog = repo.file(fname) + if not len(filerevlog): + raise util.Abort(_("empty or missing revlog for %s") + % fname) + nodelist = getfilenodes(fname, filerevlog) + if nodelist: + count[0] += 1 + yield self.fileheader(fname) + for chunk in self.group(nodelist, filerevlog, reorder): + yield chunk + yield self.close() + progress(_bundling, None) + + if clnodes: + repo.hook('outgoing', node=hex(clnodes[0]), source=source) def revchunk(self, revlog, rev, prev): node = revlog.node(rev)