diff --git a/c_src/geef.c b/c_src/geef.c index 4e111fa..1663183 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -13,6 +13,7 @@ #include "signature.h" #include "revparse.h" #include "reflog.h" +#include "config.h" #include "geef.h" #include #include @@ -24,6 +25,7 @@ ErlNifResourceType *geef_ref_iter_type; ErlNifResourceType *geef_object_type; ErlNifResourceType *geef_revwalk_type; ErlNifResourceType *geef_index_type; +ErlNifResourceType *geef_config_type; geef_atoms atoms; @@ -58,6 +60,10 @@ static int load(ErlNifEnv *env, void **priv, ERL_NIF_TERM load_info) geef_index_type = enif_open_resource_type(env, NULL, "index_type", geef_index_free, ERL_NIF_RT_CREATE, NULL); + geef_config_type = enif_open_resource_type(env, NULL, + "config_type", geef_config_free, ERL_NIF_RT_CREATE, NULL); + + if (geef_repository_type == NULL) return -1; @@ -164,6 +170,7 @@ static ErlNifFunc geef_funcs[] = {"repository_get_path", 1, geef_repository_path}, {"repository_get_workdir", 1, geef_repository_workdir}, {"repository_get_odb", 1, geef_repository_odb}, + {"repository_get_config", 1, geef_repository_config}, {"odb_object_exists", 2, geef_odb_exists}, {"odb_write", 3, geef_odb_write}, {"reference_list", 1, geef_reference_list}, @@ -209,6 +216,7 @@ static ErlNifFunc geef_funcs[] = {"index_read_tree", 2, geef_index_read_tree}, {"signature_default", 1, geef_signature_default}, {"revparse_single", 2, geef_revparse_single}, + {"config_set_bool", 3, geef_config_set_bool}, }; ERL_NIF_INIT(geef_nif, geef_funcs, load, NULL, upgrade, unload) diff --git a/c_src/repository.c b/c_src/repository.c index 867e3ee..e83a1a4 100644 --- a/c_src/repository.c +++ b/c_src/repository.c @@ -1,6 +1,7 @@ #include "repository.h" #include "object.h" #include "oid.h" +#include "config.h" #include "geef.h" #include #include @@ -160,6 +161,26 @@ geef_repository_is_bare(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) } +ERL_NIF_TERM +geef_repository_config(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + geef_repository *repo; + geef_config *cfg; + ERL_NIF_TERM term_cfg; + + if (!enif_get_resource(env, argv[0], geef_repository_type, (void **) &repo)) + return enif_make_badarg(env); + + cfg = enif_alloc_resource(geef_config_type, sizeof(geef_config)); + if (git_repository_config(&cfg->config, repo->repo) < 0) + return geef_error(env); + + term_cfg = enif_make_resource(env, cfg); + enif_release_resource(cfg); + + return enif_make_tuple2(env, atoms.ok, term_cfg); +} + ERL_NIF_TERM geef_repository_odb(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { diff --git a/c_src/repository.h b/c_src/repository.h index 1c4b59d..48e8988 100644 --- a/c_src/repository.h +++ b/c_src/repository.h @@ -13,6 +13,7 @@ ERL_NIF_TERM geef_repository_path(ErlNifEnv *env, int argc, const ERL_NIF_TERM a ERL_NIF_TERM geef_repository_workdir(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_repository_is_bare(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_repository_odb(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); +ERL_NIF_TERM geef_repository_config(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_odb_exists(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_odb_write(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); diff --git a/src/geef_nif.erl b/src/geef_nif.erl index 1134adf..89556a7 100644 --- a/src/geef_nif.erl +++ b/src/geef_nif.erl @@ -29,6 +29,10 @@ repository_get_workdir(_Handle) -> repository_get_odb(_Val) -> nif_error(?LINE). +-spec repository_get_config(term()) -> {ok, term()} | {error, term()}. +repository_get_config(_Val) -> + nif_error(?LINE). + -spec repository_init(iolist(), boolean()) -> term(). repository_init(_Path, _Bare) -> nif_error(?LINE). @@ -201,6 +205,10 @@ signature_new(_Name, _Email, _Time) -> revparse_single(_Handle, _Str) -> ?NIF_FN. +-spec config_set_bool(term(), iolist(), boolean()) -> ok | {error, term()}. +config_set_bool(_Handle, _Name, _Val) -> + ?NIF_FN. + nif_error(Line) -> erlang:nif_error({nif_not_loaded,module,?MODULE,line,Line}). diff --git a/src/geef_repo.erl b/src/geef_repo.erl index 6ebf507..a994a58 100644 --- a/src/geef_repo.erl +++ b/src/geef_repo.erl @@ -15,6 +15,7 @@ reference_dwim/2, handle/1, iterator/2]). -export([reference_has_log/2]). -export([reflog_read/2, reflog_delete/2]). +-export([config/1]). -include("geef_records.hrl"). -record(state, {handle}). @@ -79,6 +80,10 @@ references(Pid) -> lookup_object(Pid, Oid) -> gen_server:call(Pid, {lookup_object, Oid}). +%% @doc Get the repository's configuration +config(Pid) -> + gen_server:call(Pid, config). + %% @private -spec iterator(pid(), iolist() | undefined) -> {ok, geef_ref:iterator()} | {error, term()}. iterator(Pid, Regexp) -> @@ -158,6 +163,11 @@ handle_call({reflog_delete, Name}, _From, State = #state{handle=Handle}) -> Reply = geef_nif:reflog_delete(Handle, Name), {reply, Reply, State}; + +handle_call(config, _From, State = #state{handle=Handle}) -> + Reply = handle_config(Handle), + {reply, Reply, State}; + handle_call(stop, _From, State) -> {stop, normal, ok, State}; handle_call(revwalk, _From, State = #state{handle=Handle}) -> @@ -212,3 +222,11 @@ handle_revwalk(Handle) -> Error -> Error end. + +handle_config(Handle) -> + case geef_nif:repository_get_config(Handle) of + {ok, ConfigHandle} -> + geef_config:start_link(ConfigHandle); + Error -> + Error + end. diff --git a/test/repo_test.erl b/test/repo_test.erl index b922dca..cec1570 100644 --- a/test/repo_test.erl +++ b/test/repo_test.erl @@ -50,8 +50,13 @@ index_add_test(Repo) -> ?_assertEqual(Time, Entry1#geef_index_entry.mtime), ?_assertEqual(geef_index:count(Idx), 1)]. +set_logallrefupdates(Repo) -> + {ok, Config} = geef_repo:config(Repo), + ok = geef_config:set(Config, "core.logallrefupdates", true). + ref_test(Repo) -> odb_write_test(Repo), + set_logallrefupdates(Repo), Id = geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"), {ok, _} = geef_ref:create(Repo, "refs/heads/branch", Id, true), {ok, _} = geef_ref:create_symbolic(Repo, "refs/heads/other", "refs/heads/branch", true), @@ -67,9 +72,7 @@ ref_test(Repo) -> ?_assertEqual(<<"branch">>, geef_ref:shorthand(Ref0)), ?_assertEqual(Ref2#geef_reference.target, Id), ?_assertEqual({ok, true}, geef_ref:has_log(Ref0)), - %% temporarily removed as we we're in a bare repo and libgit2 recently started - %% caring about the log append rules - %% ?_assertEqual(1, length(Reflog0)), + ?_assertEqual(1, length(Reflog0)), ?_assertEqual(0, length(Reflog1)), ?_assertEqual(Ref0, Dwimed)].