26 def dirstatetuple(*x): |
26 def dirstatetuple(*x): |
27 # x is a tuple |
27 # x is a tuple |
28 return x |
28 return x |
29 |
29 |
30 |
30 |
31 indexformatng = ">Qiiiiii20s12x" |
31 indexformatng = b">Qiiiiii20s12x" |
32 indexfirst = struct.calcsize('Q') |
32 indexfirst = struct.calcsize(b'Q') |
33 sizeint = struct.calcsize('i') |
33 sizeint = struct.calcsize(b'i') |
34 indexsize = struct.calcsize(indexformatng) |
34 indexsize = struct.calcsize(indexformatng) |
35 |
35 |
36 |
36 |
37 def gettype(q): |
37 def gettype(q): |
38 return int(q & 0xFFFF) |
38 return int(q & 0xFFFF) |
49 def append(self, tup): |
49 def append(self, tup): |
50 self._extra.append(tup) |
50 self._extra.append(tup) |
51 |
51 |
52 def _check_index(self, i): |
52 def _check_index(self, i): |
53 if not isinstance(i, int): |
53 if not isinstance(i, int): |
54 raise TypeError("expecting int indexes") |
54 raise TypeError(b"expecting int indexes") |
55 if i < 0 or i >= len(self): |
55 if i < 0 or i >= len(self): |
56 raise IndexError |
56 raise IndexError |
57 |
57 |
58 def __getitem__(self, i): |
58 def __getitem__(self, i): |
59 if i == -1: |
59 if i == -1: |
81 def _calculate_index(self, i): |
81 def _calculate_index(self, i): |
82 return i * indexsize |
82 return i * indexsize |
83 |
83 |
84 def __delitem__(self, i): |
84 def __delitem__(self, i): |
85 if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: |
85 if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: |
86 raise ValueError("deleting slices only supports a:-1 with step 1") |
86 raise ValueError(b"deleting slices only supports a:-1 with step 1") |
87 i = i.start |
87 i = i.start |
88 self._check_index(i) |
88 self._check_index(i) |
89 if i < self._lgt: |
89 if i < self._lgt: |
90 self._data = self._data[: i * indexsize] |
90 self._data = self._data[: i * indexsize] |
91 self._lgt = i |
91 self._lgt = i |
106 if lgt is not None: |
106 if lgt is not None: |
107 self._offsets = [0] * lgt |
107 self._offsets = [0] * lgt |
108 count = 0 |
108 count = 0 |
109 while off <= len(self._data) - indexsize: |
109 while off <= len(self._data) - indexsize: |
110 (s,) = struct.unpack( |
110 (s,) = struct.unpack( |
111 '>i', self._data[off + indexfirst : off + sizeint + indexfirst] |
111 b'>i', self._data[off + indexfirst : off + sizeint + indexfirst] |
112 ) |
112 ) |
113 if lgt is not None: |
113 if lgt is not None: |
114 self._offsets[count] = off |
114 self._offsets[count] = off |
115 count += 1 |
115 count += 1 |
116 off += indexsize + s |
116 off += indexsize + s |
117 if off != len(self._data): |
117 if off != len(self._data): |
118 raise ValueError("corrupted data") |
118 raise ValueError(b"corrupted data") |
119 return count |
119 return count |
120 |
120 |
121 def __delitem__(self, i): |
121 def __delitem__(self, i): |
122 if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: |
122 if not isinstance(i, slice) or not i.stop == -1 or i.step is not None: |
123 raise ValueError("deleting slices only supports a:-1 with step 1") |
123 raise ValueError(b"deleting slices only supports a:-1 with step 1") |
124 i = i.start |
124 i = i.start |
125 self._check_index(i) |
125 self._check_index(i) |
126 if i < self._lgt: |
126 if i < self._lgt: |
127 self._offsets = self._offsets[:i] |
127 self._offsets = self._offsets[:i] |
128 self._lgt = i |
128 self._lgt = i |
141 |
141 |
142 |
142 |
143 def parse_dirstate(dmap, copymap, st): |
143 def parse_dirstate(dmap, copymap, st): |
144 parents = [st[:20], st[20:40]] |
144 parents = [st[:20], st[20:40]] |
145 # dereference fields so they will be local in loop |
145 # dereference fields so they will be local in loop |
146 format = ">cllll" |
146 format = b">cllll" |
147 e_size = struct.calcsize(format) |
147 e_size = struct.calcsize(format) |
148 pos1 = 40 |
148 pos1 = 40 |
149 l = len(st) |
149 l = len(st) |
150 |
150 |
151 # the inner loop |
151 # the inner loop |
152 while pos1 < l: |
152 while pos1 < l: |
153 pos2 = pos1 + e_size |
153 pos2 = pos1 + e_size |
154 e = _unpack(">cllll", st[pos1:pos2]) # a literal here is faster |
154 e = _unpack(b">cllll", st[pos1:pos2]) # a literal here is faster |
155 pos1 = pos2 + e[4] |
155 pos1 = pos2 + e[4] |
156 f = st[pos2:pos1] |
156 f = st[pos2:pos1] |
157 if '\0' in f: |
157 if b'\0' in f: |
158 f, c = f.split('\0') |
158 f, c = f.split(b'\0') |
159 copymap[f] = c |
159 copymap[f] = c |
160 dmap[f] = e[:4] |
160 dmap[f] = e[:4] |
161 return parents |
161 return parents |
162 |
162 |
163 |
163 |
164 def pack_dirstate(dmap, copymap, pl, now): |
164 def pack_dirstate(dmap, copymap, pl, now): |
165 now = int(now) |
165 now = int(now) |
166 cs = stringio() |
166 cs = stringio() |
167 write = cs.write |
167 write = cs.write |
168 write("".join(pl)) |
168 write(b"".join(pl)) |
169 for f, e in dmap.iteritems(): |
169 for f, e in dmap.iteritems(): |
170 if e[0] == 'n' and e[3] == now: |
170 if e[0] == b'n' and e[3] == now: |
171 # The file was last modified "simultaneously" with the current |
171 # The file was last modified "simultaneously" with the current |
172 # write to dirstate (i.e. within the same second for file- |
172 # write to dirstate (i.e. within the same second for file- |
173 # systems with a granularity of 1 sec). This commonly happens |
173 # systems with a granularity of 1 sec). This commonly happens |
174 # for at least a couple of files on 'update'. |
174 # for at least a couple of files on 'update'. |
175 # The user could change the file without changing its size |
175 # The user could change the file without changing its size |
179 # mistakenly treating such files as clean. |
179 # mistakenly treating such files as clean. |
180 e = dirstatetuple(e[0], e[1], e[2], -1) |
180 e = dirstatetuple(e[0], e[1], e[2], -1) |
181 dmap[f] = e |
181 dmap[f] = e |
182 |
182 |
183 if f in copymap: |
183 if f in copymap: |
184 f = "%s\0%s" % (f, copymap[f]) |
184 f = b"%s\0%s" % (f, copymap[f]) |
185 e = _pack(">cllll", e[0], e[1], e[2], e[3], len(f)) |
185 e = _pack(b">cllll", e[0], e[1], e[2], e[3], len(f)) |
186 write(e) |
186 write(e) |
187 write(f) |
187 write(f) |
188 return cs.getvalue() |
188 return cs.getvalue() |