hgext/inotify/client.py
changeset 8553 e387ecd7a6ed
parent 8552 06561793778e
child 8555 3e09bc5fee12
equal deleted inserted replaced
8552:06561793778e 8553:e387ecd7a6ed
    76                 sockpath = os.readlink(sockpath)
    76                 sockpath = os.readlink(sockpath)
    77                 self.sock.connect(sockpath)
    77                 self.sock.connect(sockpath)
    78             else:
    78             else:
    79                 raise
    79                 raise
    80 
    80 
    81     def _send(self, data):
    81     def _send(self, type, data):
    82         """Sends protocol version number, and the data"""
    82         """Sends protocol version number, and the data"""
    83         self.sock.sendall(chr(common.version) + data)
    83         self.sock.sendall(chr(common.version) + type + data)
    84 
    84 
    85         self.sock.shutdown(socket.SHUT_WR)
    85         self.sock.shutdown(socket.SHUT_WR)
    86 
    86 
    87     def _receive(self):
    87     def _receive(self, type):
    88         """
    88         """
    89         Read data, check version number, extract headers,
    89         Read data, check version number, extract headers,
    90         and returns a tuple (data descriptor, header)
    90         and returns a tuple (data descriptor, header)
    91         Raises QueryFailed on error
    91         Raises QueryFailed on error
    92         """
    92         """
    95         if version != common.version:
    95         if version != common.version:
    96             self.ui.warn(_('(inotify: received response from incompatible '
    96             self.ui.warn(_('(inotify: received response from incompatible '
    97                       'server version %d)\n') % version)
    97                       'server version %d)\n') % version)
    98             raise QueryFailed('incompatible server version')
    98             raise QueryFailed('incompatible server version')
    99 
    99 
   100         # only one type of request is supported for now
   100         readtype = cs.read(4)
   101         type = 'STAT'
   101         if readtype != type:
       
   102             self.ui.warn(_('(inotify: received \'%s\' response when expecting'
       
   103                        ' \'%s\')\n') % (readtype, type))
       
   104             raise QueryFailed('wrong response type')
       
   105 
   102         hdrfmt = common.resphdrfmts[type]
   106         hdrfmt = common.resphdrfmts[type]
   103         hdrsize = common.resphdrsizes[type]
   107         hdrsize = common.resphdrsizes[type]
   104         try:
   108         try:
   105             resphdr = struct.unpack(hdrfmt, cs.read(hdrsize))
   109             resphdr = struct.unpack(hdrfmt, cs.read(hdrsize))
   106         except struct.error:
   110         except struct.error:
   107             raise QueryFailed('unable to retrieve query response headers')
   111             raise QueryFailed('unable to retrieve query response headers')
   108 
   112 
   109         return cs, resphdr
   113         return cs, resphdr
   110 
   114 
   111     def query(self, req):
   115     def query(self, type, req):
   112         self._connect()
   116         self._connect()
   113 
   117 
   114         self._send(req)
   118         self._send(type, req)
   115 
   119 
   116         return self._receive()
   120         return self._receive(type)
   117 
   121 
   118     @start_server
   122     @start_server
   119     def statusquery(self, names, match, ignored, clean, unknown=True):
   123     def statusquery(self, names, match, ignored, clean, unknown=True):
   120 
   124 
   121         def genquery():
   125         def genquery():
   128             if unknown: states += '?'
   132             if unknown: states += '?'
   129             yield states
   133             yield states
   130 
   134 
   131         req = '\0'.join(genquery())
   135         req = '\0'.join(genquery())
   132 
   136 
   133         cs, resphdr = self.query(req)
   137         cs, resphdr = self.query('STAT', req)
   134 
   138 
   135         def readnames(nbytes):
   139         def readnames(nbytes):
   136             if nbytes:
   140             if nbytes:
   137                 names = cs.read(nbytes)
   141                 names = cs.read(nbytes)
   138                 if names:
   142                 if names: