From b2e366027bcc1be6aa00f3b31f6a63ecc170713a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sun, 17 Feb 2013 21:35:25 +0100 Subject: [PATCH] Add geef_commit:tree() --- c_src/commit.c | 22 ++++++++++++++++++++++ c_src/commit.h | 1 + c_src/geef.c | 1 + src/geef.erl | 4 ++++ src/geef_commit.erl | 10 +++++++++- src/geef_object.erl | 4 ++-- 6 files changed, 39 insertions(+), 3 deletions(-) diff --git a/c_src/commit.c b/c_src/commit.c index 0b36256..901dcee 100644 --- a/c_src/commit.c +++ b/c_src/commit.c @@ -22,3 +22,25 @@ geef_commit_tree_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) return enif_make_binary(env, &bin); } + +ERL_NIF_TERM +geef_commit_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + geef_object *obj, *tree; + ERL_NIF_TERM term_obj; + + if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj)) + return enif_make_badarg(env); + + tree = enif_alloc_resource(geef_object_type, sizeof(geef_object)); + + if (git_commit_tree((git_tree **) &tree->obj, (git_commit *) obj->obj) < 0) + return geef_error(env); + + term_obj = enif_make_resource(env, obj); + enif_release_resource(obj); + + + return enif_make_tuple3(env, atoms.ok, atoms.tree, term_obj); + +} diff --git a/c_src/commit.h b/c_src/commit.h index 2878357..3699c05 100644 --- a/c_src/commit.h +++ b/c_src/commit.h @@ -2,5 +2,6 @@ #define GEEF_COMMIT_H ERL_NIF_TERM geef_commit_tree_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); +ERL_NIF_TERM geef_commit_tree(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); #endif diff --git a/c_src/geef.c b/c_src/geef.c index 84bb429..6dbd1a6 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -98,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", 1, geef_commit_tree}, {"commit_tree_id", 1, geef_commit_tree_id}, }; diff --git a/src/geef.erl b/src/geef.erl index 54ee2f6..6823ac7 100644 --- a/src/geef.erl +++ b/src/geef.erl @@ -78,6 +78,10 @@ object_lookup(_Repo, _Oid) -> commit_tree_id(_Handle) -> nif_error(?LINE). +-spec commit_tree(term) -> term(). +commit_tree(_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 index 7c54596..e141dbf 100644 --- a/src/geef_commit.erl +++ b/src/geef_commit.erl @@ -1,5 +1,5 @@ -module(geef_commit). --export([tree_id/1]). +-export([tree_id/1, tree/1]). -include("geef_records.hrl"). @@ -7,3 +7,11 @@ tree_id(#object{type=commit,handle=Handle}) -> Oid = geef:commit_tree_id(Handle), #oid{oid=Oid}. + +tree(Obj = #object{type=commit,handle=Handle}) -> + case geef:commit_tree(Handle) of + {ok, Type, Handle} -> + {ok, #object{type=Type, handle=Handle}}; + Other -> + Other + end. diff --git a/src/geef_object.erl b/src/geef_object.erl index 68b6da2..c1c8d95 100644 --- a/src/geef_object.erl +++ b/src/geef_object.erl @@ -5,8 +5,8 @@ -export([lookup/2]). -spec lookup(repo(), oid()) -> object(). -lookup(#repo{handle=Repo}, #oid{oid=Oid}) -> - case geef:object_lookup(Repo, Oid) of +lookup(Repo = #repo{handle=RepoHandle}, #oid{oid=Oid}) -> + case geef:object_lookup(RepoHandle, Oid) of {ok, Type, Handle} -> {ok, #object{type=Type, handle=Handle}}; Other ->