From 5baaf287d20cb7ddb8b9269a5a308ba95e97baaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Mon, 20 Jan 2014 03:37:59 +0100 Subject: [PATCH] Tree: let contains look in subtrees Allow looking in subtrees as a convenience in the 'contains' function. As slashes are not allowed to be part of the name of an entry, there is no ambiguity in what they mean. --- src/tree.c | 18 +++++++++++++++--- test/test_tree.py | 7 +++++++ 2 files changed, 22 insertions(+), 3 deletions(-) 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()