def receive(self): response = None try: buf = [self.sock.recv(sniff_len)] if not buf[0]: raise Unavailable('empty watchman response') elen = bser.pdu_len(buf[0]) rlen = len(buf[0]) while elen > rlen: buf.append(self.sock.recv(elen - rlen)) rlen += len(buf[-1]) response = ''.join(buf) except socket.timeout: raise Unavailable('timed out waiting for response') result = None try: result = bser.loads(response) except ValueError, e: raise Unavailable('watchman response decode error: %s' % e)
def query(self, *args): cmd = bser.dumps(args) response = None result = None sock = self._connect() try: sock.sendall(cmd) buf = [sock.recv(sniff_len)] if not buf[0]: raise Unavailable('empty watchman response') elen = bser.pdu_len(buf[0]) rlen = len(buf[0]) while elen > rlen: buf.append(sock.recv(elen - rlen)) rlen += len(buf[-1]) response = ''.join(buf) except socket.timeout: raise Unavailable('timed out waiting for response') try: result = bser.loads(response) except ValueError, e: raise Unavailable('watchman response decode error: %s' % e)
def _resolvesockname(self): # if invoked via a trigger, watchman will set this env var; we # should use it unless explicitly set otherwise path = os.getenv('WATCHMAN_SOCK') if path: return path cmd = ['watchman', '--output-encoding=bser', 'get-sockname'] try: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) except OSError: raise Unavailable('"watchman" executable not in PATH') stdout, stderr = p.communicate() exitcode = p.poll() if exitcode: raise Unavailable("watchman exited with code %d" % exitcode) result = bser.loads(stdout) if 'error' in result: raise Unavailable('get-sockname error: %s' % result['error']) return result['sockname']
def _resolvesockname(self): # if invoked via a trigger, watchman will set this env var; we # should use it unless explicitly set otherwise path = os.getenv('WATCHMAN_SOCK') if path: return path cmd = ['watchman', '--output-encoding=bser', 'get-sockname'] try: p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=os.name != 'nt') except OSError as e: raise WatchmanError('"watchman" executable not in PATH (%s)', e) stdout, stderr = p.communicate() exitcode = p.poll() if exitcode: raise WatchmanError("watchman exited with code %d" % exitcode) result = bser.loads(stdout) if 'error' in result: raise WatchmanError('get-sockname error: %s' % result['error']) return result['sockname']
def query(self, *args): cmd = bser.dumps(args) response = None result = None sock = self._connect() try: sock.sendall(cmd) buf = [sock.recv(8192)] if not buf[0]: raise Unavailable('empty watchman response') elen = bser.pdu_len(buf[0]) rlen = len(buf[0]) while elen > rlen: buf.append(sock.recv(elen - rlen)) rlen += len(buf[-1]) response = ''.join(buf) except socket.timeout: raise Unavailable('timed out waiting for response') try: result = bser.loads(response) except ValueError, e: raise Unavailable('watchman response decode error: %s' % e)
def munged(self, val, munged): enc = bser.dumps(val) if isinstance(val, unicode): print "# %s --> %s" % (val.encode('utf-8'), enc.encode('hex')) else: print "# %s --> %s" % (val, enc.encode('hex')) dec = bser.loads(enc) self.assertEquals(munged, dec)
def test_template(self): # since we can't generate the template bser output, here's a # a blob from the C test suite in watchman templ = "\x00\x01\x03\x28" + \ "\x0b\x00\x03\x02\x02\x03\x04\x6e\x61\x6d\x65\x02" + \ "\x03\x03\x61\x67\x65\x03\x03\x02\x03\x04\x66\x72" + \ "\x65\x64\x03\x14\x02\x03\x04\x70\x65\x74\x65\x03" + \ "\x1e\x0c\x03\x19" dec = bser.loads(templ) exp = [ {"name": "fred", "age": 20}, {"name": "pete", "age": 30}, {"age": 25} ] self.assertEquals(exp, dec)
def receive(self): buf = [self.transport.readBytes(sniff_len)] if not buf[0]: raise WatchmanError('empty watchman response') elen = bser.pdu_len(buf[0]) rlen = len(buf[0]) while elen > rlen: buf.append(self.transport.readBytes(elen - rlen)) rlen += len(buf[-1]) response = ''.join(buf) try: res = bser.loads(response) return res except ValueError as e: raise WatchmanError('watchman response decode error: %s' % e)
def receive(self): buf = [self.transport.readBytes(sniff_len)] if not buf[0]: raise WatchmanError('empty watchman response') elen = bser.pdu_len(buf[0]) rlen = len(buf[0]) while elen > rlen: buf.append(self.transport.readBytes(elen - rlen)) rlen += len(buf[-1]) response = ''.join(buf) try: return bser.loads(response) except ValueError as e: raise WatchmanError('watchman response decode error: %s' % e)
def test_template(self): # since we can't generate the template bser output, here's a # a blob from the C test suite in watchman templ = "\x00\x01\x03\x28" + \ "\x0b\x00\x03\x02\x02\x03\x04\x6e\x61\x6d\x65\x02" + \ "\x03\x03\x61\x67\x65\x03\x03\x02\x03\x04\x66\x72" + \ "\x65\x64\x03\x14\x02\x03\x04\x70\x65\x74\x65\x03" + \ "\x1e\x0c\x03\x19" dec = bser.loads(templ) exp = [{ "name": "fred", "age": 20 }, { "name": "pete", "age": 30 }, { "age": 25 }] self.assertEquals(exp, dec)
def _loads(self, response): return bser.loads(response, False)
def roundtrip(self, val): enc = bser.dumps(val) print "# %s --> %s" % (val, enc.encode('hex')) dec = bser.loads(enc) self.assertEquals(val, dec)