bundle2: gracefully handle UnknownPartError during unbundle
Same as for Abort error, we catch the error, encode it into a bundle2 reply
(expected by the client) and stream this reply. The client processing of the
error will raise the exception again.
--- a/mercurial/bundle2.py Tue Apr 22 11:41:34 2014 -0700
+++ b/mercurial/bundle2.py Mon Apr 21 16:02:03 2014 -0700
@@ -753,3 +753,9 @@
manargs = dict(inpart.mandatoryparams)
advargs = dict(inpart.advisoryparams)
raise util.Abort(manargs['message'], hint=advargs.get('hint'))
+
+@parthandler('b2x:error:unknownpart')
+def handlereplycaps(op, inpart):
+ """Used to transmit unknown part error over the wire"""
+ manargs = dict(inpart.mandatoryparams)
+ raise UnknownPartError(manargs['parttype'])
--- a/mercurial/wireproto.py Tue Apr 22 11:41:34 2014 -0700
+++ b/mercurial/wireproto.py Mon Apr 21 16:02:03 2014 -0700
@@ -803,6 +803,12 @@
finally:
fp.close()
os.unlink(tempname)
+ except bundle2.UnknownPartError, exc:
+ bundler = bundle2.bundle20(repo.ui)
+ part = bundle2.bundlepart('B2X:ERROR:UNKNOWNPART',
+ [('parttype', str(exc))])
+ bundler.addpart(part)
+ return streamres(bundler.getchunks())
except util.Abort, inst:
# The old code we moved used sys.stderr directly.
# We did not change it to minimise code change.
--- a/tests/test-bundle2.t Tue Apr 22 11:41:34 2014 -0700
+++ b/tests/test-bundle2.t Mon Apr 21 16:02:03 2014 -0700
@@ -908,6 +908,8 @@
> part = None
> if reason == 'abort':
> part = bundle2.bundlepart('test:abort')
+ > if reason == 'unknown':
+ > part = bundle2.bundlepart('TEST:UNKNOWN')
> if part is not None:
> bundler.addpart(part)
> return extradata
@@ -969,3 +971,27 @@
[255]
+Doing the actual push: unknown mandatory parts
+
+ $ cat << EOF >> $HGRCPATH
+ > [failpush]
+ > reason = unknown
+ > EOF
+
+ $ hg -R main push other -r e7ec4e813ba6
+ pushing to other
+ searching for changes
+ abort: missing support for 'test:unknown'
+ [255]
+
+ $ hg -R main push ssh://user@dummy/other -r e7ec4e813ba6
+ pushing to ssh://user@dummy/other
+ searching for changes
+ abort: missing support for "'test:unknown'"
+ [255]
+
+ $ hg -R main push http://localhost:$HGPORT2/ -r e7ec4e813ba6
+ pushing to http://localhost:$HGPORT2/
+ searching for changes
+ abort: missing support for "'test:unknown'"
+ [255]