#include "geef.h" #include "oid.h" #include "revwalk.h" #include #include 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_simplify_first_parent(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_simplify_first_parent(walk->walk); 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; }