Mercurial > public > mercurial-scm > hg
annotate hgext/fsmonitor/pywatchman/pybser.py @ 53042:cdd7bf612c7b stable tip
bundle-spec: properly format boolean parameter (issue6960)
This was breaking automatic clone bundle generation. This changeset fixes it and
add a test to catch it in the future.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 11 Mar 2025 02:29:42 +0100 |
parents | f4733654f144 |
children |
rev | line source |
---|---|
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
1 # Copyright 2015 Facebook, Inc. |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
2 # All rights reserved. |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
3 # |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
4 # Redistribution and use in source and binary forms, with or without |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
5 # modification, are permitted provided that the following conditions are met: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
6 # |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
7 # * Redistributions of source code must retain the above copyright notice, |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
8 # this list of conditions and the following disclaimer. |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
9 # |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
10 # * Redistributions in binary form must reproduce the above copyright notice, |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
11 # this list of conditions and the following disclaimer in the documentation |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
12 # and/or other materials provided with the distribution. |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
13 # |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
14 # * Neither the name Facebook nor the names of its contributors may be used to |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
15 # endorse or promote products derived from this software without specific |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
16 # prior written permission. |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
17 # |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
18 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
19 # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
20 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
21 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
22 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
23 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
24 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
25 # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
26 # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
28 |
51859
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
49848
diff
changeset
|
29 from __future__ import annotations |
f4733654f144
typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents:
49848
diff
changeset
|
30 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
31 import binascii |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
32 import collections |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
33 import ctypes |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
34 import struct |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
35 import sys |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
36 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
37 from . import compat |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
38 |
49495
59a72267f5ce
fsmonitor: migrate Python ABCs from collections to collections.abc
Martin von Zweigbergk <martinvonz@google.com>
parents:
48946
diff
changeset
|
39 abc = collections.abc |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
40 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
41 BSER_ARRAY = b"\x00" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
42 BSER_OBJECT = b"\x01" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
43 BSER_BYTESTRING = b"\x02" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
44 BSER_INT8 = b"\x03" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
45 BSER_INT16 = b"\x04" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
46 BSER_INT32 = b"\x05" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
47 BSER_INT64 = b"\x06" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
48 BSER_REAL = b"\x07" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
49 BSER_TRUE = b"\x08" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
50 BSER_FALSE = b"\x09" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
51 BSER_NULL = b"\x0a" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
52 BSER_TEMPLATE = b"\x0b" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
53 BSER_SKIP = b"\x0c" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
54 BSER_UTF8STRING = b"\x0d" |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
55 |
49848
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
56 STRING_TYPES = (str, bytes) |
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
57 unicode = str |
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
58 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
59 |
49848
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
60 def tobytes(i): |
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
61 return str(i).encode("ascii") |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
62 |
49848
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
63 |
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
64 long = int |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
65 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
66 # Leave room for the serialization header, which includes |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
67 # our overall length. To make things simpler, we'll use an |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
68 # int32 for the header |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
69 EMPTY_HEADER = b"\x00\x01\x05\x00\x00\x00\x00" |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
70 EMPTY_HEADER_V2 = b"\x00\x02\x00\x00\x00\x00\x05\x00\x00\x00\x00" |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
71 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
72 |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
73 def _int_size(x): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
74 """Return the smallest size int that can store the value""" |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
75 if -0x80 <= x <= 0x7F: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
76 return 1 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
77 elif -0x8000 <= x <= 0x7FFF: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
78 return 2 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
79 elif -0x80000000 <= x <= 0x7FFFFFFF: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
80 return 4 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
81 elif long(-0x8000000000000000) <= x <= long(0x7FFFFFFFFFFFFFFF): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
82 return 8 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
83 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
84 raise RuntimeError("Cannot represent value: " + str(x)) |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
85 |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
86 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
87 def _buf_pos(buf, pos): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
88 ret = buf[pos] |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
89 # Normalize the return type to bytes |
49848
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
90 if not isinstance(ret, bytes): |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
91 ret = bytes((ret,)) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
92 return ret |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
93 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
94 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
95 class _bser_buffer: |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
96 def __init__(self, version): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
97 self.bser_version = version |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
98 self.buf = ctypes.create_string_buffer(8192) |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
99 if self.bser_version == 1: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
100 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
101 tobytes(len(EMPTY_HEADER)) + b"s", self.buf, 0, EMPTY_HEADER |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
102 ) |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
103 self.wpos = len(EMPTY_HEADER) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
104 else: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
105 assert self.bser_version == 2 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
106 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
107 tobytes(len(EMPTY_HEADER_V2)) + b"s", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
108 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
109 0, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
110 EMPTY_HEADER_V2, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
111 ) |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
112 self.wpos = len(EMPTY_HEADER_V2) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
113 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
114 def ensure_size(self, size): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
115 while ctypes.sizeof(self.buf) - self.wpos < size: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
116 ctypes.resize(self.buf, ctypes.sizeof(self.buf) * 2) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
117 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
118 def append_long(self, val): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
119 size = _int_size(val) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
120 to_write = size + 1 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
121 self.ensure_size(to_write) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
122 if size == 1: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
123 struct.pack_into(b"=cb", self.buf, self.wpos, BSER_INT8, val) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
124 elif size == 2: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
125 struct.pack_into(b"=ch", self.buf, self.wpos, BSER_INT16, val) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
126 elif size == 4: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
127 struct.pack_into(b"=ci", self.buf, self.wpos, BSER_INT32, val) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
128 elif size == 8: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
129 struct.pack_into(b"=cq", self.buf, self.wpos, BSER_INT64, val) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
130 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
131 raise RuntimeError("Cannot represent this long value") |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
132 self.wpos += to_write |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
133 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
134 def append_string(self, s): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
135 if isinstance(s, unicode): |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
136 s = s.encode("utf-8") |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
137 s_len = len(s) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
138 size = _int_size(s_len) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
139 to_write = 2 + size + s_len |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
140 self.ensure_size(to_write) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
141 if size == 1: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
142 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
143 b"=ccb" + tobytes(s_len) + b"s", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
144 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
145 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
146 BSER_BYTESTRING, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
147 BSER_INT8, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
148 s_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
149 s, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
150 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
151 elif size == 2: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
152 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
153 b"=cch" + tobytes(s_len) + b"s", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
154 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
155 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
156 BSER_BYTESTRING, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
157 BSER_INT16, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
158 s_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
159 s, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
160 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
161 elif size == 4: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
162 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
163 b"=cci" + tobytes(s_len) + b"s", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
164 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
165 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
166 BSER_BYTESTRING, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
167 BSER_INT32, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
168 s_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
169 s, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
170 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
171 elif size == 8: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
172 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
173 b"=ccq" + tobytes(s_len) + b"s", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
174 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
175 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
176 BSER_BYTESTRING, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
177 BSER_INT64, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
178 s_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
179 s, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
180 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
181 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
182 raise RuntimeError("Cannot represent this string value") |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
183 self.wpos += to_write |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
184 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
185 def append_recursive(self, val): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
186 if isinstance(val, bool): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
187 needed = 1 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
188 self.ensure_size(needed) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
189 if val: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
190 to_encode = BSER_TRUE |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
191 else: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
192 to_encode = BSER_FALSE |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
193 struct.pack_into(b"=c", self.buf, self.wpos, to_encode) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
194 self.wpos += needed |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
195 elif val is None: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
196 needed = 1 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
197 self.ensure_size(needed) |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
198 struct.pack_into(b"=c", self.buf, self.wpos, BSER_NULL) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
199 self.wpos += needed |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
200 elif isinstance(val, (int, long)): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
201 self.append_long(val) |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
202 elif isinstance(val, STRING_TYPES): |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
203 self.append_string(val) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
204 elif isinstance(val, float): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
205 needed = 9 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
206 self.ensure_size(needed) |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
207 struct.pack_into(b"=cd", self.buf, self.wpos, BSER_REAL, val) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
208 self.wpos += needed |
49495
59a72267f5ce
fsmonitor: migrate Python ABCs from collections to collections.abc
Martin von Zweigbergk <martinvonz@google.com>
parents:
48946
diff
changeset
|
209 elif isinstance(val, abc.Mapping) and isinstance(val, abc.Sized): |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
210 val_len = len(val) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
211 size = _int_size(val_len) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
212 needed = 2 + size |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
213 self.ensure_size(needed) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
214 if size == 1: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
215 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
216 b"=ccb", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
217 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
218 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
219 BSER_OBJECT, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
220 BSER_INT8, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
221 val_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
222 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
223 elif size == 2: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
224 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
225 b"=cch", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
226 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
227 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
228 BSER_OBJECT, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
229 BSER_INT16, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
230 val_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
231 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
232 elif size == 4: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
233 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
234 b"=cci", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
235 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
236 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
237 BSER_OBJECT, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
238 BSER_INT32, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
239 val_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
240 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
241 elif size == 8: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
242 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
243 b"=ccq", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
244 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
245 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
246 BSER_OBJECT, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
247 BSER_INT64, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
248 val_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
249 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
250 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
251 raise RuntimeError("Cannot represent this mapping value") |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
252 self.wpos += needed |
49848
139f713010ea
watchman: drop some py2 compat code
Matt Harbison <matt_harbison@yahoo.com>
parents:
49537
diff
changeset
|
253 iteritems = val.items() |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
254 for k, v in iteritems: |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
255 self.append_string(k) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
256 self.append_recursive(v) |
49495
59a72267f5ce
fsmonitor: migrate Python ABCs from collections to collections.abc
Martin von Zweigbergk <martinvonz@google.com>
parents:
48946
diff
changeset
|
257 elif isinstance(val, abc.Iterable) and isinstance(val, abc.Sized): |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
258 val_len = len(val) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
259 size = _int_size(val_len) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
260 needed = 2 + size |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
261 self.ensure_size(needed) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
262 if size == 1: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
263 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
264 b"=ccb", self.buf, self.wpos, BSER_ARRAY, BSER_INT8, val_len |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
265 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
266 elif size == 2: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
267 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
268 b"=cch", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
269 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
270 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
271 BSER_ARRAY, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
272 BSER_INT16, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
273 val_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
274 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
275 elif size == 4: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
276 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
277 b"=cci", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
278 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
279 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
280 BSER_ARRAY, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
281 BSER_INT32, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
282 val_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
283 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
284 elif size == 8: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
285 struct.pack_into( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
286 b"=ccq", |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
287 self.buf, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
288 self.wpos, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
289 BSER_ARRAY, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
290 BSER_INT64, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
291 val_len, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
292 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
293 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
294 raise RuntimeError("Cannot represent this sequence value") |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
295 self.wpos += needed |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
296 for v in val: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
297 self.append_recursive(v) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
298 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
299 raise RuntimeError("Cannot represent unknown value type") |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
300 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
301 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
302 def dumps(obj, version=1, capabilities=0): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
303 bser_buf = _bser_buffer(version=version) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
304 bser_buf.append_recursive(obj) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
305 # Now fill in the overall length |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
306 if version == 1: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
307 obj_len = bser_buf.wpos - len(EMPTY_HEADER) |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
308 struct.pack_into(b"=i", bser_buf.buf, 3, obj_len) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
309 else: |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
310 obj_len = bser_buf.wpos - len(EMPTY_HEADER_V2) |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
311 struct.pack_into(b"=i", bser_buf.buf, 2, capabilities) |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
312 struct.pack_into(b"=i", bser_buf.buf, 7, obj_len) |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
313 return bser_buf.buf.raw[: bser_buf.wpos] |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
314 |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
315 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
316 # This is a quack-alike with the bserObjectType in bser.c |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
317 # It provides by getattr accessors and getitem for both index |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
318 # and name. |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
319 class _BunserDict: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
320 __slots__ = ("_keys", "_values") |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
321 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
322 def __init__(self, keys, values): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
323 self._keys = keys |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
324 self._values = values |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
325 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
326 def __getattr__(self, name): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
327 return self.__getitem__(name) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
328 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
329 def __getitem__(self, key): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
330 if isinstance(key, (int, long)): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
331 return self._values[key] |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
332 elif key.startswith("st_"): |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
333 # hack^Wfeature to allow mercurial to use "st_size" to |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
334 # reference "size" |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
335 key = key[3:] |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
336 try: |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
337 return self._values[self._keys.index(key)] |
41365
876494fd967d
cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents:
30656
diff
changeset
|
338 except ValueError: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
339 raise KeyError("_BunserDict has no key %s" % key) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
340 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
341 def __len__(self): |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
342 return len(self._keys) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
343 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
344 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
345 class Bunser: |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
346 def __init__(self, mutable=True, value_encoding=None, value_errors=None): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
347 self.mutable = mutable |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
348 self.value_encoding = value_encoding |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
349 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
350 if value_encoding is None: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
351 self.value_errors = None |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
352 elif value_errors is None: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
353 self.value_errors = "strict" |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
354 else: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
355 self.value_errors = value_errors |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
356 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
357 @staticmethod |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
358 def unser_int(buf, pos): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
359 try: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
360 int_type = _buf_pos(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
361 except IndexError: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
362 raise ValueError("Invalid bser int encoding, pos out of range") |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
363 if int_type == BSER_INT8: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
364 needed = 2 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
365 fmt = b"=b" |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
366 elif int_type == BSER_INT16: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
367 needed = 3 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
368 fmt = b"=h" |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
369 elif int_type == BSER_INT32: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
370 needed = 5 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
371 fmt = b"=i" |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
372 elif int_type == BSER_INT64: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
373 needed = 9 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
374 fmt = b"=q" |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
375 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
376 raise ValueError( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
377 "Invalid bser int encoding 0x%s at position %s" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
378 % (binascii.hexlify(int_type).decode("ascii"), pos) |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
379 ) |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
380 int_val = struct.unpack_from(fmt, buf, pos + 1)[0] |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
381 return (int_val, pos + needed) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
382 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
383 def unser_utf8_string(self, buf, pos): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
384 str_len, pos = self.unser_int(buf, pos + 1) |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
385 str_val = struct.unpack_from(tobytes(str_len) + b"s", buf, pos)[0] |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
386 return (str_val.decode("utf-8"), pos + str_len) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
387 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
388 def unser_bytestring(self, buf, pos): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
389 str_len, pos = self.unser_int(buf, pos + 1) |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
390 str_val = struct.unpack_from(tobytes(str_len) + b"s", buf, pos)[0] |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
391 if self.value_encoding is not None: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
392 str_val = str_val.decode(self.value_encoding, self.value_errors) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
393 # str_len stays the same because that's the length in bytes |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
394 return (str_val, pos + str_len) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
395 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
396 def unser_array(self, buf, pos): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
397 arr_len, pos = self.unser_int(buf, pos + 1) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
398 arr = [] |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
399 for _ in range(arr_len): |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
400 arr_item, pos = self.loads_recursive(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
401 arr.append(arr_item) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
402 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
403 if not self.mutable: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
404 arr = tuple(arr) |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
405 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
406 return arr, pos |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
407 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
408 def unser_object(self, buf, pos): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
409 obj_len, pos = self.unser_int(buf, pos + 1) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
410 if self.mutable: |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
411 obj = {} |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
412 else: |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
413 keys = [] |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
414 vals = [] |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
415 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
416 for _ in range(obj_len): |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
417 key, pos = self.unser_utf8_string(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
418 val, pos = self.loads_recursive(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
419 if self.mutable: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
420 obj[key] = val |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
421 else: |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
422 keys.append(key) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
423 vals.append(val) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
424 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
425 if not self.mutable: |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
426 obj = _BunserDict(keys, vals) |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
427 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
428 return obj, pos |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
429 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
430 def unser_template(self, buf, pos): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
431 val_type = _buf_pos(buf, pos + 1) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
432 if val_type != BSER_ARRAY: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
433 raise RuntimeError("Expect ARRAY to follow TEMPLATE") |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
434 # force UTF-8 on keys |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
435 keys_bunser = Bunser(mutable=self.mutable, value_encoding="utf-8") |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
436 keys, pos = keys_bunser.unser_array(buf, pos + 1) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
437 nitems, pos = self.unser_int(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
438 arr = [] |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
439 for _ in range(nitems): |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
440 if self.mutable: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
441 obj = {} |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
442 else: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
443 vals = [] |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
444 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
445 for keyidx in range(len(keys)): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
446 if _buf_pos(buf, pos) == BSER_SKIP: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
447 pos += 1 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
448 ele = None |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
449 else: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
450 ele, pos = self.loads_recursive(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
451 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
452 if self.mutable: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
453 key = keys[keyidx] |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
454 obj[key] = ele |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
455 else: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
456 vals.append(ele) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
457 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
458 if not self.mutable: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
459 obj = _BunserDict(keys, vals) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
460 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
461 arr.append(obj) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
462 return arr, pos |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
463 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
464 def loads_recursive(self, buf, pos): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
465 val_type = _buf_pos(buf, pos) |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
466 if ( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
467 val_type == BSER_INT8 |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
468 or val_type == BSER_INT16 |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
469 or val_type == BSER_INT32 |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
470 or val_type == BSER_INT64 |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
471 ): |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
472 return self.unser_int(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
473 elif val_type == BSER_REAL: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
474 val = struct.unpack_from(b"=d", buf, pos + 1)[0] |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
475 return (val, pos + 9) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
476 elif val_type == BSER_TRUE: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
477 return (True, pos + 1) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
478 elif val_type == BSER_FALSE: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
479 return (False, pos + 1) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
480 elif val_type == BSER_NULL: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
481 return (None, pos + 1) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
482 elif val_type == BSER_BYTESTRING: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
483 return self.unser_bytestring(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
484 elif val_type == BSER_UTF8STRING: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
485 return self.unser_utf8_string(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
486 elif val_type == BSER_ARRAY: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
487 return self.unser_array(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
488 elif val_type == BSER_OBJECT: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
489 return self.unser_object(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
490 elif val_type == BSER_TEMPLATE: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
491 return self.unser_template(buf, pos) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
492 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
493 raise ValueError( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
494 "unhandled bser opcode 0x%s" |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
495 % binascii.hexlify(val_type).decode("ascii") |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
496 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
497 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
498 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
499 def _pdu_info_helper(buf): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
500 if buf[0:2] == EMPTY_HEADER[0:2]: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
501 bser_version = 1 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
502 bser_capabilities = 0 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
503 expected_len, pos2 = Bunser.unser_int(buf, 2) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
504 elif buf[0:2] == EMPTY_HEADER_V2[0:2]: |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
505 if len(buf) < 8: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
506 raise ValueError("Invalid BSER header") |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
507 bser_version = 2 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
508 bser_capabilities = struct.unpack_from("I", buf, 2)[0] |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
509 expected_len, pos2 = Bunser.unser_int(buf, 6) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
510 else: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
511 raise ValueError("Invalid BSER header") |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
512 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
513 return bser_version, bser_capabilities, expected_len, pos2 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
514 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
515 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
516 def pdu_info(buf): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
517 info = _pdu_info_helper(buf) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
518 return info[0], info[1], info[2] + info[3] |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
519 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
520 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
521 def pdu_len(buf): |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
522 info = _pdu_info_helper(buf) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
523 return info[2] + info[3] |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
524 |
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
525 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
526 def loads(buf, mutable=True, value_encoding=None, value_errors=None): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
527 """Deserialize a BSER-encoded blob. |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
528 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
529 @param buf: The buffer to deserialize. |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
530 @type buf: bytes |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
531 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
532 @param mutable: Whether to return mutable results. |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
533 @type mutable: bool |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
534 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
535 @param value_encoding: Optional codec to use to decode values. If |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
536 unspecified or None, return values as bytestrings. |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
537 @type value_encoding: str |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
538 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
539 @param value_errors: Optional error handler for codec. 'strict' by default. |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
540 The other most common argument is 'surrogateescape' on |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
541 Python 3. If value_encoding is None, this is ignored. |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
542 @type value_errors: str |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
543 """ |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
544 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
545 info = _pdu_info_helper(buf) |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
546 expected_len = info[2] |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
547 pos = info[3] |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
548 |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
549 if len(buf) != expected_len + pos: |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
550 raise ValueError( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
551 "bser data len %d != header len %d" % (expected_len + pos, len(buf)) |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
552 ) |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
553 |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
554 bunser = Bunser( |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
555 mutable=mutable, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
556 value_encoding=value_encoding, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
557 value_errors=value_errors, |
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
558 ) |
28432
2377c4ac4eec
fsmonitor: dependencies for new experimental extension
Martijn Pieters <mjpieters@fb.com>
parents:
diff
changeset
|
559 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
560 return bunser.loads_recursive(buf, pos)[0] |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
561 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
562 |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
563 def load(fp, mutable=True, value_encoding=None, value_errors=None): |
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
564 from . import load |
43385
6469c23a40a2
fsmonitor: refresh pywatchman with upstream
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41365
diff
changeset
|
565 |
30656
16f4b341288d
fsmonitor: refresh pywatchman to upstream
Zack Hricz <zphricz@fb.com>
parents:
28432
diff
changeset
|
566 return load.load(fp, mutable, value_encoding, value_errors) |