From 8137dc84b5d41d89feffef9a9f882c122e3c30a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=2E=20David=20Ib=C3=A1=C3=B1ez?= Date: Fri, 19 Aug 2011 08:49:46 +0200 Subject: [PATCH] Support 'tree[name]' where name is a text string --- pygit2.c | 90 +++++++++++++++++++++++++------------------------------- 1 file changed, 40 insertions(+), 50 deletions(-) diff --git a/pygit2.c b/pygit2.c index b68fd3b..0bd2e8d 100644 --- a/pygit2.c +++ b/pygit2.c @@ -318,6 +318,31 @@ git_oid_to_py_str(const git_oid *oid) return PyUnicode_DecodeASCII(hex, GIT_OID_HEXSZ, "strict"); } +char * +py_str_to_c_str(PyObject *value) +{ + char *c_str; + + /* Case 1: byte string */ + if (PyString_Check(value)) + return PyString_AsString(value); + + /* Case 2: text string */ + if (PyUnicode_Check(value)) { + value = PyUnicode_AsUTF8String(value); + if (value == NULL) + return NULL; + c_str = PyString_AsString(value); + Py_DECREF(value); + return c_str; + } + + /* Type error */ + PyErr_Format(PyExc_TypeError, "unexpected %.200s", + Py_TYPE(value)->tp_name); + return NULL; +} + static int Repository_init(Repository *self, PyObject *args, PyObject *kwds) { @@ -1273,7 +1298,7 @@ Tree_contains(Tree *self, PyObject *py_name) { char *name; - name = PyString_AsString(py_name); + name = py_str_to_c_str(py_name); if (name == NULL) return -1; @@ -1294,21 +1319,6 @@ wrap_tree_entry(const git_tree_entry *entry, Tree *tree) return py_entry; } -static TreeEntry * -Tree_getitem_by_name(Tree *self, PyObject *py_name) -{ - char *name; - const git_tree_entry *entry; - - name = PyString_AS_STRING(py_name); - entry = git_tree_entry_byname(self->tree, name); - if (!entry) { - PyErr_SetObject(PyExc_KeyError, py_name); - return NULL; - } - return wrap_tree_entry(entry, self); -} - static int Tree_fix_index(Tree *self, PyObject *py_index) { @@ -1375,18 +1385,23 @@ Tree_getitem_by_index(Tree *self, PyObject *py_index) static TreeEntry * Tree_getitem(Tree *self, PyObject *value) { - if (PyString_Check(value)) { - return Tree_getitem_by_name(self, value); - } - else if (PyInt_Check(value)) { + char *name; + const git_tree_entry *entry; + + /* Case 1: integer */ + if (PyInt_Check(value)) return Tree_getitem_by_index(self, value); - } - else { - PyErr_Format(PyExc_TypeError, - "Tree entry index must be int or str, not %.200s", - Py_TYPE(value)->tp_name); + + /* Case 2: byte or text string */ + name = py_str_to_c_str(value); + if (name == NULL) + return NULL; + entry = git_tree_entry_byname(self->tree, name); + if (!entry) { + PyErr_SetObject(PyExc_KeyError, value); return NULL; } + return wrap_tree_entry(entry, self); } static PySequenceMethods Tree_as_sequence = { @@ -1747,31 +1762,6 @@ Index_write(Index *self) Py_RETURN_NONE; } -char * -py_str_to_c_str(PyObject *value) -{ - char *c_str; - - /* Case 1: byte string */ - if (PyString_Check(value)) - return PyString_AsString(value); - - /* Case 2: text string */ - if (PyUnicode_Check(value)) { - value = PyUnicode_AsUTF8String(value); - if (value == NULL) - return NULL; - c_str = PyString_AsString(value); - Py_DECREF(value); - return c_str; - } - - /* Type error */ - PyErr_Format(PyExc_TypeError, "unexpected %.200s", - Py_TYPE(value)->tp_name); - return NULL; -} - /* This is an internal function, used by Index_getitem and Index_setitem */ static int Index_get_position(Index *self, PyObject *value)