diff --git a/src/pygit2/tree.c b/src/pygit2/tree.c index d6cc580..0cf9299 100644 --- a/src/pygit2/tree.c +++ b/src/pygit2/tree.c @@ -239,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)) @@ -251,13 +252,19 @@ Tree_getitem(Tree *self, PyObject *value) if (strchr(name, '/') != NULL) { /* Case 2a: path string */ - git_tree_entry_bypath(&entry, self->tree, name); + 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 0f70644..44e85c6 100644 --- a/test/test_tree.py +++ b/test/test_tree.py @@ -70,6 +70,7 @@ class TreeTest(utils.BareRepoTestCase): 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]