Add "len(treebuider)" to the API

This commit is contained in:
J. David Ibáñez
2013-05-03 23:31:43 +02:00
parent cc9f39125b
commit f5082b320b
2 changed files with 28 additions and 10 deletions

View File

@@ -56,20 +56,16 @@ TreeBuilder_insert(TreeBuilder *self, PyObject *args)
git_oid oid; git_oid oid;
const char *fname; const char *fname;
if (!PyArg_ParseTuple(args, "sOi", &fname, &py_oid, &attr)) { if (!PyArg_ParseTuple(args, "sOi", &fname, &py_oid, &attr))
return NULL; return NULL;
}
len = py_str_to_git_oid(py_oid, &oid); len = py_str_to_git_oid(py_oid, &oid);
if (len < 0) { if (len < 0)
return NULL; return NULL;
}
err = git_treebuilder_insert(NULL, self->bld, fname, &oid, attr); err = git_treebuilder_insert(NULL, self->bld, fname, &oid, attr);
if (err < 0) { if (err < 0)
Error_set(err); return Error_set(err);
return NULL;
}
Py_RETURN_NONE; Py_RETURN_NONE;
} }
@@ -138,6 +134,20 @@ PyMethodDef TreeBuilder_methods[] = {
}; };
Py_ssize_t
TreeBuilder_len(TreeBuilder *self)
{
return (Py_ssize_t)git_treebuilder_entrycount(self->bld);
}
PyMappingMethods TreeBuilder_as_mapping = {
(lenfunc)TreeBuilder_len, /* mp_length */
0, /* mp_subscript */
0, /* mp_ass_subscript */
};
PyDoc_STRVAR(TreeBuilder__doc__, "TreeBuilder objects."); PyDoc_STRVAR(TreeBuilder__doc__, "TreeBuilder objects.");
PyTypeObject TreeBuilderType = { PyTypeObject TreeBuilderType = {
@@ -153,7 +163,7 @@ PyTypeObject TreeBuilderType = {
0, /* tp_repr */ 0, /* tp_repr */
0, /* tp_as_number */ 0, /* tp_as_number */
0, /* tp_as_sequence */ 0, /* tp_as_sequence */
0, /* tp_as_mapping */ &TreeBuilder_as_mapping, /* tp_as_mapping */
0, /* tp_hash */ 0, /* tp_hash */
0, /* tp_call */ 0, /* tp_call */
0, /* tp_str */ 0, /* tp_str */

View File

@@ -41,25 +41,33 @@ class TreeBuilderTest(utils.BareRepoTestCase):
def test_new_empty_treebuilder(self): def test_new_empty_treebuilder(self):
self.repo.TreeBuilder() self.repo.TreeBuilder()
def test_noop_treebuilder(self): def test_noop_treebuilder(self):
tree = self.repo[TREE_SHA] tree = self.repo[TREE_SHA]
bld = self.repo.TreeBuilder(TREE_SHA) bld = self.repo.TreeBuilder(TREE_SHA)
result = bld.write() result = bld.write()
self.assertEqual(len(bld), len(tree))
self.assertEqual(tree.oid, result) self.assertEqual(tree.oid, result)
def test_noop_treebuilder_from_tree(self): def test_noop_treebuilder_from_tree(self):
tree = self.repo[TREE_SHA] tree = self.repo[TREE_SHA]
bld = self.repo.TreeBuilder(tree) bld = self.repo.TreeBuilder(tree)
result = bld.write() result = bld.write()
self.assertEqual(len(bld), len(tree))
self.assertEqual(tree.oid, result) self.assertEqual(tree.oid, result)
def test_rebuild_treebuilder(self): def test_rebuild_treebuilder(self):
tree = self.repo[TREE_SHA] tree = self.repo[TREE_SHA]
bld = self.repo.TreeBuilder() bld = self.repo.TreeBuilder()
for e in tree: for e in tree:
bld.insert(e.name, e.hex, e.filemode) bld.insert(e.name, e.hex, e.filemode)
result = bld.write() result = bld.write()
self.assertEqual(len(bld), len(tree))
self.assertEqual(tree.oid, result) self.assertEqual(tree.oid, result)