Show More
@@ -566,7 +566,7 b' static int nt_find(indexObject *self, co' | |||
|
566 | 566 | return -2; |
|
567 | 567 | |
|
568 | 568 | if (hex) |
|
569 | maxlevel = nodelen > 40 ? 40 : nodelen; | |
|
569 | maxlevel = nodelen > 40 ? 40 : (int)nodelen; | |
|
570 | 570 | else |
|
571 | 571 | maxlevel = nodelen > 20 ? 40 : ((int)nodelen * 2); |
|
572 | 572 | |
@@ -795,6 +795,77 b' static PyObject *index_getitem(indexObje' | |||
|
795 | 795 | return NULL; |
|
796 | 796 | } |
|
797 | 797 | |
|
798 | static int nt_partialmatch(indexObject *self, const char *node, | |
|
799 | Py_ssize_t nodelen) | |
|
800 | { | |
|
801 | int rev; | |
|
802 | ||
|
803 | if (nt_init(self) == -1) | |
|
804 | return -3; | |
|
805 | ||
|
806 | if (self->ntrev > 0) { | |
|
807 | /* ensure that the radix tree is fully populated */ | |
|
808 | for (rev = self->ntrev - 1; rev >= 0; rev--) { | |
|
809 | const char *n = index_node(self, rev); | |
|
810 | if (n == NULL) | |
|
811 | return -2; | |
|
812 | if (nt_insert(self, n, rev) == -1) | |
|
813 | return -3; | |
|
814 | } | |
|
815 | self->ntrev = rev; | |
|
816 | } | |
|
817 | ||
|
818 | return nt_find(self, node, nodelen, 1); | |
|
819 | } | |
|
820 | ||
|
821 | static PyObject *index_partialmatch(indexObject *self, PyObject *args) | |
|
822 | { | |
|
823 | const char *fullnode; | |
|
824 | int nodelen; | |
|
825 | char *node; | |
|
826 | int rev, i; | |
|
827 | ||
|
828 | if (!PyArg_ParseTuple(args, "s#", &node, &nodelen)) | |
|
829 | return NULL; | |
|
830 | ||
|
831 | if (nodelen < 4) { | |
|
832 | PyErr_SetString(PyExc_ValueError, "key too short"); | |
|
833 | return NULL; | |
|
834 | } | |
|
835 | ||
|
836 | if (nodelen > 40) | |
|
837 | nodelen = 40; | |
|
838 | ||
|
839 | for (i = 0; i < nodelen; i++) | |
|
840 | hexdigit(node, i); | |
|
841 | if (PyErr_Occurred()) { | |
|
842 | /* input contains non-hex characters */ | |
|
843 | PyErr_Clear(); | |
|
844 | Py_RETURN_NONE; | |
|
845 | } | |
|
846 | ||
|
847 | rev = nt_partialmatch(self, node, nodelen); | |
|
848 | ||
|
849 | switch (rev) { | |
|
850 | case -4: | |
|
851 | raise_revlog_error(); | |
|
852 | case -3: | |
|
853 | return NULL; | |
|
854 | case -2: | |
|
855 | Py_RETURN_NONE; | |
|
856 | case -1: | |
|
857 | return PyString_FromStringAndSize(nullid, 20); | |
|
858 | } | |
|
859 | ||
|
860 | fullnode = index_node(self, rev); | |
|
861 | if (fullnode == NULL) { | |
|
862 | PyErr_Format(PyExc_IndexError, | |
|
863 | "could not access rev %d", rev); | |
|
864 | return NULL; | |
|
865 | } | |
|
866 | return PyString_FromStringAndSize(fullnode, 20); | |
|
867 | } | |
|
868 | ||
|
798 | 869 | static PyObject *index_m_get(indexObject *self, PyObject *args) |
|
799 | 870 | { |
|
800 | 871 | char *node; |
@@ -1077,6 +1148,8 b' static PyMethodDef index_methods[] = {' | |||
|
1077 | 1148 | "get an index entry"}, |
|
1078 | 1149 | {"insert", (PyCFunction)index_insert, METH_VARARGS, |
|
1079 | 1150 | "insert an index entry"}, |
|
1151 | {"partialmatch", (PyCFunction)index_partialmatch, METH_VARARGS, | |
|
1152 | "match a potentially ambiguous node ID"}, | |
|
1080 | 1153 | {"stats", (PyCFunction)index_stats, METH_NOARGS, |
|
1081 | 1154 | "stats for the index"}, |
|
1082 | 1155 | {NULL} /* Sentinel */ |
@@ -756,6 +756,15 b' class revlog(object):' | |||
|
756 | 756 | pass |
|
757 | 757 | |
|
758 | 758 | def _partialmatch(self, id): |
|
759 | try: | |
|
760 | return self.index.partialmatch(id) | |
|
761 | except RevlogError: | |
|
762 | # parsers.c radix tree lookup gave multiple matches | |
|
763 | raise LookupError(id, self.indexfile, _("ambiguous identifier")) | |
|
764 | except (AttributeError, ValueError): | |
|
765 | # we are pure python, or key was too short to search radix tree | |
|
766 | pass | |
|
767 | ||
|
759 | 768 | if id in self._pcache: |
|
760 | 769 | return self._pcache[id] |
|
761 | 770 |
General Comments 0
You need to be logged in to leave comments.
Login now