Merge remote-tracking branch 'bendavis/git_tree_entry_bypath'

This commit is contained in:
J. David Ibáñez
2012-09-21 16:52:38 +02:00
2 changed files with 21 additions and 1 deletions

View File

@@ -26,6 +26,7 @@
*/
#define PY_SSIZE_T_CLEAN
#include <string.h>
#include <Python.h>
#include <pygit2/error.h>
#include <pygit2/utils.h>
@@ -238,6 +239,7 @@ Tree_getitem(Tree *self, PyObject *value)
{
char *name;
const git_tree_entry *entry;
int err;
/* Case 1: integer */
if (PyInt_Check(value))
@@ -247,8 +249,22 @@ Tree_getitem(Tree *self, PyObject *value)
name = py_path_to_c_str(value);
if (name == NULL)
return NULL;
entry = git_tree_entry_byname(self->tree, name);
if (strchr(name, '/') != NULL) {
/* Case 2a: path string */
err = git_tree_entry_bypath(&entry, self->tree, name);
if (err == GIT_ENOTFOUND)
entry = NULL;
else if (err < 0)
return Error_set(err);
} else {
/* Case 2b: base name */
entry = git_tree_entry_byname(self->tree, name);
}
free(name);
if (!entry) {
PyErr_SetObject(PyExc_KeyError, value);
return NULL;

View File

@@ -68,6 +68,10 @@ class TreeTest(utils.BareRepoTestCase):
self.assertTreeEntryEqual(tree[-2], sha, 'b', 0o0100644)
self.assertTreeEntryEqual(tree['b'], sha, 'b', 0o0100644)
sha = '297efb891a47de80be0cfe9c639e4b8c9b450989'
self.assertTreeEntryEqual(tree['c/d'], sha, 'd', 0o0100644)
self.assertRaisesWithArg(KeyError, 'ab/cd', lambda: tree['ab/cd'])
def test_read_subtree(self):
tree = self.repo[TREE_SHA]
subtree_entry = tree['c']