# HG changeset patch # User Pierre-Yves David # Date 1397504030 14400 # Node ID 7ca4f2049d3b7b945b4d5ba07e322998f4fbc6de # Parent e7c0a65a5c9cd853cbd293ad1099e3aa927a6a41 bundle2: move `readbundle` into the `exchange` module The `readbundle` function is going to understand the bundle2 header. We move the function to a more suitable place before making any other changes. diff -r e7c0a65a5c9c -r 7ca4f2049d3b hgext/shelve.py --- a/hgext/shelve.py Mon Apr 14 14:46:32 2014 -0400 +++ b/hgext/shelve.py Mon Apr 14 15:33:50 2014 -0400 @@ -25,7 +25,7 @@ from mercurial.node import nullid, nullrev, bin, hex from mercurial import changegroup, cmdutil, scmutil, phases, commands from mercurial import error, hg, mdiff, merge, patch, repair, util -from mercurial import templatefilters, changegroup +from mercurial import templatefilters, changegroup, exchange from mercurial import lock as lockmod from hgext import rebase import errno @@ -71,7 +71,7 @@ def applybundle(self): fp = self.opener() try: - gen = changegroup.readbundle(fp, self.fname, self.vfs) + gen = exchange.readbundle(fp, self.fname, self.vfs) changegroup.addchangegroup(self.repo, gen, 'unshelve', 'bundle:' + self.vfs.join(self.fname)) finally: diff -r e7c0a65a5c9c -r 7ca4f2049d3b mercurial/bundlerepo.py --- a/mercurial/bundlerepo.py Mon Apr 14 14:46:32 2014 -0400 +++ b/mercurial/bundlerepo.py Mon Apr 14 15:33:50 2014 -0400 @@ -14,7 +14,7 @@ from node import nullid from i18n import _ import os, tempfile, shutil -import changegroup, util, mdiff, discovery, cmdutil, scmutil +import changegroup, util, mdiff, discovery, cmdutil, scmutil, exchange import localrepo, changelog, manifest, filelog, revlog, error class bundlerevlog(revlog.revlog): @@ -202,7 +202,7 @@ self.tempfile = None f = util.posixfile(bundlename, "rb") - self.bundle = changegroup.readbundle(f, bundlename) + self.bundle = exchange.readbundle(f, bundlename) if self.bundle.compressed(): fdtemp, temp = self.vfs.mkstemp(prefix="hg-bundle-", suffix=".hg10un") @@ -220,7 +220,7 @@ fptemp.close() f = self.vfs.open(self.tempfile, mode="rb") - self.bundle = changegroup.readbundle(f, bundlename, self.vfs) + self.bundle = exchange.readbundle(f, bundlename, self.vfs) # dict with the mapping 'filename' -> position in the bundle self.bundlefilespos = {} diff -r e7c0a65a5c9c -r 7ca4f2049d3b mercurial/changegroup.py --- a/mercurial/changegroup.py Mon Apr 14 14:46:32 2014 -0400 +++ b/mercurial/changegroup.py Mon Apr 14 15:33:50 2014 -0400 @@ -227,25 +227,6 @@ return d return readexactly(self._fh, n) -def readbundle(fh, fname, vfs=None): - header = readexactly(fh, 6) - - if not fname: - fname = "stream" - if not header.startswith('HG') and header.startswith('\0'): - fh = headerlessfixup(fh, header) - header = "HG10UN" - elif vfs: - fname = vfs.join(fname) - - magic, version, alg = header[0:2], header[2:4], header[4:6] - - if magic != 'HG': - raise util.Abort(_('%s: not a Mercurial bundle') % fname) - if version != '10': - raise util.Abort(_('%s: unknown bundle version %s') % (fname, version)) - return unbundle10(fh, alg) - class bundle10(object): deltaheader = _BUNDLE10_DELTA_HEADER def __init__(self, repo, bundlecaps=None): diff -r e7c0a65a5c9c -r 7ca4f2049d3b mercurial/commands.py --- a/mercurial/commands.py Mon Apr 14 14:46:32 2014 -0400 +++ b/mercurial/commands.py Mon Apr 14 15:33:50 2014 -0400 @@ -20,7 +20,7 @@ import dagparser, context, simplemerge, graphmod import random import setdiscovery, treediscovery, dagutil, pvec, localrepo -import phases, obsolete +import phases, obsolete, exchange table = {} @@ -1736,7 +1736,7 @@ """lists the contents of a bundle""" f = hg.openpath(ui, bundlepath) try: - gen = changegroup.readbundle(f, bundlepath) + gen = exchange.readbundle(f, bundlepath) if all: ui.write(("format: id, p1, p2, cset, delta base, len(delta)\n")) @@ -5807,7 +5807,7 @@ try: for fname in fnames: f = hg.openpath(ui, fname) - gen = changegroup.readbundle(f, fname) + gen = exchange.readbundle(f, fname) modheads = changegroup.addchangegroup(repo, gen, 'unbundle', 'bundle:' + fname) finally: diff -r e7c0a65a5c9c -r 7ca4f2049d3b mercurial/exchange.py --- a/mercurial/exchange.py Mon Apr 14 14:46:32 2014 -0400 +++ b/mercurial/exchange.py Mon Apr 14 15:33:50 2014 -0400 @@ -11,6 +11,25 @@ import util, scmutil, changegroup, base85 import discovery, phases, obsolete, bookmarks, bundle2 +def readbundle(fh, fname, vfs=None): + header = changegroup.readexactly(fh, 6) + + if not fname: + fname = "stream" + if not header.startswith('HG') and header.startswith('\0'): + fh = changegroup.headerlessfixup(fh, header) + header = "HG10UN" + elif vfs: + fname = vfs.join(fname) + + magic, version, alg = header[0:2], header[2:4], header[4:6] + + if magic != 'HG': + raise util.Abort(_('%s: not a Mercurial bundle') % fname) + if version != '10': + raise util.Abort(_('%s: unknown bundle version %s') % (fname, version)) + return changegroup.unbundle10(fh, alg) + class pushoperation(object): """A object that represent a single push operation diff -r e7c0a65a5c9c -r 7ca4f2049d3b mercurial/repair.py --- a/mercurial/repair.py Mon Apr 14 14:46:32 2014 -0400 +++ b/mercurial/repair.py Mon Apr 14 15:33:50 2014 -0400 @@ -6,7 +6,7 @@ # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. -from mercurial import changegroup +from mercurial import changegroup, exchange from mercurial.node import short from mercurial.i18n import _ import errno @@ -147,7 +147,7 @@ if saveheads or savebases: ui.note(_("adding branch\n")) f = vfs.open(chgrpfile, "rb") - gen = changegroup.readbundle(f, chgrpfile, vfs) + gen = exchange.readbundle(f, chgrpfile, vfs) if not repo.ui.verbose: # silence internal shuffling chatter repo.ui.pushbuffer() diff -r e7c0a65a5c9c -r 7ca4f2049d3b mercurial/wireproto.py --- a/mercurial/wireproto.py Mon Apr 14 14:46:32 2014 -0400 +++ b/mercurial/wireproto.py Mon Apr 14 15:33:50 2014 -0400 @@ -766,7 +766,7 @@ try: proto.getfile(fp) fp.seek(0) - gen = changegroupmod.readbundle(fp, None) + gen = exchange.readbundle(fp, None) r = exchange.unbundle(repo, gen, their_heads, 'serve', proto._client()) return pushres(r)