Add Commit subclass of Object.
Only supports a few read-only properties so far. Change-Id: I6e5bea0ab22c8821a625327c3d81cce20d012037
This commit is contained in:
119
pygit2.c
119
pygit2.c
@@ -26,6 +26,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <Python.h>
|
#include <Python.h>
|
||||||
|
#include <git/commit.h>
|
||||||
#include <git/common.h>
|
#include <git/common.h>
|
||||||
#include <git/repository.h>
|
#include <git/repository.h>
|
||||||
#include <git/commit.h>
|
#include <git/commit.h>
|
||||||
@@ -36,14 +37,22 @@ typedef struct {
|
|||||||
git_repository *repo;
|
git_repository *repo;
|
||||||
} Repository;
|
} Repository;
|
||||||
|
|
||||||
typedef struct {
|
/* The structs for the various object subtypes are identical except for the type
|
||||||
PyObject_HEAD
|
* of their object pointers. */
|
||||||
Repository *repo;
|
#define OBJECT_STRUCT(_name, _ptr_type, _ptr_name) \
|
||||||
git_object *obj;
|
typedef struct {\
|
||||||
int own_obj:1;
|
PyObject_HEAD\
|
||||||
} Object;
|
Repository *repo;\
|
||||||
|
int own_obj:1;\
|
||||||
|
_ptr_type *_ptr_name;\
|
||||||
|
} _name;
|
||||||
|
|
||||||
static PyTypeObject RepositoryType, ObjectType;
|
OBJECT_STRUCT(Object, git_object, obj)
|
||||||
|
OBJECT_STRUCT(Commit, git_commit, commit)
|
||||||
|
|
||||||
|
static PyTypeObject RepositoryType;
|
||||||
|
static PyTypeObject ObjectType;
|
||||||
|
static PyTypeObject CommitType;
|
||||||
|
|
||||||
static int
|
static int
|
||||||
Repository_init(Repository *self, PyObject *args, PyObject *kwds) {
|
Repository_init(Repository *self, PyObject *args, PyObject *kwds) {
|
||||||
@@ -94,7 +103,7 @@ static Object *wrap_object(git_object *obj, Repository *repo) {
|
|||||||
Object *py_obj = NULL;
|
Object *py_obj = NULL;
|
||||||
switch (git_object_type(obj)) {
|
switch (git_object_type(obj)) {
|
||||||
case GIT_OBJ_COMMIT:
|
case GIT_OBJ_COMMIT:
|
||||||
py_obj = (Object*)ObjectType.tp_alloc(&ObjectType, 0);
|
py_obj = (Object*)CommitType.tp_alloc(&CommitType, 0);
|
||||||
break;
|
break;
|
||||||
case GIT_OBJ_TREE:
|
case GIT_OBJ_TREE:
|
||||||
py_obj = (Object*)ObjectType.tp_alloc(&ObjectType, 0);
|
py_obj = (Object*)ObjectType.tp_alloc(&ObjectType, 0);
|
||||||
@@ -258,7 +267,7 @@ Object_dealloc(Object* self)
|
|||||||
{
|
{
|
||||||
if (self->own_obj)
|
if (self->own_obj)
|
||||||
git_object_free(self->obj);
|
git_object_free(self->obj);
|
||||||
Py_DECREF(self->repo);
|
Py_XDECREF(self->repo);
|
||||||
self->ob_type->tp_free((PyObject*)self);
|
self->ob_type->tp_free((PyObject*)self);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,6 +358,92 @@ static PyTypeObject ObjectType = {
|
|||||||
0, /* tp_new */
|
0, /* tp_new */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
Commit_get_message_short(Commit *commit) {
|
||||||
|
return PyString_FromString(git_commit_message_short(commit->commit));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
Commit_get_message(Commit *commit) {
|
||||||
|
return PyString_FromString(git_commit_message(commit->commit));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
Commit_get_commit_time(Commit *commit) {
|
||||||
|
return PyLong_FromLong(git_commit_time(commit->commit));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
Commit_get_committer(Commit *commit) {
|
||||||
|
git_person *committer;
|
||||||
|
committer = (git_person*)git_commit_committer(commit->commit);
|
||||||
|
return Py_BuildValue("(ssl)", git_person_name(committer),
|
||||||
|
git_person_email(committer),
|
||||||
|
git_person_time(committer));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
Commit_get_author(Commit *commit) {
|
||||||
|
git_person *author;
|
||||||
|
author = (git_person*)git_commit_author(commit->commit);
|
||||||
|
return Py_BuildValue("(ssl)", git_person_name(author),
|
||||||
|
git_person_email(author),
|
||||||
|
git_person_time(author));
|
||||||
|
}
|
||||||
|
|
||||||
|
static PyGetSetDef Commit_getseters[] = {
|
||||||
|
{"message_short", (getter)Commit_get_message_short, NULL, "short message",
|
||||||
|
NULL},
|
||||||
|
{"message", (getter)Commit_get_message, NULL, "message", NULL},
|
||||||
|
{"commit_time", (getter)Commit_get_commit_time, NULL, "commit time",
|
||||||
|
NULL},
|
||||||
|
{"committer", (getter)Commit_get_committer, NULL, "committer", NULL},
|
||||||
|
{"author", (getter)Commit_get_author, NULL, "author", NULL},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
static PyTypeObject CommitType = {
|
||||||
|
PyObject_HEAD_INIT(NULL)
|
||||||
|
0, /*ob_size*/
|
||||||
|
"pygit2.Commit", /*tp_name*/
|
||||||
|
sizeof(Commit), /*tp_basicsize*/
|
||||||
|
0, /*tp_itemsize*/
|
||||||
|
0, /*tp_dealloc*/
|
||||||
|
0, /*tp_print*/
|
||||||
|
0, /*tp_getattr*/
|
||||||
|
0, /*tp_setattr*/
|
||||||
|
0, /*tp_compare*/
|
||||||
|
0, /*tp_repr*/
|
||||||
|
0, /*tp_as_number*/
|
||||||
|
0, /*tp_as_sequence*/
|
||||||
|
0, /*tp_as_mapping*/
|
||||||
|
0, /*tp_hash */
|
||||||
|
0, /*tp_call*/
|
||||||
|
0, /*tp_str*/
|
||||||
|
0, /*tp_getattro*/
|
||||||
|
0, /*tp_setattro*/
|
||||||
|
0, /*tp_as_buffer*/
|
||||||
|
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
|
||||||
|
"Commit objects", /* tp_doc */
|
||||||
|
0, /* tp_traverse */
|
||||||
|
0, /* tp_clear */
|
||||||
|
0, /* tp_richcompare */
|
||||||
|
0, /* tp_weaklistoffset */
|
||||||
|
0, /* tp_iter */
|
||||||
|
0, /* tp_iternext */
|
||||||
|
0, /* tp_methods */
|
||||||
|
0, /* tp_members */
|
||||||
|
Commit_getseters, /* tp_getset */
|
||||||
|
0, /* tp_base */
|
||||||
|
0, /* tp_dict */
|
||||||
|
0, /* tp_descr_get */
|
||||||
|
0, /* tp_descr_set */
|
||||||
|
0, /* tp_dictoffset */
|
||||||
|
0, /* tp_init */
|
||||||
|
0, /* tp_alloc */
|
||||||
|
0, /* tp_new */
|
||||||
|
};
|
||||||
|
|
||||||
static PyMethodDef module_methods[] = {
|
static PyMethodDef module_methods[] = {
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
@@ -364,6 +459,9 @@ initpygit2(void)
|
|||||||
/* Do not set ObjectType.tp_new, to prevent creating Objects directly. */
|
/* Do not set ObjectType.tp_new, to prevent creating Objects directly. */
|
||||||
if (PyType_Ready(&ObjectType) < 0)
|
if (PyType_Ready(&ObjectType) < 0)
|
||||||
return;
|
return;
|
||||||
|
CommitType.tp_base = &ObjectType;
|
||||||
|
if (PyType_Ready(&CommitType) < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
m = Py_InitModule3("pygit2", module_methods,
|
m = Py_InitModule3("pygit2", module_methods,
|
||||||
"Python bindings for libgit2.");
|
"Python bindings for libgit2.");
|
||||||
@@ -376,4 +474,7 @@ initpygit2(void)
|
|||||||
|
|
||||||
Py_INCREF(&ObjectType);
|
Py_INCREF(&ObjectType);
|
||||||
PyModule_AddObject(m, "Object", (PyObject *)&ObjectType);
|
PyModule_AddObject(m, "Object", (PyObject *)&ObjectType);
|
||||||
|
|
||||||
|
Py_INCREF(&CommitType);
|
||||||
|
PyModule_AddObject(m, "Commit", (PyObject *)&CommitType);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user