Skip to content

Commit 909339d

Browse files
committed
Review changes:
- drop .blob & .tree in favour of .obj - use getitem implementation for truediv: allows `T / 'a' / 0` to correspond to `T['a'][0]`
1 parent 8bcb129 commit 909339d

File tree

4 files changed

+26
-60
lines changed

4 files changed

+26
-60
lines changed

docs/objects.rst

+3-4
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,7 @@ Tree entries
191191
.. autoattribute:: pygit2.TreeEntry.hex
192192
.. autoattribute:: pygit2.TreeEntry.filemode
193193
.. autoattribute:: pygit2.TreeEntry.type
194-
.. autoattribute:: pygit2.TreeEntry.blob
195-
.. autoattribute:: pygit2.TreeEntry.tree
194+
.. autoattribute:: pygit2.TreeEntry.obj
196195

197196
.. method:: TreeEntry.__cmp__(TreeEntry)
198197

@@ -218,8 +217,8 @@ Example::
218217
>>> entry
219218
<pygit2.TreeEntry object at 0xcc10f0>
220219

221-
>>> blob = entry.blob # Get the object the entry points to
222-
>>> blob
220+
>>> obj = entry.obj # Get the blob the entry points to
221+
>>> obj
223222
<pygit2.Blob object at 0xcc12d0>
224223

225224
Creating trees

src/tree.c

+14-46
Original file line numberDiff line numberDiff line change
@@ -225,29 +225,20 @@ treeentry_to_object(TreeEntry* self)
225225

226226
return wrap_object(obj, py_repo);
227227
}
228-
PyDoc_STRVAR(TreeEntry_tree__doc__, "Subtree. (for type=tree entries)");
228+
PyDoc_STRVAR(TreeEntry_obj__doc__, "Object (subtree/blob)");
229229

230230
PyObject *
231-
TreeEntry_tree__get__(TreeEntry *self)
231+
TreeEntry_obj__get__(TreeEntry *self)
232232
{
233-
git_tree* subtree = treeentry_to_subtree(self);
234-
if (subtree == NULL)
235-
return NULL;
236-
237-
return wrap_object((git_object*)subtree, self->repo);
238-
}
239-
240-
PyDoc_STRVAR(TreeEntry_blob__doc__, "Blob. (for type=blob entries)");
233+
if (git_tree_entry_type(self->entry) == GIT_OBJ_TREE) {
234+
git_tree* subtree = treeentry_to_subtree(self);
235+
if (subtree == NULL)
236+
return NULL;
241237

242-
PyObject *
243-
TreeEntry_blob__get__(TreeEntry *self)
244-
{
245-
if (git_tree_entry_type(self->entry) != GIT_OBJ_BLOB) {
246-
PyErr_SetString(PyExc_TypeError, "Only for blobs");
247-
return NULL;
238+
return wrap_object((git_object*)subtree, self->repo);
239+
} else {
240+
return treeentry_to_object(self);
248241
}
249-
250-
return treeentry_to_object(self);
251242
}
252243

253244
PyObject *
@@ -318,21 +309,6 @@ TreeEntry_getitem(TreeEntry *self, PyObject *value)
318309
return r;
319310
}
320311

321-
TreeEntry *
322-
TreeEntry_truediv(TreeEntry *self, PyObject *value)
323-
{
324-
TreeEntry *r;
325-
git_tree *subtree;
326-
327-
subtree = treeentry_to_subtree(self);
328-
if (subtree == NULL)
329-
return NULL;
330-
331-
r = tree_getitem_by_path(subtree, self->repo, value);
332-
git_tree_free(subtree);
333-
return r;
334-
}
335-
336312

