py_str_to_git_oid now supports short prefixes

py_str_to_git_oid now returns the length of the oid on success.

We don't yet do anything useful with the length, but every call to
py_str_to_git_oid has been properly updated.

This is half the work needed to fix issue #50. The changes made to
py_str_to_git_oid are based on a patch by Hugh Cole-Baker.
This commit is contained in:
J. David Ibáñez 2011-10-10 19:25:13 +02:00
parent 1dde68691b
commit ab96646e91

@ -271,12 +271,13 @@ wrap_reference(git_reference * c_reference)
return (PyObject *)py_reference;
}
static int
static size_t
py_str_to_git_oid(PyObject *py_str, git_oid *oid)
{
PyObject *py_hex;
const char *hex_or_bin;
int err;
size_t len;
/* Case 1: raw sha */
if (PyString_Check(py_str)) {
@ -284,7 +285,7 @@ py_str_to_git_oid(PyObject *py_str, git_oid *oid)
if (hex_or_bin == NULL)
return 0;
git_oid_fromraw(oid, (const unsigned char*)hex_or_bin);
return 1;
return GIT_OID_HEXSZ;
}
/* Case 2: hex sha */
@ -296,12 +297,13 @@ py_str_to_git_oid(PyObject *py_str, git_oid *oid)
Py_DECREF(py_hex);
if (hex_or_bin == NULL)
return 0;
err = git_oid_fromstr(oid, hex_or_bin);
len = strnlen(hex_or_bin, GIT_OID_HEXSZ);
err = git_oid_fromstrn(oid, hex_or_bin, len);
if (err < 0) {
Error_set_py_obj(err, py_str);
return 0;
}
return 1;
return len;
}
/* Type error */
@ -311,6 +313,14 @@ py_str_to_git_oid(PyObject *py_str, git_oid *oid)
return 0;
}
#define TODO_SUPPORT_SHORT_HEXS(len) \
if (0 < len && len < GIT_OID_HEXSZ) {\
PyErr_SetString(PyExc_NotImplementedError,\
"short strings not yet supported");\
len = 0;\
}
#define git_oid_to_python(oid) \
PyString_FromStringAndSize(oid.id, GIT_OID_RAWSZ)
@ -388,8 +398,11 @@ static int
Repository_contains(Repository *self, PyObject *value)
{
git_oid oid;
size_t len;
if (!py_str_to_git_oid(value, &oid))
len = py_str_to_git_oid(value, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return -1;
return git_odb_exists(git_repository_database(self->repo), &oid);
@ -399,8 +412,11 @@ static PyObject *
Repository_getitem(Repository *self, PyObject *value)
{
git_oid oid;
size_t len;
if (!py_str_to_git_oid(value, &oid))
len = py_str_to_git_oid(value, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return NULL;
return lookup_object(self, &oid, GIT_OBJ_ANY);
@ -419,8 +435,11 @@ Repository_read(Repository *self, PyObject *py_hex)
git_oid oid;
int err;
git_odb_object *obj;
size_t len;
if (!py_str_to_git_oid(py_hex, &oid))
len = py_str_to_git_oid(py_hex, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return NULL;
err = Repository_read_raw(&obj, self->repo, &oid);
@ -533,6 +552,7 @@ Repository_walk(Repository *self, PyObject *args)
git_oid oid;
git_revwalk *walk;
Walker *py_walker;
size_t len;
if (!PyArg_ParseTuple(args, "OI", &value, &sort))
return NULL;
@ -546,7 +566,9 @@ Repository_walk(Repository *self, PyObject *args)
/* Push */
if (value != Py_None) {
if (!py_str_to_git_oid(value, &oid)) {
len = py_str_to_git_oid(value, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0) {
git_revwalk_free(walk);
return NULL;
}
@ -621,20 +643,26 @@ Repository_create_commit(Repository *self, PyObject *args)
char *message, *update_ref;
git_oid oid;
git_tree *tree;
PyObject *py_message, *py_parents, *py_parent;
PyObject *py_oid, *py_message, *py_parents, *py_parent;
int parent_count;
git_commit **parents;
int err, i;
size_t len;
if (!PyArg_ParseTuple(args, "zO&O&OO&O!",
if (!PyArg_ParseTuple(args, "zO&O&OOO!",
&update_ref,
signature_converter, &author,
signature_converter, &committer,
&py_message,
py_str_to_git_oid, &oid,
&py_oid,
&PyList_Type, &py_parents))
return NULL;
len = py_str_to_git_oid(py_oid, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return NULL;
message = py_str_to_c_str(py_message);
err = git_tree_lookup(&tree, self->repo, &oid);
@ -650,7 +678,9 @@ Repository_create_commit(Repository *self, PyObject *args)
}
for (i = 0; i < parent_count; i++) {
py_parent = PyList_GET_ITEM(py_parents, i);
if (!py_str_to_git_oid(py_parent, &oid)) {
len = py_str_to_git_oid(py_parent, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0) {
git_tree_close(tree);
return free_parents(parents, i);
}
@ -673,21 +703,28 @@ Repository_create_commit(Repository *self, PyObject *args)
static PyObject *
Repository_create_tag(Repository *self, PyObject *args)
{
PyObject *py_oid;
char *tag_name, *message;
git_signature *tagger;
git_oid oid;
git_object *target;
int err, target_type;
char hex[GIT_OID_HEXSZ + 1];
size_t len;
if (!PyArg_ParseTuple(args, "sO&iO&s",
if (!PyArg_ParseTuple(args, "sOiO&s",
&tag_name,
py_str_to_git_oid, &oid,
&py_oid,
&target_type,
signature_converter, &tagger,
&message))
return NULL;
len = py_str_to_git_oid(py_oid, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return NULL;
err = git_object_lookup(&target, self->repo, &oid, target_type);
if (err < 0) {
git_oid_fmt(hex, &oid);
@ -771,14 +808,20 @@ Repository_lookup_reference(Repository *self, PyObject *py_name)
static PyObject *
Repository_create_reference(Repository *self, PyObject *args)
{
PyObject *py_oid;
git_reference *c_reference;
char *c_name;
git_oid oid;
int err;
size_t len;
/* 1- Get the C variables */
if (!PyArg_ParseTuple(args, "sO&", &c_name,
py_str_to_git_oid, &oid))
if (!PyArg_ParseTuple(args, "sO", &c_name, &py_oid))
return NULL;
len = py_str_to_git_oid(py_oid, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return NULL;
/* 2- Create the reference */
@ -2179,8 +2222,11 @@ Walker_hide(Walker *self, PyObject *py_hex)
{
int err;
git_oid oid;
size_t len;
if (!py_str_to_git_oid(py_hex, &oid))
len = py_str_to_git_oid(py_hex, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return NULL;
err = git_revwalk_hide(self->walk, &oid);
@ -2195,8 +2241,11 @@ Walker_push(Walker *self, PyObject *py_hex)
{
int err;
git_oid oid;
size_t len;
if (!py_str_to_git_oid(py_hex, &oid))
len = py_str_to_git_oid(py_hex, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return NULL;
err = git_revwalk_push(self->walk, &oid);
@ -2436,9 +2485,12 @@ Reference_set_oid(Reference *self, PyObject *py_hex)
{
git_oid oid;
int err;
size_t len;
/* 1- Get the oid */
if (!py_str_to_git_oid(py_hex, &oid))
len = py_str_to_git_oid(py_hex, &oid);
TODO_SUPPORT_SHORT_HEXS(len)
if (len == 0)
return -1;
/* 2- Set the oid */