Add type attribute to TreeEntry

This allows complete iteration and rebuilding of a tree without hitting
the object store for every entry.
This commit is contained in:
Nicolas Dandrimont
2015-09-09 21:41:00 +02:00
parent 29a8dbc6b2
commit ac7738bbb3
3 changed files with 33 additions and 8 deletions

View File

@@ -176,6 +176,7 @@ Tree entries
.. autoattribute:: pygit2.TreeEntry.id
.. autoattribute:: pygit2.TreeEntry.hex
.. autoattribute:: pygit2.TreeEntry.filemode
.. autoattribute:: pygit2.TreeEntry.type
.. method:: TreeEntry.__cmp__(TreeEntry)
@@ -188,14 +189,14 @@ Example::
6
>>> for entry in tree: # Iteration
... print(entry.id, entry.name)
... print(entry.id, entry.type, entry.name)
...
7151ca7cd3e59f3eab19c485cfbf3cb30928d7fa .gitignore
c36f4cf1e38ec1bb9d9ad146ed572b89ecfc9f18 COPYING
32b30b90b062f66957d6790c3c155c289c34424e README.md
c87dae4094b3a6d10e08bc6c5ef1f55a7e448659 pygit2.c
85a67270a49ef16cdd3d328f06a3e4b459f09b27 setup.py
3d8985bbec338eb4d47c5b01b863ee89d044bd53 test
7151ca7cd3e59f3eab19c485cfbf3cb30928d7fa blob .gitignore
c36f4cf1e38ec1bb9d9ad146ed572b89ecfc9f18 blob COPYING
32b30b90b062f66957d6790c3c155c289c34424e blob README.md
c87dae4094b3a6d10e08bc6c5ef1f55a7e448659 blob pygit2.c
85a67270a49ef16cdd3d328f06a3e4b459f09b27 blob setup.py
3d8985bbec338eb4d47c5b01b863ee89d044bd53 tree test
>>> entry = tree['pygit2.c'] # Get an entry by name
>>> entry

View File

@@ -67,6 +67,15 @@ TreeEntry_name__get__(TreeEntry *self)
}
PyDoc_STRVAR(TreeEntry_type__doc__, "Type.");
PyObject *
TreeEntry_type__get__(TreeEntry *self)
{
return to_path(git_object_type2string(git_tree_entry_type(self->entry)));
}
PyDoc_STRVAR(TreeEntry_id__doc__, "Object id.");
PyObject *
@@ -171,6 +180,7 @@ PyGetSetDef TreeEntry_getseters[] = {
GETTER(TreeEntry, oid),
GETTER(TreeEntry, id),
GETTER(TreeEntry, hex),
GETTER(TreeEntry, type),
{NULL}
};

View File

@@ -32,7 +32,7 @@ from __future__ import unicode_literals
import operator
import unittest
from pygit2 import TreeEntry
from pygit2 import TreeEntry, GIT_FILEMODE_TREE
from . import utils
@@ -89,6 +89,7 @@ class TreeTest(utils.BareRepoTestCase):
tree = self.repo[TREE_SHA]
subtree_entry = tree['c']
self.assertTreeEntryEqual(subtree_entry, SUBTREE_SHA, 'c', 0o0040000)
self.assertEquals(subtree_entry.type, 'tree')
subtree = self.repo[subtree_entry.id]
self.assertEqual(1, len(subtree))
@@ -100,21 +101,34 @@ class TreeTest(utils.BareRepoTestCase):
repo = self.repo
b0 = repo.create_blob('1')
b1 = repo.create_blob('2')
st = repo.TreeBuilder()
st.insert('a', b0, 0o0100644)
subtree = repo[st.write()]
t = repo.TreeBuilder()
t.insert('x', b0, 0o0100644)
t.insert('y', b1, 0o0100755)
t.insert('z', subtree.id, GIT_FILEMODE_TREE)
tree = repo[t.write()]
self.assertTrue('x' in tree)
self.assertTrue('y' in tree)
self.assertTrue('z' in tree)
x = tree['x']
y = tree['y']
z = tree['z']
self.assertEqual(x.filemode, 0o0100644)
self.assertEqual(y.filemode, 0o0100755)
self.assertEqual(z.filemode, GIT_FILEMODE_TREE)
self.assertEqual(repo[x.id].id, b0)
self.assertEqual(repo[y.id].id, b1)
self.assertEqual(repo[z.id].id, subtree.id)
self.assertEqual(x.type, 'blob')
self.assertEqual(y.type, 'blob')
self.assertEqual(z.type, 'tree')
def test_modify_tree(self):