Mercurial > hg
changeset 33764:297d1b70685c
wireproto: properly implement batchable checking
remoteiterbatcher (unlike remotebatcher) only supports batchable
commands. This claim can be validated by comparing their
implementations of submit() and noting how remoteiterbatcher assumes
the invoked method has a "batchable" attribute, which is set by
@peer.batchable.
remoteiterbatcher has a custom __getitem__ that was trying to
validate that only batchable methods are called. However, it was only
validating that the called method exists, not that it is batchable.
This wasn't a big deal since remoteiterbatcher.submit() would raise
an AttributeError attempting to `mtd.batchable(...)`.
Let's fix the check and convert it to ProgrammingError, which may
not have been around when this was originally implemented.
Differential Revision: https://phab.mercurial-scm.org/D317
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Wed, 09 Aug 2017 21:51:45 -0700 |
parents | dcdc17551653 |
children | e2fc2122029c |
files | mercurial/wireproto.py |
diffstat | 1 files changed, 7 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/wireproto.py Wed Aug 09 21:04:03 2017 -0700 +++ b/mercurial/wireproto.py Wed Aug 09 21:51:45 2017 -0700 @@ -120,9 +120,13 @@ self._remote = remote def __getattr__(self, name): - if not getattr(self._remote, name, False): - raise AttributeError( - 'Attempted to iterbatch non-batchable call to %r' % name) + # Validate this method is batchable, since submit() only supports + # batchable methods. + fn = getattr(self._remote, name) + if not getattr(fn, 'batchable', None): + raise error.ProgrammingError('Attempted to batch a non-batchable ' + 'call to %r' % name) + return super(remoteiterbatcher, self).__getattr__(name) def submit(self):