diff --git a/c_src/commit.c b/c_src/commit.c new file mode 100644 index 0000000..0b36256 --- /dev/null +++ b/c_src/commit.c @@ -0,0 +1,24 @@ +#include "geef.h" +#include "repository.h" +#include "object.h" +#include "oid.h" +#include +#include + +ERL_NIF_TERM +geef_commit_tree_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + const git_oid *id; + geef_object *obj; + ErlNifBinary bin; + + if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj)) + return enif_make_badarg(env); + + id = git_commit_tree_id((git_commit *) obj->obj); + + if (geef_oid_bin(&bin, id) < 0) + return atoms.error; + + return enif_make_binary(env, &bin); +} diff --git a/c_src/commit.h b/c_src/commit.h new file mode 100644 index 0000000..2878357 --- /dev/null +++ b/c_src/commit.h @@ -0,0 +1,6 @@ +#ifndef GEEF_COMMIT_H +#define GEEF_COMMIT_H + +ERL_NIF_TERM geef_commit_tree_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); + +#endif diff --git a/c_src/geef.c b/c_src/geef.c index 59cbe57..84bb429 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -3,6 +3,7 @@ #include "reference.h" #include "oid.h" #include "object.h" +#include "commit.h" #include "geef.h" #include #include @@ -97,6 +98,7 @@ static ErlNifFunc geef_funcs[] = {"oid_fmt", 1, geef_oid_fmt}, {"oid_parse", 1, geef_oid_parse}, {"object_lookup", 2, geef_object_lookup}, + {"commit_tree_id", 1, geef_commit_tree_id}, }; ERL_NIF_INIT(geef, geef_funcs, load, NULL, NULL, unload) diff --git a/src/geef.erl b/src/geef.erl index f0bbeb5..54ee2f6 100644 --- a/src/geef.erl +++ b/src/geef.erl @@ -11,7 +11,7 @@ -export([oid_fmt/1, oid_parse/1]). % objects --export([object_lookup/2]). +-export([object_lookup/2, commit_tree_id/1]). -on_load(load_enif/0). @@ -74,6 +74,10 @@ oid_parse(_Sha) -> object_lookup(_Repo, _Oid) -> nif_error(?LINE). +-spec commit_tree_id(term) -> binary(). +commit_tree_id(_Handle) -> + nif_error(?LINE). + nif_error(Line) -> erlang:nif_error({nif_not_loaded,module,?MODULE,line,Line}). diff --git a/src/geef_commit.erl b/src/geef_commit.erl new file mode 100644 index 0000000..7c54596 --- /dev/null +++ b/src/geef_commit.erl @@ -0,0 +1,9 @@ +-module(geef_commit). +-export([tree_id/1]). + +-include("geef_records.hrl"). + +-spec tree_id(object()) -> oid(). +tree_id(#object{type=commit,handle=Handle}) -> + Oid = geef:commit_tree_id(Handle), + #oid{oid=Oid}. diff --git a/src/geef_object.erl b/src/geef_object.erl index 5fe4a0e..68b6da2 100644 --- a/src/geef_object.erl +++ b/src/geef_object.erl @@ -8,7 +8,7 @@ lookup(#repo{handle=Repo}, #oid{oid=Oid}) -> case geef:object_lookup(Repo, Oid) of {ok, Type, Handle} -> - #object{type=Type, handle=Handle}; + {ok, #object{type=Type, handle=Handle}}; Other -> Other end.