equal
deleted
inserted
replaced
82 }; |
82 }; |
83 |
83 |
84 static Py_ssize_t index_length(const indexObject *self) |
84 static Py_ssize_t index_length(const indexObject *self) |
85 { |
85 { |
86 if (self->added == NULL) |
86 if (self->added == NULL) |
87 return self->length - 1; |
87 return self->length; |
88 return self->length + PyList_GET_SIZE(self->added) - 1; |
88 return self->length + PyList_GET_SIZE(self->added); |
89 } |
89 } |
90 |
90 |
91 static PyObject *nullentry; |
91 static PyObject *nullentry; |
92 static const char nullid[20]; |
92 static const char nullid[20]; |
93 |
93 |
122 } |
122 } |
123 |
123 |
124 static inline int index_get_parents(indexObject *self, Py_ssize_t rev, |
124 static inline int index_get_parents(indexObject *self, Py_ssize_t rev, |
125 int *ps, int maxrev) |
125 int *ps, int maxrev) |
126 { |
126 { |
127 if (rev >= self->length - 1) { |
127 if (rev >= self->length) { |
128 PyObject *tuple = PyList_GET_ITEM(self->added, |
128 PyObject *tuple = PyList_GET_ITEM(self->added, rev - self->length); |
129 rev - self->length + 1); |
|
130 ps[0] = (int)PyInt_AS_LONG(PyTuple_GET_ITEM(tuple, 5)); |
129 ps[0] = (int)PyInt_AS_LONG(PyTuple_GET_ITEM(tuple, 5)); |
131 ps[1] = (int)PyInt_AS_LONG(PyTuple_GET_ITEM(tuple, 6)); |
130 ps[1] = (int)PyInt_AS_LONG(PyTuple_GET_ITEM(tuple, 6)); |
132 } else { |
131 } else { |
133 const char *data = index_deref(self, rev); |
132 const char *data = index_deref(self, rev); |
134 ps[0] = getbe32(data + 24); |
133 ps[0] = getbe32(data + 24); |
173 if (pos < 0 || pos >= length) { |
172 if (pos < 0 || pos >= length) { |
174 PyErr_SetString(PyExc_IndexError, "revlog index out of range"); |
173 PyErr_SetString(PyExc_IndexError, "revlog index out of range"); |
175 return NULL; |
174 return NULL; |
176 } |
175 } |
177 |
176 |
178 if (pos >= self->length - 1) { |
177 if (pos >= self->length) { |
179 PyObject *obj; |
178 PyObject *obj; |
180 obj = PyList_GET_ITEM(self->added, pos - self->length + 1); |
179 obj = PyList_GET_ITEM(self->added, pos - self->length); |
181 Py_INCREF(obj); |
180 Py_INCREF(obj); |
182 return obj; |
181 return obj; |
183 } |
182 } |
184 |
183 |
185 if (self->cache) { |
184 if (self->cache) { |
239 return nullid; |
238 return nullid; |
240 |
239 |
241 if (pos >= length) |
240 if (pos >= length) |
242 return NULL; |
241 return NULL; |
243 |
242 |
244 if (pos >= self->length - 1) { |
243 if (pos >= self->length) { |
245 PyObject *tuple, *str; |
244 PyObject *tuple, *str; |
246 tuple = PyList_GET_ITEM(self->added, pos - self->length + 1); |
245 tuple = PyList_GET_ITEM(self->added, pos - self->length); |
247 str = PyTuple_GetItem(tuple, 7); |
246 str = PyTuple_GetItem(tuple, 7); |
248 return str ? PyBytes_AS_STRING(str) : NULL; |
247 return str ? PyBytes_AS_STRING(str) : NULL; |
249 } |
248 } |
250 |
249 |
251 data = index_deref(self, pos); |
250 data = index_deref(self, pos); |
336 if (PyDict_SetItemString(obj, "index entries added", t) == -1) |
335 if (PyDict_SetItemString(obj, "index entries added", t) == -1) |
337 goto bail; |
336 goto bail; |
338 Py_DECREF(t); |
337 Py_DECREF(t); |
339 } |
338 } |
340 |
339 |
341 if (self->raw_length != self->length - 1) |
340 if (self->raw_length != self->length) |
342 istat(raw_length, "revs on disk"); |
341 istat(raw_length, "revs on disk"); |
343 istat(length, "revs in memory"); |
342 istat(length, "revs in memory"); |
344 istat(ntlookups, "node trie lookups"); |
343 istat(ntlookups, "node trie lookups"); |
345 istat(ntmisses, "node trie misses"); |
344 istat(ntmisses, "node trie misses"); |
346 istat(ntrev, "node trie last rev scanned"); |
345 istat(ntrev, "node trie last rev scanned"); |
800 */ |
799 */ |
801 static inline int index_baserev(indexObject *self, int rev) |
800 static inline int index_baserev(indexObject *self, int rev) |
802 { |
801 { |
803 const char *data; |
802 const char *data; |
804 |
803 |
805 if (rev >= self->length - 1) { |
804 if (rev >= self->length) { |
806 PyObject *tuple = PyList_GET_ITEM(self->added, |
805 PyObject *tuple = PyList_GET_ITEM(self->added, rev - self->length); |
807 rev - self->length + 1); |
|
808 return (int)PyInt_AS_LONG(PyTuple_GET_ITEM(tuple, 3)); |
806 return (int)PyInt_AS_LONG(PyTuple_GET_ITEM(tuple, 3)); |
809 } |
807 } |
810 else { |
808 else { |
811 data = index_deref(self, rev); |
809 data = index_deref(self, rev); |
812 if (data == NULL) { |
810 if (data == NULL) { |
1825 PyErr_SetString(PyExc_IndexError, |
1823 PyErr_SetString(PyExc_IndexError, |
1826 "revlog index deletion indices are invalid"); |
1824 "revlog index deletion indices are invalid"); |
1827 return -1; |
1825 return -1; |
1828 } |
1826 } |
1829 |
1827 |
1830 if (start < self->length - 1) { |
1828 if (start < self->length) { |
1831 if (self->nt) { |
1829 if (self->nt) { |
1832 Py_ssize_t i; |
1830 Py_ssize_t i; |
1833 |
1831 |
1834 for (i = start + 1; i < self->length - 1; i++) { |
1832 for (i = start + 1; i < self->length; i++) { |
1835 const char *node = index_node_existing(self, i); |
1833 const char *node = index_node_existing(self, i); |
1836 if (node == NULL) |
1834 if (node == NULL) |
1837 return -1; |
1835 return -1; |
1838 |
1836 |
1839 nt_delete_node(self->nt, node); |
1837 nt_delete_node(self->nt, node); |
1841 if (self->added) |
1839 if (self->added) |
1842 index_invalidate_added(self, 0); |
1840 index_invalidate_added(self, 0); |
1843 if (self->ntrev > start) |
1841 if (self->ntrev > start) |
1844 self->ntrev = (int)start; |
1842 self->ntrev = (int)start; |
1845 } |
1843 } |
1846 self->length = start + 1; |
1844 self->length = start; |
1847 if (start < self->raw_length) { |
1845 if (start < self->raw_length) { |
1848 if (self->cache) { |
1846 if (self->cache) { |
1849 Py_ssize_t i; |
1847 Py_ssize_t i; |
1850 for (i = start; i < self->raw_length; i++) |
1848 for (i = start; i < self->raw_length; i++) |
1851 Py_CLEAR(self->cache[i]); |
1849 Py_CLEAR(self->cache[i]); |
1854 } |
1852 } |
1855 goto done; |
1853 goto done; |
1856 } |
1854 } |
1857 |
1855 |
1858 if (self->nt) { |
1856 if (self->nt) { |
1859 index_invalidate_added(self, start - self->length + 1); |
1857 index_invalidate_added(self, start - self->length); |
1860 if (self->ntrev > start) |
1858 if (self->ntrev > start) |
1861 self->ntrev = (int)start; |
1859 self->ntrev = (int)start; |
1862 } |
1860 } |
1863 if (self->added) |
1861 if (self->added) |
1864 ret = PyList_SetSlice(self->added, start - self->length + 1, |
1862 ret = PyList_SetSlice(self->added, start - self->length, |
1865 PyList_GET_SIZE(self->added), NULL); |
1863 PyList_GET_SIZE(self->added), NULL); |
1866 done: |
1864 done: |
1867 Py_CLEAR(self->headrevs); |
1865 Py_CLEAR(self->headrevs); |
1868 return ret; |
1866 return ret; |
1869 } |
1867 } |
1972 if (self->inlined) { |
1970 if (self->inlined) { |
1973 Py_ssize_t len = inline_scan(self, NULL); |
1971 Py_ssize_t len = inline_scan(self, NULL); |
1974 if (len == -1) |
1972 if (len == -1) |
1975 goto bail; |
1973 goto bail; |
1976 self->raw_length = len; |
1974 self->raw_length = len; |
1977 self->length = len + 1; |
1975 self->length = len; |
1978 } else { |
1976 } else { |
1979 if (size % v1_hdrsize) { |
1977 if (size % v1_hdrsize) { |
1980 PyErr_SetString(PyExc_ValueError, "corrupt index file"); |
1978 PyErr_SetString(PyExc_ValueError, "corrupt index file"); |
1981 goto bail; |
1979 goto bail; |
1982 } |
1980 } |
1983 self->raw_length = size / v1_hdrsize; |
1981 self->raw_length = size / v1_hdrsize; |
1984 self->length = self->raw_length + 1; |
1982 self->length = self->raw_length; |
1985 } |
1983 } |
1986 |
1984 |
1987 return 0; |
1985 return 0; |
1988 bail: |
1986 bail: |
1989 return -1; |
1987 return -1; |