object: factor wrap_object out of lookup_object_prefix.

Generating an `Object *` from a `git_object *` may be useful in other
functions (e.g. the upcoming `Repository_revparse_single`).
This commit is contained in:
W. Trevor King 2012-09-13 16:41:56 -04:00
parent b66fa71bae
commit cc7f137f7b
3 changed files with 41 additions and 26 deletions
include/pygit2
src/pygit2

@ -37,5 +37,6 @@ PyObject* Object_get_oid(Object *self);
PyObject* Object_get_hex(Object *self);
PyObject* Object_get_type(Object *self);
PyObject* Object_read_raw(Object *self);
PyObject* wrap_object(git_object *c_object, Repository *repo);
#endif

@ -34,6 +34,12 @@
#include <pygit2/repository.h>
#include <pygit2/object.h>
extern PyTypeObject TreeType;
extern PyTypeObject CommitType;
extern PyTypeObject BlobType;
extern PyTypeObject TagType;
void
Object_dealloc(Object* self)
{
@ -145,3 +151,35 @@ PyTypeObject ObjectType = {
0, /* tp_alloc */
0, /* tp_new */
};
PyObject *
wrap_object(git_object *c_object, Repository *repo)
{
Object *py_obj = NULL;
switch (git_object_type(c_object)) {
case GIT_OBJ_COMMIT:
py_obj = PyObject_New(Object, &CommitType);
break;
case GIT_OBJ_TREE:
py_obj = PyObject_New(Object, &TreeType);
break;
case GIT_OBJ_BLOB:
py_obj = PyObject_New(Object, &BlobType);
break;
case GIT_OBJ_TAG:
py_obj = PyObject_New(Object, &TagType);
break;
default:
assert(0);
}
if (py_obj) {
py_obj->obj = c_object;
if (repo) {
py_obj->repo = repo;
Py_INCREF(repo);
}
}
return (PyObject *)py_obj;
}

@ -31,6 +31,7 @@
#include <pygit2/types.h>
#include <pygit2/reference.h>
#include <pygit2/utils.h>
#include <pygit2/object.h>
#include <pygit2/oid.h>
#include <pygit2/repository.h>
@ -40,9 +41,6 @@ extern PyTypeObject IndexType;
extern PyTypeObject WalkerType;
extern PyTypeObject SignatureType;
extern PyTypeObject TreeType;
extern PyTypeObject CommitType;
extern PyTypeObject BlobType;
extern PyTypeObject TagType;
extern PyTypeObject TreeBuilderType;
extern PyTypeObject ConfigType;
extern PyTypeObject DiffType;
@ -72,29 +70,7 @@ lookup_object_prefix(Repository *repo, const git_oid *oid, size_t len,
if (err < 0)
return Error_set_oid(err, oid, len);
switch (git_object_type(obj)) {
case GIT_OBJ_COMMIT:
py_obj = PyObject_New(Object, &CommitType);
break;
case GIT_OBJ_TREE:
py_obj = PyObject_New(Object, &TreeType);
break;
case GIT_OBJ_BLOB:
py_obj = PyObject_New(Object, &BlobType);
break;
case GIT_OBJ_TAG:
py_obj = PyObject_New(Object, &TagType);
break;
default:
assert(0);
}
if (py_obj) {
py_obj->obj = obj;
py_obj->repo = repo;
Py_INCREF(repo);
}
return (PyObject*)py_obj;
return wrap_object(obj, repo);
}
PyObject *