diff --git a/src/pygit2/tree.c b/src/pygit2/tree.c index 827b1c0..0cf9299 100644 --- a/src/pygit2/tree.c +++ b/src/pygit2/tree.c @@ -26,6 +26,7 @@ */ #define PY_SSIZE_T_CLEAN +#include #include #include #include @@ -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; diff --git a/test/test_tree.py b/test/test_tree.py index 4ec22a9..44e85c6 100644 --- a/test/test_tree.py +++ b/test/test_tree.py @@ -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']