Add object id lookup

This commit is contained in:
Carlos Martín Nieto
2013-03-02 03:27:40 +01:00
parent d62511515d
commit 9b2a053848
7 changed files with 48 additions and 4 deletions

View File

@@ -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},

View File

@@ -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));
}

View File

@@ -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);

View File

@@ -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).

View File

@@ -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).

View File

@@ -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.

View File

@@ -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,