mercurial/wireproto.py
changeset 33767 b47fe9733d76
parent 33766 4c706037adef
child 33806 dedab036215d
equal deleted inserted replaced
33766:4c706037adef 33767:b47fe9733d76
     6 # GNU General Public License version 2 or any later version.
     6 # GNU General Public License version 2 or any later version.
     7 
     7 
     8 from __future__ import absolute_import
     8 from __future__ import absolute_import
     9 
     9 
    10 import hashlib
    10 import hashlib
    11 import itertools
       
    12 import os
    11 import os
    13 import tempfile
    12 import tempfile
    14 
    13 
    15 from .i18n import _
    14 from .i18n import _
    16 from .node import (
    15 from .node import (
    77     #
    76     #
    78     #def restore(self):
    77     #def restore(self):
    79     #    """reinstall previous stdout and stderr and return intercepted stdout
    78     #    """reinstall previous stdout and stderr and return intercepted stdout
    80     #    """
    79     #    """
    81     #    raise NotImplementedError()
    80     #    raise NotImplementedError()
    82 
       
    83 class remotebatch(peer.batcher):
       
    84     '''batches the queued calls; uses as few roundtrips as possible'''
       
    85     def __init__(self, remote):
       
    86         '''remote must support _submitbatch(encbatch) and
       
    87         _submitone(op, encargs)'''
       
    88         peer.batcher.__init__(self)
       
    89         self.remote = remote
       
    90     def submit(self):
       
    91         req, rsp = [], []
       
    92         for name, args, opts, resref in self.calls:
       
    93             mtd = getattr(self.remote, name)
       
    94             batchablefn = getattr(mtd, 'batchable', None)
       
    95             if batchablefn is not None:
       
    96                 batchable = batchablefn(mtd.im_self, *args, **opts)
       
    97                 encargsorres, encresref = next(batchable)
       
    98                 assert encresref
       
    99                 req.append((name, encargsorres,))
       
   100                 rsp.append((batchable, encresref, resref,))
       
   101             else:
       
   102                 if req:
       
   103                     self._submitreq(req, rsp)
       
   104                     req, rsp = [], []
       
   105                 resref.set(mtd(*args, **opts))
       
   106         if req:
       
   107             self._submitreq(req, rsp)
       
   108     def _submitreq(self, req, rsp):
       
   109         encresults = self.remote._submitbatch(req)
       
   110         for encres, r in zip(encresults, rsp):
       
   111             batchable, encresref, resref = r
       
   112             encresref.set(encres)
       
   113             resref.set(next(batchable))
       
   114 
    81 
   115 class remoteiterbatcher(peer.iterbatcher):
    82 class remoteiterbatcher(peer.iterbatcher):
   116     def __init__(self, remote):
    83     def __init__(self, remote):
   117         super(remoteiterbatcher, self).__init__()
    84         super(remoteiterbatcher, self).__init__()
   118         self._remote = remote
    85         self._remote = remote
   251     Methods commonly call wire protocol commands of the same name.
   218     Methods commonly call wire protocol commands of the same name.
   252 
   219 
   253     See also httppeer.py and sshpeer.py for protocol-specific
   220     See also httppeer.py and sshpeer.py for protocol-specific
   254     implementations of this interface.
   221     implementations of this interface.
   255     """
   222     """
   256     def batch(self):
       
   257         if self.capable('batch'):
       
   258             return remotebatch(self)
       
   259         else:
       
   260             return peer.localbatch(self)
       
   261     def _submitbatch(self, req):
   223     def _submitbatch(self, req):
   262         """run batch request <req> on the server
   224         """run batch request <req> on the server
   263 
   225 
   264         Returns an iterator of the raw responses from the server.
   226         Returns an iterator of the raw responses from the server.
   265         """
   227         """