diff --git a/src/tree.c b/src/tree.c index a3bfe21..ca91cc0 100644 --- a/src/tree.c +++ b/src/tree.c @@ -191,14 +191,26 @@ Tree_len(Tree *self) int Tree_contains(Tree *self, PyObject *py_name) { - int result = 0; + int err; + git_tree_entry *entry; char *name = py_path_to_c_str(py_name); if (name == NULL) return -1; - result = git_tree_entry_byname(self->tree, name) ? 1 : 0; + err = git_tree_entry_bypath(&entry, self->tree, name); free(name); - return result; + + if (err == GIT_ENOTFOUND) + return 0; + + if (err < 0) { + Error_set(err); + return -1; + } + + git_tree_entry_free(entry); + + return 1; } TreeEntry * diff --git a/test/test_tree.py b/test/test_tree.py index d1fc0de..507a22b 100644 --- a/test/test_tree.py +++ b/test/test_tree.py @@ -120,6 +120,13 @@ class TreeTest(utils.BareRepoTestCase): for tree_entry in tree: self.assertEqual(tree_entry, tree[tree_entry.name]) + def test_deep_contains(self): + tree = self.repo[TREE_SHA] + self.assertTrue('a' in tree) + self.assertTrue('c' in tree) + self.assertTrue('c/d' in tree) + self.assertFalse('c/e' in tree) + self.assertFalse('d' in tree) if __name__ == '__main__': unittest.main()