124 lines
2.9 KiB
C
124 lines
2.9 KiB
C
#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 geef_oom(env);
|
|
|
|
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[])
|
|
{
|
|
int error;
|
|
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 geef_oom(env);
|
|
|
|
if ((error = git_revwalk_next((git_oid *)bin.data, walk->walk)) < 0) {
|
|
if (error == GIT_ITEROVER)
|
|
return enif_make_tuple2(env, atoms.error, atoms.iterover);
|
|
|
|
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;
|
|
}
|