Commits

Dave Borowitz  committed 9422205

Add Commit subclass of Object.

Only supports a few read-only properties so far.

Change-Id: I6e5bea0ab22c8821a625327c3d81cce20d012037

  • Participants
  • Parent commits fa911af

Comments (0)

Files changed (1)

  */
 
 #include <Python.h>
+#include <git/commit.h>
 #include <git/common.h>
 #include <git/repository.h>
 #include <git/commit.h>
     git_repository *repo;
 } Repository;
 
-typedef struct {
-    PyObject_HEAD
-    Repository *repo;
-    git_object *obj;
-    int own_obj:1;
-} Object;
+/* The structs for the various object subtypes are identical except for the type
+ * of their object pointers. */
+#define OBJECT_STRUCT(_name, _ptr_type, _ptr_name) \
+        typedef struct {\
+            PyObject_HEAD\
+            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
 Repository_init(Repository *self, PyObject *args, PyObject *kwds) {
     Object *py_obj = NULL;
     switch (git_object_type(obj)) {
         case GIT_OBJ_COMMIT:
-            py_obj = (Object*)ObjectType.tp_alloc(&ObjectType, 0);
+            py_obj = (Object*)CommitType.tp_alloc(&CommitType, 0);
             break;
         case GIT_OBJ_TREE:
             py_obj = (Object*)ObjectType.tp_alloc(&ObjectType, 0);
 {
     if (self->own_obj)
         git_object_free(self->obj);
-    Py_DECREF(self->repo);
+    Py_XDECREF(self->repo);
     self->ob_type->tp_free((PyObject*)self);
 }
 
     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[] = {
     {NULL}
 };
     /* Do not set ObjectType.tp_new, to prevent creating Objects directly. */
     if (PyType_Ready(&ObjectType) < 0)
         return;
+    CommitType.tp_base = &ObjectType;
+    if (PyType_Ready(&CommitType) < 0)
+        return;
 
     m = Py_InitModule3("pygit2", module_methods,
                        "Python bindings for libgit2.");
 
     Py_INCREF(&ObjectType);
     PyModule_AddObject(m, "Object", (PyObject *)&ObjectType);
+
+    Py_INCREF(&CommitType);
+    PyModule_AddObject(m, "Commit", (PyObject *)&CommitType);
 }