608 } |
608 } |
609 |
609 |
610 /* Figure out how much we need to allocate. */ |
610 /* Figure out how much we need to allocate. */ |
611 for (nbytes = 40, pos = 0; PyDict_Next(map, &pos, &k, &v);) { |
611 for (nbytes = 40, pos = 0; PyDict_Next(map, &pos, &k, &v);) { |
612 PyObject *c; |
612 PyObject *c; |
613 if (!PyString_Check(k)) { |
613 if (!PyBytes_Check(k)) { |
614 PyErr_SetString(PyExc_TypeError, "expected string key"); |
614 PyErr_SetString(PyExc_TypeError, "expected string key"); |
615 goto bail; |
615 goto bail; |
616 } |
616 } |
617 nbytes += PyString_GET_SIZE(k) + 17; |
617 nbytes += PyBytes_GET_SIZE(k) + 17; |
618 c = PyDict_GetItem(copymap, k); |
618 c = PyDict_GetItem(copymap, k); |
619 if (c) { |
619 if (c) { |
620 if (!PyString_Check(c)) { |
620 if (!PyBytes_Check(c)) { |
621 PyErr_SetString(PyExc_TypeError, |
621 PyErr_SetString(PyExc_TypeError, |
622 "expected string key"); |
622 "expected string key"); |
623 goto bail; |
623 goto bail; |
624 } |
624 } |
625 nbytes += PyString_GET_SIZE(c) + 1; |
625 nbytes += PyBytes_GET_SIZE(c) + 1; |
626 } |
626 } |
627 } |
627 } |
628 |
628 |
629 packobj = PyString_FromStringAndSize(NULL, nbytes); |
629 packobj = PyBytes_FromStringAndSize(NULL, nbytes); |
630 if (packobj == NULL) |
630 if (packobj == NULL) |
631 goto bail; |
631 goto bail; |
632 |
632 |
633 p = PyString_AS_STRING(packobj); |
633 p = PyBytes_AS_STRING(packobj); |
634 |
634 |
635 pn = PySequence_ITEM(pl, 0); |
635 pn = PySequence_ITEM(pl, 0); |
636 if (PyString_AsStringAndSize(pn, &s, &l) == -1 || l != 20) { |
636 if (PyBytes_AsStringAndSize(pn, &s, &l) == -1 || l != 20) { |
637 PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash"); |
637 PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash"); |
638 goto bail; |
638 goto bail; |
639 } |
639 } |
640 memcpy(p, s, l); |
640 memcpy(p, s, l); |
641 p += 20; |
641 p += 20; |
642 pn = PySequence_ITEM(pl, 1); |
642 pn = PySequence_ITEM(pl, 1); |
643 if (PyString_AsStringAndSize(pn, &s, &l) == -1 || l != 20) { |
643 if (PyBytes_AsStringAndSize(pn, &s, &l) == -1 || l != 20) { |
644 PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash"); |
644 PyErr_SetString(PyExc_TypeError, "expected a 20-byte hash"); |
645 goto bail; |
645 goto bail; |
646 } |
646 } |
647 memcpy(p, s, l); |
647 memcpy(p, s, l); |
648 p += 20; |
648 p += 20; |
683 putbe32((uint32_t)mode, p); |
683 putbe32((uint32_t)mode, p); |
684 putbe32((uint32_t)size, p + 4); |
684 putbe32((uint32_t)size, p + 4); |
685 putbe32((uint32_t)mtime, p + 8); |
685 putbe32((uint32_t)mtime, p + 8); |
686 t = p + 12; |
686 t = p + 12; |
687 p += 16; |
687 p += 16; |
688 len = PyString_GET_SIZE(k); |
688 len = PyBytes_GET_SIZE(k); |
689 memcpy(p, PyString_AS_STRING(k), len); |
689 memcpy(p, PyBytes_AS_STRING(k), len); |
690 p += len; |
690 p += len; |
691 o = PyDict_GetItem(copymap, k); |
691 o = PyDict_GetItem(copymap, k); |
692 if (o) { |
692 if (o) { |
693 *p++ = '\0'; |
693 *p++ = '\0'; |
694 l = PyString_GET_SIZE(o); |
694 l = PyBytes_GET_SIZE(o); |
695 memcpy(p, PyString_AS_STRING(o), l); |
695 memcpy(p, PyBytes_AS_STRING(o), l); |
696 p += l; |
696 p += l; |
697 len += l + 1; |
697 len += l + 1; |
698 } |
698 } |
699 putbe32((uint32_t)len, t); |
699 putbe32((uint32_t)len, t); |
700 } |
700 } |
701 |
701 |
702 pos = p - PyString_AS_STRING(packobj); |
702 pos = p - PyBytes_AS_STRING(packobj); |
703 if (pos != nbytes) { |
703 if (pos != nbytes) { |
704 PyErr_Format(PyExc_SystemError, "bad dirstate size: %ld != %ld", |
704 PyErr_Format(PyExc_SystemError, "bad dirstate size: %ld != %ld", |
705 (long)pos, (long)nbytes); |
705 (long)pos, (long)nbytes); |
706 goto bail; |
706 goto bail; |
707 } |
707 } |
794 inline_scan(self, self->offsets); |
794 inline_scan(self, self->offsets); |
795 } |
795 } |
796 return self->offsets[pos]; |
796 return self->offsets[pos]; |
797 } |
797 } |
798 |
798 |
799 return PyString_AS_STRING(self->data) + pos * v1_hdrsize; |
799 return PyBytes_AS_STRING(self->data) + pos * v1_hdrsize; |
800 } |
800 } |
801 |
801 |
802 static inline int index_get_parents(indexObject *self, Py_ssize_t rev, |
802 static inline int index_get_parents(indexObject *self, Py_ssize_t rev, |
803 int *ps, int maxrev) |
803 int *ps, int maxrev) |
804 { |
804 { |
924 |
924 |
925 if (pos >= self->length - 1) { |
925 if (pos >= self->length - 1) { |
926 PyObject *tuple, *str; |
926 PyObject *tuple, *str; |
927 tuple = PyList_GET_ITEM(self->added, pos - self->length + 1); |
927 tuple = PyList_GET_ITEM(self->added, pos - self->length + 1); |
928 str = PyTuple_GetItem(tuple, 7); |
928 str = PyTuple_GetItem(tuple, 7); |
929 return str ? PyString_AS_STRING(str) : NULL; |
929 return str ? PyBytes_AS_STRING(str) : NULL; |
930 } |
930 } |
931 |
931 |
932 data = index_deref(self, pos); |
932 data = index_deref(self, pos); |
933 return data ? data + 32 : NULL; |
933 return data ? data + 32 : NULL; |
934 } |
934 } |
935 |
935 |
936 static int nt_insert(indexObject *self, const char *node, int rev); |
936 static int nt_insert(indexObject *self, const char *node, int rev); |
937 |
937 |
938 static int node_check(PyObject *obj, char **node, Py_ssize_t *nodelen) |
938 static int node_check(PyObject *obj, char **node, Py_ssize_t *nodelen) |
939 { |
939 { |
940 if (PyString_AsStringAndSize(obj, node, nodelen) == -1) |
940 if (PyBytes_AsStringAndSize(obj, node, nodelen) == -1) |
941 return -1; |
941 return -1; |
942 if (*nodelen == 20) |
942 if (*nodelen == 20) |
943 return 0; |
943 return 0; |
944 PyErr_SetString(PyExc_ValueError, "20-byte hash required"); |
944 PyErr_SetString(PyExc_ValueError, "20-byte hash required"); |
945 return -1; |
945 return -1; |
1823 case -3: |
1823 case -3: |
1824 return NULL; |
1824 return NULL; |
1825 case -2: |
1825 case -2: |
1826 Py_RETURN_NONE; |
1826 Py_RETURN_NONE; |
1827 case -1: |
1827 case -1: |
1828 return PyString_FromStringAndSize(nullid, 20); |
1828 return PyBytes_FromStringAndSize(nullid, 20); |
1829 } |
1829 } |
1830 |
1830 |
1831 fullnode = index_node(self, rev); |
1831 fullnode = index_node(self, rev); |
1832 if (fullnode == NULL) { |
1832 if (fullnode == NULL) { |
1833 PyErr_Format(PyExc_IndexError, |
1833 PyErr_Format(PyExc_IndexError, |
1834 "could not access rev %d", rev); |
1834 "could not access rev %d", rev); |
1835 return NULL; |
1835 return NULL; |
1836 } |
1836 } |
1837 return PyString_FromStringAndSize(fullnode, 20); |
1837 return PyBytes_FromStringAndSize(fullnode, 20); |
1838 } |
1838 } |
1839 |
1839 |
1840 static PyObject *index_m_get(indexObject *self, PyObject *args) |
1840 static PyObject *index_m_get(indexObject *self, PyObject *args) |
1841 { |
1841 { |
1842 Py_ssize_t nodelen; |
1842 Py_ssize_t nodelen; |
2245 |
2245 |
2246 for (i = start; i < len; i++) { |
2246 for (i = start; i < len; i++) { |
2247 PyObject *tuple = PyList_GET_ITEM(self->added, i); |
2247 PyObject *tuple = PyList_GET_ITEM(self->added, i); |
2248 PyObject *node = PyTuple_GET_ITEM(tuple, 7); |
2248 PyObject *node = PyTuple_GET_ITEM(tuple, 7); |
2249 |
2249 |
2250 nt_insert(self, PyString_AS_STRING(node), -1); |
2250 nt_insert(self, PyBytes_AS_STRING(node), -1); |
2251 } |
2251 } |
2252 |
2252 |
2253 if (start == 0) |
2253 if (start == 0) |
2254 Py_CLEAR(self->added); |
2254 Py_CLEAR(self->added); |
2255 } |
2255 } |
2370 * Find all RevlogNG entries in an index that has inline data. Update |
2370 * Find all RevlogNG entries in an index that has inline data. Update |
2371 * the optional "offsets" table with those entries. |
2371 * the optional "offsets" table with those entries. |
2372 */ |
2372 */ |
2373 static Py_ssize_t inline_scan(indexObject *self, const char **offsets) |
2373 static Py_ssize_t inline_scan(indexObject *self, const char **offsets) |
2374 { |
2374 { |
2375 const char *data = PyString_AS_STRING(self->data); |
2375 const char *data = PyBytes_AS_STRING(self->data); |
2376 Py_ssize_t pos = 0; |
2376 Py_ssize_t pos = 0; |
2377 Py_ssize_t end = PyString_GET_SIZE(self->data); |
2377 Py_ssize_t end = PyBytes_GET_SIZE(self->data); |
2378 long incr = v1_hdrsize; |
2378 long incr = v1_hdrsize; |
2379 Py_ssize_t len = 0; |
2379 Py_ssize_t len = 0; |
2380 |
2380 |
2381 while (pos + v1_hdrsize <= end && pos >= 0) { |
2381 while (pos + v1_hdrsize <= end && pos >= 0) { |
2382 uint32_t comp_len; |
2382 uint32_t comp_len; |
2414 self->nt = NULL; |
2414 self->nt = NULL; |
2415 self->offsets = NULL; |
2415 self->offsets = NULL; |
2416 |
2416 |
2417 if (!PyArg_ParseTuple(args, "OO", &data_obj, &inlined_obj)) |
2417 if (!PyArg_ParseTuple(args, "OO", &data_obj, &inlined_obj)) |
2418 return -1; |
2418 return -1; |
2419 if (!PyString_Check(data_obj)) { |
2419 if (!PyBytes_Check(data_obj)) { |
2420 PyErr_SetString(PyExc_TypeError, "data is not a string"); |
2420 PyErr_SetString(PyExc_TypeError, "data is not a string"); |
2421 return -1; |
2421 return -1; |
2422 } |
2422 } |
2423 size = PyString_GET_SIZE(data_obj); |
2423 size = PyBytes_GET_SIZE(data_obj); |
2424 |
2424 |
2425 self->inlined = inlined_obj && PyObject_IsTrue(inlined_obj); |
2425 self->inlined = inlined_obj && PyObject_IsTrue(inlined_obj); |
2426 self->data = data_obj; |
2426 self->data = data_obj; |
2427 |
2427 |
2428 self->ntlength = self->ntcapacity = 0; |
2428 self->ntlength = self->ntcapacity = 0; |
2611 PyObject *list = PyTuple_New(num); |
2611 PyObject *list = PyTuple_New(num); |
2612 if (list == NULL) { |
2612 if (list == NULL) { |
2613 return NULL; |
2613 return NULL; |
2614 } |
2614 } |
2615 for (i = 0; i < num; i++) { |
2615 for (i = 0; i < num; i++) { |
2616 PyObject *hash = PyString_FromStringAndSize(source, hashwidth); |
2616 PyObject *hash = PyBytes_FromStringAndSize(source, hashwidth); |
2617 if (hash == NULL) { |
2617 if (hash == NULL) { |
2618 Py_DECREF(list); |
2618 Py_DECREF(list); |
2619 return NULL; |
2619 return NULL; |
2620 } |
2620 } |
2621 PyTuple_SET_ITEM(list, i, hash); |
2621 PyTuple_SET_ITEM(list, i, hash); |
2710 Py_ssize_t leftsize = (unsigned char)(*data++); |
2710 Py_ssize_t leftsize = (unsigned char)(*data++); |
2711 Py_ssize_t rightsize = (unsigned char)(*data++); |
2711 Py_ssize_t rightsize = (unsigned char)(*data++); |
2712 if (meta + leftsize + rightsize > dataend) { |
2712 if (meta + leftsize + rightsize > dataend) { |
2713 goto overflow; |
2713 goto overflow; |
2714 } |
2714 } |
2715 left = PyString_FromStringAndSize(meta, leftsize); |
2715 left = PyBytes_FromStringAndSize(meta, leftsize); |
2716 meta += leftsize; |
2716 meta += leftsize; |
2717 right = PyString_FromStringAndSize(meta, rightsize); |
2717 right = PyBytes_FromStringAndSize(meta, rightsize); |
2718 meta += rightsize; |
2718 meta += rightsize; |
2719 tmp = PyTuple_New(2); |
2719 tmp = PyTuple_New(2); |
2720 if (!left || !right || !tmp) { |
2720 if (!left || !right || !tmp) { |
2721 Py_XDECREF(left); |
2721 Py_XDECREF(left); |
2722 Py_XDECREF(right); |
2722 Py_XDECREF(right); |