From 398e717ec6fca32f02e21b3694516db39ec648f0 Mon Sep 17 00:00:00 2001 From: Ben Davis Date: Fri, 3 Aug 2012 01:09:45 -0500 Subject: [PATCH 1/2] Implemented git_tree_entry_bypath within Tree.__getitem__ --- src/pygit2/tree.c | 11 ++++++++++- test/test_tree.py | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/pygit2/tree.c b/src/pygit2/tree.c index 827b1c0..d6cc580 100644 --- a/src/pygit2/tree.c +++ b/src/pygit2/tree.c @@ -26,6 +26,7 @@ */ #define PY_SSIZE_T_CLEAN +#include #include #include #include @@ -247,7 +248,15 @@ 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 */ + git_tree_entry_bypath(&entry, self->tree, name); + } else { + /* Case 2b: base name */ + entry = git_tree_entry_byname(self->tree, name); + } + free(name); if (!entry) { PyErr_SetObject(PyExc_KeyError, value); diff --git a/test/test_tree.py b/test/test_tree.py index 4ec22a9..0f70644 100644 --- a/test/test_tree.py +++ b/test/test_tree.py @@ -68,6 +68,9 @@ 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) + def test_read_subtree(self): tree = self.repo[TREE_SHA] subtree_entry = tree['c'] From 689412d0a28c7203bc6d5cf8639cb61c3b95e8ae Mon Sep 17 00:00:00 2001 From: Ben Davis Date: Sat, 11 Aug 2012 16:24:30 -0500 Subject: [PATCH 2/2] Added error checking when calling git_tree_entry_bypath --- src/pygit2/tree.c | 9 ++++++++- test/test_tree.py | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) 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]