From 52a6f72fefa8682b355cb4454653b38dcc92db32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Wed, 24 Jul 2013 23:55:54 +0200 Subject: [PATCH] Provide geef_tree:count/1 --- c_src/geef.c | 1 + c_src/tree.c | 11 +++++++++++ c_src/tree.h | 1 + src/geef_nif.erl | 4 ++++ src/geef_tree.erl | 6 +++++- 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/c_src/geef.c b/c_src/geef.c index a270e7a..c3890c8 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -164,6 +164,7 @@ static ErlNifFunc geef_funcs[] = {"commit_tree_id", 1, geef_commit_tree_id}, {"tree_bypath", 2, geef_tree_bypath}, {"tree_nth", 2, geef_tree_nth}, + {"tree_count", 1, geef_tree_count}, {"blob_size", 1, geef_blob_size}, {"blob_content", 1, geef_blob_content}, {"tag_peel", 1, geef_tag_peel}, diff --git a/c_src/tree.c b/c_src/tree.c index 3f0f4b6..5013ea6 100644 --- a/c_src/tree.c +++ b/c_src/tree.c @@ -80,3 +80,14 @@ geef_tree_nth(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) return tree_entry_to_term(env, entry); } + +ERL_NIF_TERM +geef_tree_count(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + geef_object *obj; + + if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj)) + return enif_make_badarg(env); + + return enif_make_uint64(env, git_tree_entrycount((git_tree *) obj->obj)); +} diff --git a/c_src/tree.h b/c_src/tree.h index a74418d..1d985fc 100644 --- a/c_src/tree.h +++ b/c_src/tree.h @@ -5,5 +5,6 @@ ERL_NIF_TERM geef_tree_bypath(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_tree_nth(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); +ERL_NIF_TERM geef_tree_count(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); #endif diff --git a/src/geef_nif.erl b/src/geef_nif.erl index 0efede6..2d3a436 100644 --- a/src/geef_nif.erl +++ b/src/geef_nif.erl @@ -101,6 +101,10 @@ tree_bypath(_TreeHandle, _Path) -> tree_nth(_TreeHandle, _Nth) -> ?NIF_FN. +-spec tree_count(term) -> non_neg_integer(). +tree_count(_Treehandle) -> + ?NIF_FN. + -spec blob_size(term) -> {ok, integer()} | error. blob_size(_ObjHandle) -> nif_error(?LINE). diff --git a/src/geef_tree.erl b/src/geef_tree.erl index 88df9e7..2f9dc31 100644 --- a/src/geef_tree.erl +++ b/src/geef_tree.erl @@ -4,7 +4,7 @@ -include_lib("eunit/include/eunit.hrl"). -endif. --export([get/2, nth/2, lookup/2]). +-export([get/2, nth/2, count/1, lookup/2]). -include("geef_records.hrl"). @@ -21,6 +21,10 @@ get(#geef_object{type=tree,handle=Handle}, Path) -> nth(#geef_object{type=tree,handle=Handle}, Nth) -> from_nif(geef_nif:tree_nth(Handle, Nth)). +-spec count(geef_object()) -> non_neg_integer(). +count(#geef_object{type=tree,handle=Handle}) -> + geef_nif:tree_count(Handle). + -spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}. lookup(Repo, Id) -> geef_obj:lookup(Repo, Id, tree).