337313
PyGetSetDef TreeEntry_getseters[] = {
338314
GETTER(TreeEntry, filemode),
@@ -342,8 +318,7 @@ PyGetSetDef TreeEntry_getseters[] = {
342318
GETTER(TreeEntry, id),
343319
GETTER(TreeEntry, hex),
344320
GETTER(TreeEntry, type),
345-
GETTER(TreeEntry, blob),
346-
GETTER(TreeEntry, tree),
321+
GETTER(TreeEntry, obj),
347322
{NULL}
348323
};
349324

@@ -371,7 +346,7 @@ PyNumberMethods TreeEntry_as_number = {
371346
0, /* nb_subtract */
372347
0, /* nb_multiply */
373348
#if PY_MAJOR_VERSION < 3
374-
(binaryfunc)TreeEntry_truediv, /* Py2: nb_divide */
349+
(binaryfunc)TreeEntry_getitem, /* Py2: nb_divide */
375350
#endif
376351
0, /* nb_remainder */
377352
0, /* nb_divmod */
@@ -407,7 +382,7 @@ PyNumberMethods TreeEntry_as_number = {
407382
0, /* nb_inplace_xor */
408383
0, /* nb_inplace_or */
409384
0, /* nb_floor_divide */
410-
TreeEntry_truediv, /* nb_true_divide */
385+
TreeEntry_getitem, /* nb_true_divide */
411386
0, /* nb_inplace_floor_divide */
412387
0, /* nb_inplace_true_divide */
413388
0, /* nb_index */
@@ -618,13 +593,6 @@ Tree_getitem(Tree *self, PyObject *value)
618593
return tree_getitem_by_path(self->tree, self->repo, value);
619594
}
620595

621-
TreeEntry *
622-
Tree_truediv(Tree *self, PyObject *value)
623-
{
624-
/* Case 2: byte or text string */
625-
return tree_getitem_by_path(self->tree, self->repo, value);
626-
}
627-
628596

629597
PyDoc_STRVAR(Tree_diff_to_workdir__doc__,
630598
"diff_to_workdir([flags, context_lines, interhunk_lines]) -> Diff\n"
@@ -829,7 +797,7 @@ PyNumberMethods Tree_as_number = {
829797
0, /* nb_subtract */
830798
0, /* nb_multiply */
831799
#if PY_MAJOR_VERSION < 3
832-
(binaryfunc)Tree_truediv, /* Py2: nb_divide */
800+
(binaryfunc)Tree_getitem, /* Py2: nb_divide */
833801
#endif
834802
0, /* nb_remainder */
835803
0, /* nb_divmod */
@@ -865,7 +833,7 @@ PyNumberMethods Tree_as_number = {
865833
0, /* nb_inplace_xor */
866834
0, /* nb_inplace_or */
867835
0, /* nb_floor_divide */
868-
Tree_truediv, /* nb_true_divide */
836+
Tree_getitem, /* nb_true_divide */
869837
0, /* nb_inplace_floor_divide */
870838
0, /* nb_inplace_true_divide */
871839
0, /* nb_index */

src/tree.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ PyObject* TreeEntry_get_filemode(TreeEntry *self);
3838
PyObject* TreeEntry_get_name(TreeEntry *self);
3939
PyObject* TreeEntry_get_oid(TreeEntry *self);
4040
PyObject* TreeEntry_get_hex(TreeEntry *self);
41-
PyObject* TreeEntry_get_blob(TreeEntry *self);
42-
PyObject* TreeEntry_get_tree(TreeEntry *self);
41+
PyObject* TreeEntry_get_obj(TreeEntry *self);
4342

4443
TreeEntry* tree_getitem_by_index(const git_tree *tree, Repository *repo, PyObject *py_index);
4544
TreeEntry* tree_getitem_by_path(const git_tree *tree, Repository *repo, PyObject *py_path);

test/test_tree.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ def assertTreeEntryEqual(self, entry, sha, name, filemode):
5353
def test_read_tree(self):
5454
tree = self.repo[TREE_SHA]
5555
with pytest.raises(TypeError): tree[()]
56-
with pytest.raises(TypeError): tree / 123
56+
with pytest.raises(IndexError):
57+
tree / 123
5758
self.assertRaisesWithArg(KeyError, 'abcd', lambda: tree['abcd'])
5859
self.assertRaisesWithArg(IndexError, -4, lambda: tree[-4])
5960
self.assertRaisesWithArg(IndexError, 3, lambda: tree[3])
@@ -66,13 +67,15 @@ def test_read_tree(self):
6667
self.assertTreeEntryEqual(tree[-3], sha, 'a', 0o0100644)
6768
self.assertTreeEntryEqual(tree['a'], sha, 'a', 0o0100644)
6869
self.assertTreeEntryEqual(tree / 'a', sha, 'a', 0o0100644)
70+
self.assertTreeEntryEqual(tree / 0, sha, 'a', 0o0100644)
6971

7072
sha = '85f120ee4dac60d0719fd51731e4199aa5a37df6'
7173
assert 'b' in tree
7274
self.assertTreeEntryEqual(tree[1], sha, 'b', 0o0100644)
7375
self.assertTreeEntryEqual(tree[-2], sha, 'b', 0o0100644)
7476
self.assertTreeEntryEqual(tree['b'], sha, 'b', 0o0100644)
7577
self.assertTreeEntryEqual(tree / 'b', sha, 'b', 0o0100644)
78+
self.assertTreeEntryEqual(tree / 1, sha, 'b', 0o0100644)
7679

7780
sha = '297efb891a47de80be0cfe9c639e4b8c9b450989'
7881
self.assertTreeEntryEqual(tree['c/d'], sha, 'd', 0o0100644)
@@ -85,9 +88,6 @@ def test_read_tree(self):
8588
self.assertRaisesWithArg(KeyError, 'ab', lambda: tree / 'c' / 'ab')
8689
self.assertRaisesWithArg(TypeError, 'Only for trees', lambda: tree / 'a' / 'cd')
8790

88-
self.assertRaisesWithArg(TypeError, 'Only for trees', lambda: (tree / 'c' / 'd').tree)
89-
self.assertRaisesWithArg(TypeError, 'Only for blobs', lambda: (tree / 'c').blob)
90-
9191
def test_equality(self):
9292
tree_a = self.repo['18e2d2e9db075f9eb43bcb2daa65a2867d29a15e']
9393
tree_b = self.repo['2ad1d3456c5c4a1c9e40aeeddb9cd20b409623c8']
@@ -117,7 +117,7 @@ def test_read_subtree(self):
117117
self.assertTreeEntryEqual(subtree[0], sha, 'd', 0o0100644)
118118

119119
subtree_entry = (tree / 'c')
120-
assert subtree_entry.tree == self.repo[subtree_entry.id]
120+
assert subtree_entry.obj == self.repo[subtree_entry.id]
121121

122122
def test_new_tree(self):
123123
repo = self.repo
@@ -159,9 +159,9 @@ def test_new_tree(self):
159159
assert y.type == 'blob'
160160
assert z.type == 'tree'
161161

162-
assert x.blob == repo[x.id]
163-
assert y.blob == repo[y.id]
164-
assert z.tree == repo[z.id]
162+
assert x.obj == repo[x.id]
163+
assert y.obj == repo[y.id]
164+
assert z.obj == repo[z.id]
165165

166166

167167
def test_modify_tree(self):

0 commit comments

Comments
 (0)