From 9501ed2377c2afed68f168b2927b83665c172e9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Thu, 13 Feb 2014 10:47:14 +0100 Subject: [PATCH] Add reference has_log() --- c_src/geef.c | 1 + c_src/reference.c | 31 +++++++++++++++++++++++++++++++ c_src/reference.h | 1 + src/geef_nif.erl | 4 ++++ src/geef_ref.erl | 10 ++++++++++ src/geef_repo.erl | 12 +++++++++++- test/repo_test.erl | 1 + 7 files changed, 59 insertions(+), 1 deletion(-) diff --git a/c_src/geef.c b/c_src/geef.c index bee4dad..3c6a0cd 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -157,6 +157,7 @@ static ErlNifFunc geef_funcs[] = {"reference_resolve", 2, geef_reference_resolve}, {"reference_create", 5, geef_reference_create}, {"reference_dwim", 2, geef_reference_dwim}, + {"reference_has_log", 2, geef_reference_has_log}, {"oid_fmt", 1, geef_oid_fmt}, {"oid_parse", 1, geef_oid_parse}, {"object_lookup", 2, geef_object_lookup}, diff --git a/c_src/reference.c b/c_src/reference.c index e6c73a0..1994d6f 100644 --- a/c_src/reference.c +++ b/c_src/reference.c @@ -418,3 +418,34 @@ geef_reference_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) 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); +} diff --git a/c_src/reference.h b/c_src/reference.h index 89bd0bb..492e00d 100644 --- a/c_src/reference.h +++ b/c_src/reference.h @@ -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_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_has_log(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); void geef_ref_iter_free(ErlNifEnv *env, void *cd); diff --git a/src/geef_nif.erl b/src/geef_nif.erl index dd7241f..be8220a 100644 --- a/src/geef_nif.erl +++ b/src/geef_nif.erl @@ -69,6 +69,10 @@ reference_resolve(_RepoHandle, _Name) -> reference_dwim(_Handle, _Name) -> ?NIF_FN. +-spec reference_has_log(term(), iolist()) -> {ok, boolean()} | {error, term()}. +reference_has_log(_Handle, _Name) -> + ?NIF_FN. + odb_object_exists(_Val, _Val) -> nif_error(?LINE). diff --git a/src/geef_ref.erl b/src/geef_ref.erl index 2e28467..d4ad65d 100644 --- a/src/geef_ref.erl +++ b/src/geef_ref.erl @@ -1,6 +1,7 @@ -module(geef_ref). -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"). @@ -103,3 +104,12 @@ shorthand(<<"refs/", Rest/binary>>) -> Rest; shorthand(#geef_reference{name=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). diff --git a/src/geef_repo.erl b/src/geef_repo.erl index 1dcdd80..63df575 100644 --- a/src/geef_repo.erl +++ b/src/geef_repo.erl @@ -18,6 +18,7 @@ -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, reference_dwim/2, handle/1, iterator/2]). +-export([reference_has_log/2]). -include("geef_records.hrl"). -record(state, {handle}). @@ -95,11 +96,15 @@ reference_dwim(Pid, Name) -> revwalk(Pid) -> gen_server:call(Pid, revwalk). +%% @private +reference_has_log(Pid, Name) -> + gen_server:call(Pid, {has_log, Name}). + stop(Pid) -> gen_server:call(Pid, stop). %% @private -%% @doc Get the underlying repo resource6 +%% @doc Get the underlying repo resource handle(Pid) -> 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}) -> Reply = geef_nif:reference_dwim(Handle, Name), {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) -> {stop, normal, ok, State}; handle_call(revwalk, _From, State = #state{handle=Handle}) -> diff --git a/test/repo_test.erl b/test/repo_test.erl index 54c8d4e..7f67d72 100644 --- a/test/repo_test.erl +++ b/test/repo_test.erl @@ -63,6 +63,7 @@ ref_test(Repo) -> ?_assertEqual(Ref1#geef_reference.target, <<"refs/heads/branch">>), ?_assertEqual(<<"branch">>, geef_ref:shorthand(Ref0)), ?_assertEqual(Ref2#geef_reference.target, Id), + ?_assertEqual({ok, true}, geef_ref:has_log(Ref0)), ?_assertEqual(Ref0, Dwimed)]. ref_iter_test(Repo) ->