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: |