From patchwork Fri Mar 21 22:12:55 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [3,of,4] bundle2: print debug information during unbundling From: Pierre-Yves David X-Patchwork-Id: 4033 Message-Id: <8d47c765129239116a52.1395439975@marginatus.alto.octopoid.net> To: mercurial-devel@selenic.com Cc: pierre-yves.david@ens-lyon.org Date: Fri, 21 Mar 2014 15:12:55 -0700 # HG changeset patch # User Pierre-Yves David # Date 1395274309 25200 # Wed Mar 19 17:11:49 2014 -0700 # Node ID 8d47c765129239116a52caffbdc61e21171cdf9c # Parent d59b5c916f3be745fd19fab9dacc02f2352eeea0 bundle2: print debug information during unbundling The unbundler class is now feed with an ui object and use it to transmit data about the unbundling process. diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -139,18 +139,20 @@ class bundle20(object): class unbundle20(object): """interpret a bundle2 stream (this will eventually yield parts)""" - def __init__(self, fp): + def __init__(self, ui, fp): + self.ui = ui self._fp = fp header = self._readexact(4) magic, version = header[0:2], header[2:4] if magic != 'HG': raise util.Abort(_('not a Mercurial bundle')) if version != '20': raise util.Abort(_('unknown bundle version %s') % version) + self.ui.debug('start processing of %s stream\n' % header) def _unpack(self, format): """unpack this struct format from the stream""" data = self._readexact(struct.calcsize(format)) return _unpack(format, data) @@ -160,10 +162,11 @@ class unbundle20(object): return changegroup.readexactly(self._fp, size) @util.propertycache def params(self): """dictionnary of stream level parameters""" + self.ui.debug('reading bundle2 stream parameters\n') params = {} paramssize = self._unpack(_fstreamparamsize)[0] if paramssize: for p in self._readexact(paramssize).split(' '): p = p.split('=', 1) @@ -175,14 +178,16 @@ class unbundle20(object): def __iter__(self): """yield all parts contained in the stream""" # make sure param have been loaded self.params + self.ui.debug('start extraction of bundle2 parts\n') part = self._readpart() while part is not None: yield part part = self._readpart() + self.ui.debug('end of bundle2 stream\n') def _readpart(self): """return None when an end of stream markers is reach""" headersize = self._readexact(2) assert headersize == '\0\0' diff --git a/tests/test-bundle2.t b/tests/test-bundle2.t --- a/tests/test-bundle2.t +++ b/tests/test-bundle2.t @@ -37,11 +37,11 @@ Create an extension to test bundle2 API > file.write(chunk) > > @command('unbundle2', [], '') > def cmdunbundle2(ui, repo): > """read a bundle2 container from standard input""" - > unbundler = bundle2.unbundle20(sys.stdin) + > unbundler = bundle2.unbundle20(ui, sys.stdin) > ui.write('options count: %i\n' % len(unbundler.params)) > for key in sorted(unbundler.params): > ui.write('- %s\n' % key) > value = unbundler.params[key] > if value is not None: @@ -160,20 +160,36 @@ Test unbundling parts count: 0 Test debug output --------------------------------------------------- +bundling debug + $ hg bundle2 --debug --param 'e|! 7/=babar%#==tutu' --param simple ../out.hg2 start emission of HG20 stream bundle parameter: e%7C%21%207/=babar%25%23%3D%3Dtutu simple end of bundle file content is ok $ cat ../out.hg2 HG20\x00)e%7C%21%207/=babar%25%23%3D%3Dtutu simple\x00\x00 (no-eol) (esc) +unbundling debug + + $ hg unbundle2 --debug < ../out.hg2 + start processing of HG20 stream + reading bundle2 stream parameters + options count: 2 + - e|! 7/ + babar%#==tutu + - simple + start extraction of bundle2 parts + end of bundle2 stream + parts count: 0 + + Test buggy input --------------------------------------------------- empty parameter name