35
35
Py_ssize_t PyTuple_GET_SIZE(object t)
36
36
int PyString_CheckExact(object)
37
37
char *PyString_AS_STRING(object s)
38
PyObject *PyString_FromStringAndSize_ptr "PyString_FromStringAndSize" (char *, Py_ssize_t)
39
38
Py_ssize_t PyString_GET_SIZE(object)
40
void PyString_InternInPlace(PyObject **)
41
long PyInt_AS_LONG(object)
39
unsigned long PyInt_AsUnsignedLongMask(object) except? -1
43
41
int PyDict_SetItem(object d, object k, object v) except -1
43
object PyTuple_New(Py_ssize_t count)
44
void PyTuple_SET_ITEM(object t, Py_ssize_t offset, object)
45
46
void Py_INCREF(object)
46
void Py_DECREF_ptr "Py_DECREF" (PyObject *)
48
PyObject * PyTuple_GET_ITEM_ptr "PyTuple_GET_ITEM" (object t,
50
int PyString_CheckExact_ptr "PyString_CheckExact" (PyObject *p)
51
Py_ssize_t PyString_GET_SIZE_ptr "PyString_GET_SIZE" (PyObject *s)
52
char *PyString_AS_STRING_ptr "PyString_AS_STRING" (PyObject *s)
48
53
object PyString_FromStringAndSize(char*, Py_ssize_t)
50
55
# cimport all of the definitions we will need to access
51
56
from _static_tuple_c cimport StaticTuple,\
52
57
import_static_tuple_c, StaticTuple_New, \
53
StaticTuple_Intern, StaticTuple_SET_ITEM, StaticTuple_CheckExact, \
58
StaticTuple_Intern, StaticTuple_SET_ITEM, StaticTuple_CheckExact
60
cdef extern from "_static_tuple_c.h":
61
# Defined explicitly rather than cimport-ing. Trying to use cimport, the
62
# type for PyObject is a different class that happens to have the same
64
PyObject * StaticTuple_GET_ITEM_ptr "StaticTuple_GET_ITEM" (StaticTuple,
57
68
from zlib import crc32
85
cdef object safe_interned_string_from_size(char *s, Py_ssize_t size):
89
'tried to create a string with an invalid size: %d @0x%x'
91
py_str = PyString_FromStringAndSize_ptr(s, size)
92
PyString_InternInPlace(&py_str)
93
result = <object>py_str
94
# Casting a PyObject* to an <object> triggers an INCREF from Pyrex, so we
95
# DECREF it to avoid geting immortal strings
100
96
def _search_key_16(key):
101
97
"""See chk_map._search_key_16."""
102
98
cdef Py_ssize_t num_bits
178
cdef _import_globals():
179
"""Set the global attributes. Done lazy to avoid recursive import loops."""
180
global _LeafNode, _InternalNode, _unknown
182
from bzrlib import chk_map
183
_LeafNode = chk_map.LeafNode
184
_InternalNode = chk_map.InternalNode
185
_unknown = chk_map._unknown
188
174
def _deserialise_leaf_node(bytes, key, search_key_func=None):
189
175
"""Deserialise bytes, with key key, into a LeafNode.
202
188
cdef StaticTuple entry_bits
204
190
if _LeafNode is None:
191
from bzrlib import chk_map
192
_LeafNode = chk_map.LeafNode
193
_InternalNode = chk_map.InternalNode
194
_unknown = chk_map._unknown
207
196
result = _LeafNode(search_key_func=search_key_func)
208
197
# Splitlines can split on '\r' so don't use it, split('\n') adds an
306
295
next_null - entry_start)
308
297
StaticTuple_SET_ITEM(entry_bits, i, entry)
309
if StaticTuple_GET_SIZE(entry_bits) != width:
298
if len(entry_bits) != width:
310
299
raise AssertionError(
311
300
'Incorrect number of elements (%d vs %d)'
312
301
% (len(entry_bits)+1, width + 1))
342
331
cdef char *prefix, *line_prefix, *next_null, *c_item_prefix
344
333
if _InternalNode is None:
334
from bzrlib import chk_map
335
_LeafNode = chk_map.LeafNode
336
_InternalNode = chk_map.InternalNode
337
_unknown = chk_map._unknown
346
338
result = _InternalNode(search_key_func=search_key_func)
348
340
if not StaticTuple_CheckExact(key):
403
395
result._node_width = len(item_prefix)
404
396
result._search_prefix = PyString_FromStringAndSize(prefix, prefix_length)
408
def _bytes_to_text_key(bytes):
409
"""Take a CHKInventory value string and return a (file_id, rev_id) tuple"""
411
cdef char *byte_str, *cur_end, *file_id_str, *byte_end
412
cdef char *revision_str
413
cdef Py_ssize_t byte_size, pos, file_id_len
415
if not PyString_CheckExact(bytes):
416
raise TypeError('bytes must be a string, got %r' % (type(bytes),))
417
byte_str = PyString_AS_STRING(bytes)
418
byte_size = PyString_GET_SIZE(bytes)
419
byte_end = byte_str + byte_size
420
cur_end = <char*>memchr(byte_str, c':', byte_size)
422
raise ValueError('No kind section found.')
423
if cur_end[1] != c' ':
425
'Kind section should end with ": ", got %r' % str(cur_end[:2],))
426
file_id_str = cur_end + 2
427
# file_id is now the data up until the next newline
428
cur_end = <char*>memchr(file_id_str, c'\n', byte_end - file_id_str)
430
raise ValueError('no newline after file-id')
431
file_id = safe_interned_string_from_size(file_id_str,
432
cur_end - file_id_str)
433
# this is the end of the parent_str
434
cur_end = <char*>memchr(cur_end + 1, c'\n', byte_end - cur_end - 1)
436
raise ValueError('no newline after parent_str')
437
# end of the name str
438
cur_end = <char*>memchr(cur_end + 1, c'\n', byte_end - cur_end - 1)
440
raise ValueError('no newline after name str')
441
# the next section is the revision info
442
revision_str = cur_end + 1
443
cur_end = <char*>memchr(cur_end + 1, c'\n', byte_end - cur_end - 1)
445
# This is probably a dir: entry, which has revision as the last item
447
revision = safe_interned_string_from_size(revision_str,
448
cur_end - revision_str)
449
key = StaticTuple_New(2)
451
StaticTuple_SET_ITEM(key, 0, file_id)
453
StaticTuple_SET_ITEM(key, 1, revision)
454
return StaticTuple_Intern(key)