Add revwalk support
This commit is contained in:
118
c_src/revwalk.c
Normal file
118
c_src/revwalk.c
Normal file
@@ -0,0 +1,118 @@
|
||||
#include "geef.h"
|
||||
#include "oid.h"
|
||||
#include "revwalk.h"
|
||||
#include <string.h>
|
||||
#include <git2.h>
|
||||
|
||||
void geef_revwalk_free(ErlNifEnv *env, void *cd)
|
||||
{
|
||||
geef_revwalk *walk = (geef_revwalk *) cd;
|
||||
enif_release_resource(walk->repo);
|
||||
git_revwalk_free(walk->walk);
|
||||
}
|
||||
|
||||
ERL_NIF_TERM
|
||||
geef_revwalk_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
||||
{
|
||||
geef_repository *repo;
|
||||
geef_revwalk *walk;
|
||||
ERL_NIF_TERM walk_term;
|
||||
|
||||
if (!enif_get_resource(env, argv[0], geef_repository_type, (void **) &repo))
|
||||
return enif_make_badarg(env);
|
||||
|
||||
walk = enif_alloc_resource(geef_revwalk_type, sizeof(geef_revwalk));
|
||||
if (!walk)
|
||||
return atoms.error;
|
||||
|
||||
if (git_revwalk_new(&walk->walk, repo->repo) < 0) {
|
||||
enif_release_resource(walk);
|
||||
return geef_error(env);
|
||||
}
|
||||
|
||||
walk_term = enif_make_resource(env, walk);
|
||||
enif_release_resource(walk);
|
||||
walk->repo = repo;
|
||||
enif_keep_resource(repo);
|
||||
|
||||
return enif_make_tuple2(env, atoms.ok, walk_term);
|
||||
}
|
||||
|
||||
ERL_NIF_TERM
|
||||
geef_revwalk_push(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
||||
{
|
||||
ErlNifBinary bin;
|
||||
geef_revwalk *walk;
|
||||
int hide;
|
||||
|
||||
if (!enif_get_resource(env, argv[0], geef_revwalk_type, (void **) &walk))
|
||||
return enif_make_badarg(env);
|
||||
|
||||
if (!enif_inspect_binary(env, argv[1], &bin))
|
||||
return enif_make_badarg(env);
|
||||
|
||||
hide = !enif_compare(argv[2], atoms.true);
|
||||
|
||||
if (hide)
|
||||
return git_revwalk_hide(walk->walk, (git_oid *)bin.data) ? geef_error(env) : atoms.ok;
|
||||
|
||||
return git_revwalk_push(walk->walk, (git_oid *)bin.data) ? geef_error(env) : atoms.ok;
|
||||
}
|
||||
|
||||
ERL_NIF_TERM
|
||||
geef_revwalk_next(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
||||
{
|
||||
ErlNifBinary bin;
|
||||
geef_revwalk *walk;
|
||||
|
||||
if (!enif_get_resource(env, argv[0], geef_revwalk_type, (void **) &walk))
|
||||
return enif_make_badarg(env);
|
||||
|
||||
if (!enif_alloc_binary(GIT_OID_RAWSZ, &bin))
|
||||
return atoms.error;
|
||||
|
||||
if (git_revwalk_next((git_oid *)bin.data, walk->walk) < 0)
|
||||
return geef_error(env);
|
||||
|
||||
return enif_make_tuple2(env, atoms.ok, enif_make_binary(env, &bin));
|
||||
}
|
||||
|
||||
ERL_NIF_TERM
|
||||
geef_revwalk_sorting(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
||||
{
|
||||
geef_revwalk *walk;
|
||||
ERL_NIF_TERM term, head = argv[1];
|
||||
unsigned int flags = 0;
|
||||
|
||||
if (!enif_get_resource(env, argv[0], geef_revwalk_type, (void **) &walk))
|
||||
return enif_make_badarg(env);
|
||||
|
||||
while (enif_get_list_cell(env, head, &term, &head)) {
|
||||
if (!enif_compare(atoms.toposort, term))
|
||||
flags |= GIT_SORT_TOPOLOGICAL;
|
||||
else if (!enif_compare(atoms.timesort, term))
|
||||
flags |= GIT_SORT_TIME;
|
||||
else if (!enif_compare(atoms.reversesort, term))
|
||||
flags |= GIT_SORT_REVERSE;
|
||||
else
|
||||
return enif_make_badarg(env);
|
||||
}
|
||||
|
||||
git_revwalk_sorting(walk->walk, flags);
|
||||
|
||||
return atoms.ok;
|
||||
}
|
||||
|
||||
|
||||
ERL_NIF_TERM
|
||||
geef_revwalk_reset(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
||||
{
|
||||
geef_revwalk *walk;
|
||||
|
||||
if (!enif_get_resource(env, argv[0], geef_revwalk_type, (void **) &walk))
|
||||
return enif_make_badarg(env);
|
||||
|
||||
git_revwalk_reset(walk->walk);
|
||||
|
||||
return atoms.ok;
|
||||
}
|
||||
Reference in New Issue
Block a user