# HG changeset patch # User Gregory Szorc # Date 1502340705 25200 # Node ID 297d1b70685c770b538def5c51b34f0cc5e8e5c8 # Parent dcdc17551653e1401819fffa9ea3b0fa262c54b4 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 diff -r dcdc17551653 -r 297d1b70685c mercurial/wireproto.py --- 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):