Make pygit2 build against new libgit2 API

There is an small change to the API, the 'tag.target_type' getter has
been removed, just use 'tag.target.type' instead.
This commit is contained in:
J. David Ibáñez 2011-03-15 14:12:22 +01:00
parent 8abb9007c9
commit c411fd8203
2 changed files with 94 additions and 104 deletions

196
pygit2.c

@ -54,7 +54,7 @@ typedef struct {
PyObject_HEAD
Repository *repo;
git_tag *tag;
Object *target;
PyObject *target;
} Tag;
typedef struct {
@ -166,10 +166,21 @@ Error_set_py_obj(int err, PyObject *py_obj) {
static int
py_str_to_git_oid(PyObject *py_str, git_oid *oid) {
char *hex;
int err;
hex = PyString_AsString(py_str);
if (!hex)
return GIT_ENOTOID;
return git_oid_mkstr(oid, hex);
if (hex == NULL) {
Error_set_py_obj(GIT_ENOTOID, py_str);
return -1;
}
err = git_oid_mkstr(oid, hex);
if (err < 0) {
Error_set_py_obj(err, py_str);
return -1;
}
return 0;
}
static int
@ -207,35 +218,14 @@ static int
Repository_contains(Repository *self, PyObject *value) {
git_oid oid;
int err;
err = py_str_to_git_oid(value, &oid);
if (err < 0) {
Error_set_py_obj(err, value);
if (err < 0)
return -1;
}
return git_odb_exists(git_repository_database(self->repo), &oid);
}
static Object *wrap_object(git_object *, Repository *repo);
static Tag *
wrap_tag(git_tag *tag, Repository *repo) {
Tag *py_tag;
Object *py_target;
py_tag = (Tag*)TagType.tp_alloc(&TagType, 0);
if (!py_tag)
return NULL;
py_target = wrap_object((git_object*)git_tag_target(tag), repo);
if (!py_target) {
py_tag->ob_type->tp_free((PyObject*)py_tag);
return NULL;
}
py_tag->target = py_target;
Py_INCREF(py_target);
return py_tag;
}
static Object *
wrap_object(git_object *obj, Repository *repo) {
Object *py_obj = NULL;
@ -250,7 +240,7 @@ wrap_object(git_object *obj, Repository *repo) {
py_obj = (Object*)BlobType.tp_alloc(&BlobType, 0);
break;
case GIT_OBJ_TAG:
py_obj = (Object*)wrap_tag((git_tag*)obj, repo);
py_obj = (Object*)TagType.tp_alloc(&TagType, 0);
break;
default:
assert(0);
@ -273,7 +263,7 @@ Repository_getitem(Repository *self, PyObject *value) {
err = py_str_to_git_oid(value, &oid);
if (err < 0)
return Error_set_py_obj(err, value);
return NULL;
err = git_object_lookup(&obj, self->repo, &oid, GIT_OBJ_ANY);
if (err < 0)
@ -299,7 +289,7 @@ Repository_read(Repository *self, PyObject *py_hex) {
err = py_str_to_git_oid(py_hex, &oid);
if (err < 0)
return Error_set_py_obj(err, py_hex);
return NULL;
err = Repository_read_raw(&raw, self->repo, &oid);
if (err < 0)
@ -340,39 +330,13 @@ Repository_get_index(Repository *self, void *closure) {
return self->index;
}
static git_commit *
py_str_to_git_commit(Repository *py_repo, PyObject *py_hex) {
int err;
char *hex;
git_oid oid;
git_commit *commit;
hex = PyString_AsString(py_hex);
if (!hex)
return NULL;
err = git_oid_mkstr(&oid, hex);
if (err < 0) {
Error_set_str(err, hex);
return NULL;
}
err = git_commit_lookup(&commit, py_repo->repo, &oid);
if (err < 0) {
Error_set_str(err, hex);
return NULL;
}
return commit;
}
static PyObject *
Repository_walk(Repository *self, PyObject *args)
{
PyObject *value;
unsigned int sort;
int err;
git_commit *commit;
git_oid oid;
git_revwalk *walk;
Walker *py_walker;
@ -397,12 +361,12 @@ Repository_walk(Repository *self, PyObject *args)
/* Push */
if (value != Py_None) {
commit = py_str_to_git_commit(self, value);
if (commit == NULL) {
err = py_str_to_git_oid(value, &oid);
if (err < 0) {
git_revwalk_free(walk);
return NULL;
}
err = git_revwalk_push(walk, commit);
err = git_revwalk_push(walk, &oid);
if (err < 0) {
git_revwalk_free(walk);
return Error_set(err);
@ -740,13 +704,17 @@ Commit_set_author(Commit *commit, PyObject *value) {
static PyObject *
Commit_get_tree(Commit *commit) {
const git_tree *tree;
git_tree *tree;
Tree *py_tree;
int err;
tree = git_commit_tree(commit->commit);
if (tree == NULL)
err = git_commit_tree(&tree, commit->commit);
if (err == GIT_ENOTFOUND)
Py_RETURN_NONE;
if (err < 0)
return Error_set(err);
py_tree = PyObject_New(Tree, &TreeType);
Py_INCREF(commit->repo);
py_tree->repo = commit->repo;
@ -758,20 +726,31 @@ Commit_get_tree(Commit *commit) {
static PyObject *
Commit_get_parents(Commit *commit)
{
unsigned int parent_count = git_commit_parentcount(commit->commit);
unsigned int i;
unsigned int i, parent_count;
int err;
git_commit *parent;
Object *obj;
PyObject *obj;
PyObject *list;
PyObject *list = PyList_New(parent_count);
parent_count = git_commit_parentcount(commit->commit);
list = PyList_New(parent_count);
if (!list)
return NULL;
for (i=0; i < parent_count; i++) {
parent = git_commit_parent(commit->commit, i);
obj = wrap_object((git_object *)parent, commit->repo);
err = git_commit_parent(&parent, commit->commit, i);
if (err < 0) {
Py_DECREF(list);
Error_set(err);
return NULL;
}
obj = (PyObject*)wrap_object((git_object *)parent, commit->repo);
if (obj == NULL) {
Py_DECREF(list);
return NULL;
}
PyList_SET_ITEM(list, i, (PyObject *)obj);
PyList_SET_ITEM(list, i, obj);
}
return list;
@ -788,7 +767,7 @@ Commit_add_parent(Commit *self, PyObject *parent)
err = py_str_to_git_oid(parent, &oid);
if (err < 0)
return Error_set_py_obj(err, parent);
return NULL;
err = git_commit_lookup(&parent_commit, self->repo->repo, &oid);
if (err < 0)
@ -924,10 +903,9 @@ TreeEntry_set_sha(TreeEntry *self, PyObject *value) {
int err;
err = py_str_to_git_oid(value, &oid);
if (err < 0) {
Error_set_py_obj(err, value);
if (err < 0)
return -1;
}
git_tree_entry_set_id(self->entry, &oid);
return 0;
}
@ -1166,7 +1144,7 @@ Tree_add_entry(Tree *self, PyObject *args) {
err = py_str_to_git_oid(py_sha, &oid);
if (err < 0)
return (TreeEntry*)Error_set_py_obj(err, py_sha);
return NULL;
if (git_tree_add_entry(&entry, self->tree, &oid, name, attributes) < 0)
return (TreeEntry*)PyErr_NoMemory();
@ -1305,18 +1283,29 @@ Tag_dealloc(Tag *self) {
static PyObject *
Tag_get_target(Tag *self) {
git_object *target;
target = (git_object*)git_tag_target(self->tag);
if (!target) {
/* This can only happen if we have a new tag with no target set yet. In
* particular, it can't happen if the tag fails to parse, since that
* would have returned NULL from git_object_lookup. */
Py_RETURN_NONE;
int err;
if (self->target == NULL) {
err = git_tag_target(&target, self->tag);
if (err == GIT_ENOTFOUND) {
/* This can only happen if we have a new tag with no target set
* yet. */
Py_INCREF(Py_None);
self->target = Py_None;
} else if (err < 0)
return Error_set(err);
else
self->target = (PyObject*)wrap_object(target, self->repo);
}
return (PyObject*)wrap_object(target, self->repo);
Py_INCREF(self->target);
return self->target;
}
static int
Tag_set_target(Tag *self, Object *target) {
int err;
if (!PyObject_TypeCheck(target, &ObjectType)) {
PyErr_Format(PyExc_TypeError, "target must be %.200s, not %.200s",
ObjectType.tp_name, target->ob_type->tp_name);
@ -1324,17 +1313,15 @@ Tag_set_target(Tag *self, Object *target) {
}
Py_XDECREF(self->target);
self->target = target;
self->target = (PyObject*)target;
Py_INCREF(target);
git_tag_set_target(self->tag, target->obj);
return 0;
}
err = git_tag_set_target(self->tag, target->obj);
if (err < 0) {
Error_set(err);
return -1;
}
static PyObject *
Tag_get_target_type(Tag *self) {
if (!self->target)
Py_RETURN_NONE;
return PyInt_FromLong(git_tag_type(self->tag));
return 0;
}
static PyObject *
@ -1409,8 +1396,6 @@ Tag_set_message(Tag *self, PyObject *message) {
static PyGetSetDef Tag_getseters[] = {
{"target", (getter)Tag_get_target, (setter)Tag_set_target, "tagged object",
NULL},
{"target_type", (getter)Tag_get_target_type, NULL, "type of tagged object",
NULL},
{"name", (getter)Tag_get_name, (setter)Tag_set_name, "tag name", NULL},
{"tagger", (getter)Tag_get_tagger, (setter)Tag_set_tagger, "tagger", NULL},
{"message", (getter)Tag_get_message, (setter)Tag_set_message, "tag message",
@ -1812,13 +1797,13 @@ Walker_dealloc(Walker *self) {
static PyObject *
Walker_hide(Walker *self, PyObject *py_hex) {
int err;
git_commit *commit;
git_oid oid;
commit = py_str_to_git_commit(self->repo, py_hex);
if (commit == NULL)
err = py_str_to_git_oid(py_hex, &oid);
if (err < 0)
return NULL;
err = git_revwalk_hide(self->walk, commit);
err = git_revwalk_hide(self->walk, &oid);
if (err < 0)
return Error_set(err);
@ -1828,13 +1813,13 @@ Walker_hide(Walker *self, PyObject *py_hex) {
static PyObject *
Walker_push(Walker *self, PyObject *py_hex) {
int err;
git_commit *commit;
git_oid oid;
commit = py_str_to_git_commit(self->repo, py_hex);
if (commit == NULL)
err = py_str_to_git_oid(py_hex, &oid);
if (err < 0)
return NULL;
err = git_revwalk_push(self->walk, commit);
err = git_revwalk_push(self->walk, &oid);
if (err < 0)
return Error_set(err);
@ -1874,8 +1859,13 @@ Walker_iternext(Walker *self) {
int err;
git_commit *commit;
Commit *py_commit;
git_oid oid;
err = git_revwalk_next(&commit, self->walk);
err = git_revwalk_next(&oid, self->walk);
if (err < 0)
return Error_set(err);
err = git_commit_lookup(&commit, self->repo->repo, &oid);
if (err < 0)
return Error_set(err);

@ -43,7 +43,7 @@ class TagTest(utils.BareRepoTestCase):
tag = self.repo[TAG_SHA]
self.assertTrue(isinstance(tag, pygit2.Tag))
self.assertEqual(pygit2.GIT_OBJ_TAG, tag.type)
self.assertEqual(pygit2.GIT_OBJ_COMMIT, tag.target_type)
self.assertEqual(pygit2.GIT_OBJ_COMMIT, tag.target.type)
self.assertEqual('root', tag.name)
self.assertEqual(('Dave Borowitz', 'dborowitz@google.com', 1288724692),
tag.tagger)