diff --git a/c_src/geef.c b/c_src/geef.c index 57e26ba..4e111fa 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -177,6 +177,7 @@ static ErlNifFunc geef_funcs[] = {"reference_dwim", 2, geef_reference_dwim}, {"reference_has_log", 2, geef_reference_has_log}, {"reflog_read", 2, geef_reflog_read}, + {"reflog_delete", 2, geef_reflog_delete}, {"oid_fmt", 1, geef_oid_fmt}, {"oid_parse", 1, geef_oid_parse}, {"object_lookup", 2, geef_object_lookup}, diff --git a/c_src/reflog.c b/c_src/reflog.c index 0708118..0efbdf6 100644 --- a/c_src/reflog.c +++ b/c_src/reflog.c @@ -65,3 +65,26 @@ on_oom: git_reflog_free(reflog); return geef_oom(env); } + +ERL_NIF_TERM +geef_reflog_delete(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + geef_repository *repo; + ErlNifBinary bin; + int error; + + 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], &bin)) + return enif_make_badarg(env); + + if (!geef_terminate_binary(&bin)) + return geef_oom(env); + + error = git_reflog_delete(repo->repo, (char *) bin.data); + + enif_release_binary(&bin); + + return error ? geef_error(env) : atoms.ok; +} diff --git a/c_src/reflog.h b/c_src/reflog.h index 398dfb0..d1717c1 100644 --- a/c_src/reflog.h +++ b/c_src/reflog.h @@ -5,5 +5,6 @@ #include ERL_NIF_TERM geef_reflog_read(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); +ERL_NIF_TERM geef_reflog_delete(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); #endif diff --git a/src/geef_nif.erl b/src/geef_nif.erl index 1ae9347..1134adf 100644 --- a/src/geef_nif.erl +++ b/src/geef_nif.erl @@ -77,6 +77,10 @@ reference_has_log(_Handle, _Name) -> reflog_read(_Handle, _Name) -> ?NIF_FN. +-spec reflog_delete(term(), iolist()) -> ok | {error, term()}. +reflog_delete(_Handle, _Name) -> + ?NIF_FN. + odb_object_exists(_Val, _Val) -> nif_error(?LINE). diff --git a/src/geef_reflog.erl b/src/geef_reflog.erl index 334e152..706f37d 100644 --- a/src/geef_reflog.erl +++ b/src/geef_reflog.erl @@ -3,13 +3,12 @@ -module(geef_reflog). -include("geef_records.hrl"). --include_lib("eunit/include/eunit.hrl"). -type entry() :: #geef_reflog_entry{}. -export_type([entry/0]). %% API --export([read/2]). +-export([read/2, delete/2]). to_entry({Name, Email, Timestamp, Offset, IdOld, IdNew, Message}) -> Sig = geef_sig:convert(Name, Email, Timestamp, Offset), @@ -24,3 +23,6 @@ read(Repo, Name) -> Other -> Other end. + +delete(Repo, Name) -> + geef_repo:reflog_delete(Repo, Name). diff --git a/src/geef_repo.erl b/src/geef_repo.erl index c904c0b..6ebf507 100644 --- a/src/geef_repo.erl +++ b/src/geef_repo.erl @@ -14,7 +14,7 @@ lookup_object/2, revwalk/1, stop/1, reference_dwim/2, handle/1, iterator/2]). -export([reference_has_log/2]). --export([reflog_read/2]). +-export([reflog_read/2, reflog_delete/2]). -include("geef_records.hrl"). -record(state, {handle}). @@ -100,6 +100,10 @@ reference_has_log(Pid, Name) -> reflog_read(Pid, Name) -> gen_server:call(Pid, {reflog_read, Name}). +%% @private +reflog_delete(Pid, Name) -> + gen_server:call(Pid, {reflog_delete, Name}). + stop(Pid) -> gen_server:call(Pid, stop). @@ -150,6 +154,10 @@ handle_call({reflog_read, Name}, _From, State = #state{handle=Handle}) -> Reply = geef_nif:reflog_read(Handle, Name), {reply, Reply, State}; +handle_call({reflog_delete, Name}, _From, State = #state{handle=Handle}) -> + Reply = geef_nif:reflog_delete(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 610b326..c9b0f28 100644 --- a/test/repo_test.erl +++ b/test/repo_test.erl @@ -59,13 +59,16 @@ ref_test(Repo) -> {ok, Ref1} = geef_ref:lookup(Repo, "refs/heads/other"), {ok, Ref2} = geef_ref:resolve(Ref0), {ok, Dwimed} = geef_ref:dwim(Repo, "branch"), - {ok, Reflog} = ?debugVal(geef_reflog:read(Repo, "refs/heads/branch")), + {ok, Reflog0} = geef_reflog:read(Repo, "refs/heads/branch"), + ok = geef_reflog:delete(Repo, "refs/heads/branch"), + {ok, Reflog1} = geef_reflog:read(Repo, "refs/heads/branch"), [?_assertEqual(Ref0#geef_reference.target, Id), ?_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(1, length(Reflog)), + ?_assertEqual(1, length(Reflog0)), + ?_assertEqual(0, length(Reflog1)), ?_assertEqual(Ref0, Dwimed)]. ref_iter_test(Repo) ->