From 9b2a0538482a48b3a6977171e1f145cf681b38e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 2 Mar 2013 03:27:40 +0100 Subject: [PATCH] Add object id lookup --- c_src/geef.c | 1 + c_src/object.c | 18 ++++++++++++++++++ c_src/object.h | 1 + src/geef.erl | 5 ++++- src/geef_commit.erl | 5 ++++- src/geef_object.erl | 17 ++++++++++++++++- src/geef_tree.erl | 5 ++++- 7 files changed, 48 insertions(+), 4 deletions(-) diff --git a/c_src/geef.c b/c_src/geef.c index e742869..f989f32 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}, + {"object_id", 1, geef_object_id}, {"commit_tree", 1, geef_commit_tree}, {"commit_tree_id", 1, geef_commit_tree_id}, {"tree_bypath", 2, geef_tree_bypath}, diff --git a/c_src/object.c b/c_src/object.c index 00de74e..cb0abf3 100644 --- a/c_src/object.c +++ b/c_src/object.c @@ -63,3 +63,21 @@ geef_object_lookup(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) return enif_make_tuple3(env, atoms.ok, geef_object_type2atom(git_object_type(obj->obj)), term_obj); } + +ERL_NIF_TERM +geef_object_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + ErlNifBinary bin; + const git_oid *id; + geef_object *obj; + + if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj)) + return enif_make_badarg(env); + + id = git_object_id(obj->obj); + + if (geef_oid_bin(&bin, id) < 0) + return atoms.error; + + return enif_make_tuple2(env, atoms.ok, enif_make_binary(env, &bin)); +} diff --git a/c_src/object.h b/c_src/object.h index 31bc2c8..80f4547 100644 --- a/c_src/object.h +++ b/c_src/object.h @@ -13,6 +13,7 @@ typedef struct { } geef_object; ERL_NIF_TERM geef_object_lookup(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); +ERL_NIF_TERM geef_object_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_object_type2atom(const git_otype type); diff --git a/src/geef.erl b/src/geef.erl index 6040eed..0d6b1d2 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, commit_tree_id/1, commit_tree/1, tree_bypath/2]). +-export([object_lookup/2, object_id/1, commit_tree_id/1, commit_tree/1, tree_bypath/2]). -on_load(load_enif/0). @@ -74,6 +74,9 @@ oid_parse(_Sha) -> object_lookup(_Repo, _Oid) -> nif_error(?LINE). +object_id(_Handle) -> + nif_error(?LINE). + -spec commit_tree_id(term) -> binary(). commit_tree_id(_Handle) -> nif_error(?LINE). diff --git a/src/geef_commit.erl b/src/geef_commit.erl index 5672ed0..8160682 100644 --- a/src/geef_commit.erl +++ b/src/geef_commit.erl @@ -1,5 +1,5 @@ -module(geef_commit). --export([tree_id/1, tree/1]). +-export([tree_id/1, tree/1, id/1]). -include("geef_records.hrl"). @@ -15,3 +15,6 @@ tree(#object{type=commit,handle=Handle}) -> Other -> Other end. + +id(Obj = #object{type=commit}) -> + geef_object:id(Obj). diff --git a/src/geef_object.erl b/src/geef_object.erl index 1a52763..3bf61db 100644 --- a/src/geef_object.erl +++ b/src/geef_object.erl @@ -6,7 +6,7 @@ -include("geef_records.hrl"). --export([lookup/2]). +-export([lookup/2, id/1]). -spec lookup(repo(), oid() | iolist()) -> object(). lookup(#repo{handle=RepoHandle}, #oid{oid=Oid}) -> @@ -19,6 +19,14 @@ lookup(#repo{handle=RepoHandle}, #oid{oid=Oid}) -> lookup(Repo = #repo{}, Id) -> lookup(Repo, geef_oid:parse(Id)). +id(#object{handle=Handle}) -> + case geef:object_id(Handle) of + {ok, Oid} -> + #oid{oid=Oid}; + Other -> + Other + end. + -ifdef(TEST). lookup_test() -> @@ -28,4 +36,11 @@ lookup_test() -> {ok, #object{type=commit}} = lookup(Repo, ["b5b68cce8b92ca0e7", "bd48430617ac10c0f2c2923"]), {ok, #object{type=commit}} = lookup(Repo, <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>). +id_test() -> + {ok, Repo} = geef_repo:open(".."), + Sha = <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>, + Id = geef_oid:parse(Sha), + {ok, Commit = #object{type=commit}} = lookup(Repo, Sha), + Id = id(Commit). + -endif. diff --git a/src/geef_tree.erl b/src/geef_tree.erl index 5d8cc1d..21758f7 100644 --- a/src/geef_tree.erl +++ b/src/geef_tree.erl @@ -4,7 +4,7 @@ -include_lib("eunit/include/eunit.hrl"). -endif. --export([bypath/2]). +-export([bypath/2, id/1]). -include("geef_records.hrl"). @@ -16,6 +16,9 @@ bypath(#object{type=tree,handle=Handle}, Path) -> Other end. +id(Obj = #object{type=tree}) -> + geef_object:id(Obj). + -ifdef(TEST). %% This is somewhat hacky, assuming that this is running under .eunit,