Add reference has_log()

This commit is contained in:
Carlos Martín Nieto
2014-02-13 10:47:14 +01:00
parent 42d0aef29d
commit 9501ed2377
7 changed files with 59 additions and 1 deletions

View File

@@ -157,6 +157,7 @@ static ErlNifFunc geef_funcs[] =
{"reference_resolve", 2, geef_reference_resolve}, {"reference_resolve", 2, geef_reference_resolve},
{"reference_create", 5, geef_reference_create}, {"reference_create", 5, geef_reference_create},
{"reference_dwim", 2, geef_reference_dwim}, {"reference_dwim", 2, geef_reference_dwim},
{"reference_has_log", 2, geef_reference_has_log},
{"oid_fmt", 1, geef_oid_fmt}, {"oid_fmt", 1, geef_oid_fmt},
{"oid_parse", 1, geef_oid_parse}, {"oid_parse", 1, geef_oid_parse},
{"object_lookup", 2, geef_object_lookup}, {"object_lookup", 2, geef_object_lookup},

View File

@@ -418,3 +418,34 @@ geef_reference_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
return atoms.ok; return atoms.ok;
} }
ERL_NIF_TERM
geef_reference_has_log(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
geef_repository *repo;
ErlNifBinary name;
int error;
const char *pname;
ERL_NIF_TERM ret;
if (!enif_get_resource(env, argv[0], geef_repository_type, (void **) &repo))
return enif_make_badarg(env);
if (!enif_inspect_iolist_as_binary(env, argv[1], &name))
return enif_make_badarg(env);
if (!geef_terminate_binary(&name))
return geef_oom(env);
pname = (char *) name.data;
error = git_reference_has_log(repo->repo, pname);
enif_release_binary(&name);
if (error < 0)
return geef_error(env);
ret = error ? atoms.true : atoms.false;
return enif_make_tuple2(env, atoms.ok, ret);
}

View File

@@ -20,6 +20,7 @@ ERL_NIF_TERM geef_reference_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM
ERL_NIF_TERM geef_reference_dwim(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_reference_dwim(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM geef_reference_iterator(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_reference_iterator(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM geef_reference_next(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_reference_next(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM geef_reference_has_log(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
void geef_ref_iter_free(ErlNifEnv *env, void *cd); void geef_ref_iter_free(ErlNifEnv *env, void *cd);

View File

@@ -69,6 +69,10 @@ reference_resolve(_RepoHandle, _Name) ->
reference_dwim(_Handle, _Name) -> reference_dwim(_Handle, _Name) ->
?NIF_FN. ?NIF_FN.
-spec reference_has_log(term(), iolist()) -> {ok, boolean()} | {error, term()}.
reference_has_log(_Handle, _Name) ->
?NIF_FN.
odb_object_exists(_Val, _Val) -> odb_object_exists(_Val, _Val) ->
nif_error(?LINE). nif_error(?LINE).

View File

@@ -1,6 +1,7 @@
-module(geef_ref). -module(geef_ref).
-export([lookup/2, iterator/1, iterator/2, next/1, resolve/1, create/4, create_symbolic/4, dwim/2, shorthand/1]). -export([lookup/2, iterator/1, iterator/2, next/1, resolve/1, create/4, create_symbolic/4, dwim/2, shorthand/1]).
-export([has_log/1, has_log/2]).
-include("geef_records.hrl"). -include("geef_records.hrl").
@@ -103,3 +104,12 @@ shorthand(<<"refs/", Rest/binary>>) ->
Rest; Rest;
shorthand(#geef_reference{name=Name}) -> shorthand(#geef_reference{name=Name}) ->
shorthand(Name). shorthand(Name).
%% @doc Return whether the reference has a reflog
-spec has_log(pid(), iolist()) -> {ok, boolean()} | {error, term()}.
has_log(Repo, Name) ->
geef_repo:reference_has_log(Repo, Name).
-spec has_log(ref()) -> boolean() | {ok, boolean()} | {error | term()}.
has_log(#geef_reference{repo=Repo, name=Name}) ->
has_log(Repo, Name).

View File

@@ -18,6 +18,7 @@
-export([open/1, init/2, path/1, workdir/1, odb/1, is_bare/1, references/1, discover/1, -export([open/1, init/2, path/1, workdir/1, odb/1, is_bare/1, references/1, discover/1,
lookup_object/2, revwalk/1, stop/1, lookup_object/2, revwalk/1, stop/1,
reference_dwim/2, handle/1, iterator/2]). reference_dwim/2, handle/1, iterator/2]).
-export([reference_has_log/2]).
-include("geef_records.hrl"). -include("geef_records.hrl").
-record(state, {handle}). -record(state, {handle}).
@@ -95,11 +96,15 @@ reference_dwim(Pid, Name) ->
revwalk(Pid) -> revwalk(Pid) ->
gen_server:call(Pid, revwalk). gen_server:call(Pid, revwalk).
%% @private
reference_has_log(Pid, Name) ->
gen_server:call(Pid, {has_log, Name}).
stop(Pid) -> stop(Pid) ->
gen_server:call(Pid, stop). gen_server:call(Pid, stop).
%% @private %% @private
%% @doc Get the underlying repo resource6 %% @doc Get the underlying repo resource
handle(Pid) -> handle(Pid) ->
gen_server:call(Pid, handle). gen_server:call(Pid, handle).
@@ -136,6 +141,11 @@ handle_call({iterator, Regexp}, _From, State = #state{handle=Handle}) ->
handle_call({dwim_reference, Name}, _From, State = #state{handle=Handle}) -> handle_call({dwim_reference, Name}, _From, State = #state{handle=Handle}) ->
Reply = geef_nif:reference_dwim(Handle, Name), Reply = geef_nif:reference_dwim(Handle, Name),
{reply, Reply, State}; {reply, Reply, State};
handle_call({has_log, Name}, _From, State = #state{handle=Handle}) ->
Reply = geef_nif:reference_has_log(Handle, Name),
{reply, Reply, State};
handle_call(stop, _From, State) -> handle_call(stop, _From, State) ->
{stop, normal, ok, State}; {stop, normal, ok, State};
handle_call(revwalk, _From, State = #state{handle=Handle}) -> handle_call(revwalk, _From, State = #state{handle=Handle}) ->

View File

@@ -63,6 +63,7 @@ ref_test(Repo) ->
?_assertEqual(Ref1#geef_reference.target, <<"refs/heads/branch">>), ?_assertEqual(Ref1#geef_reference.target, <<"refs/heads/branch">>),
?_assertEqual(<<"branch">>, geef_ref:shorthand(Ref0)), ?_assertEqual(<<"branch">>, geef_ref:shorthand(Ref0)),
?_assertEqual(Ref2#geef_reference.target, Id), ?_assertEqual(Ref2#geef_reference.target, Id),
?_assertEqual({ok, true}, geef_ref:has_log(Ref0)),
?_assertEqual(Ref0, Dwimed)]. ?_assertEqual(Ref0, Dwimed)].
ref_iter_test(Repo) -> ref_iter_test(Repo) ->