Improve the Repository.walk method a little

Now it is possible to pass None as the commit hash to get a non
initialized walker.  A second and optional parameter allows to set
the sorting mode.

Signed-off-by: J. David Ibañez <jdavid@itaapy.com>
This commit is contained in:
J. David Ibañez
2011-02-14 15:42:50 +01:00
parent fc4f82cc68
commit 0416276d2f

View File

@@ -364,31 +364,47 @@ py_str_to_git_commit(Repository *py_repo, PyObject *py_hex) {
}
static PyObject *
Repository_walk(Repository *self, PyObject *py_hex)
Repository_walk(Repository *self, PyObject *args)
{
PyObject *value;
unsigned int sort;
int err;
git_commit *commit;
git_revwalk *walk;
Walker *py_walker;
commit = py_str_to_git_commit(self, py_hex);
if (commit == NULL)
sort = GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE;
if (!PyArg_ParseTuple(args, "O|I", &value, &sort))
return NULL;
if (value != Py_None && !PyString_Check(value)) {
PyErr_SetObject(PyExc_TypeError, value);
return NULL;
}
err = git_revwalk_new(&walk, self->repo);
if (err < 0)
return Error_set(err);
err = git_revwalk_sorting(walk, GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE);
/* Sort */
err = git_revwalk_sorting(walk, sort);
if (err < 0) {
git_revwalk_free(walk);
return Error_set(err);
}
err = git_revwalk_push(walk, commit);
if (err < 0) {
git_revwalk_free(walk);
return Error_set(err);
/* Push */
if (value != Py_None) {
commit = py_str_to_git_commit(self, value);
if (commit == NULL) {
git_revwalk_free(walk);
return NULL;
}
err = git_revwalk_push(walk, commit);
if (err < 0) {
git_revwalk_free(walk);
return Error_set(err);
}
}
py_walker = PyObject_New(Walker, &WalkerType);
@@ -404,7 +420,7 @@ Repository_walk(Repository *self, PyObject *py_hex)
}
static PyMethodDef Repository_methods[] = {
{"walk", (PyCFunction)Repository_walk, METH_O,
{"walk", (PyCFunction)Repository_walk, METH_VARARGS,
"Generator that traverses the history starting from the given commit."},
{"read", (PyCFunction)Repository_read, METH_O,
"Read raw object data from the repository."},