Add geef_reflog:delete()

This commit is contained in:
Carlos Martín Nieto
2014-02-13 18:24:42 +01:00
parent 5520efb72a
commit 73af429633
7 changed files with 47 additions and 5 deletions

View File

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

View File

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

View File

@@ -5,5 +5,6 @@
#include <git2.h>
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

View File

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

View File

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

View File

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

View File

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