diff --git a/c_src/geef.c b/c_src/geef.c index 6488c81..5eca500 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -151,6 +151,7 @@ static ErlNifFunc geef_funcs[] = {"reference_resolve", 1, geef_reference_resolve}, {"reference_target", 1, geef_reference_target}, {"reference_type", 1, geef_reference_type}, + {"reference_name", 1, geef_reference_name}, {"reference_create", 5, geef_reference_create}, {"oid_fmt", 1, geef_oid_fmt}, {"oid_parse", 1, geef_oid_parse}, diff --git a/c_src/reference.c b/c_src/reference.c index 4a0901e..4919e17 100644 --- a/c_src/reference.c +++ b/c_src/reference.c @@ -230,6 +230,28 @@ geef_reference_type(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) return term_type; } +ERL_NIF_TERM +geef_reference_name(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + geef_ref *ref; + const char *name; + ErlNifBinary bin; + size_t len; + + if (!enif_get_resource(env, argv[0], geef_ref_type, (void **) &ref)) + return enif_make_badarg(env); + + name = git_reference_name(ref->ref); + len = strlen(name); + + if (enif_alloc_binary(len, &bin) < 0) + return geef_oom(env); + + memcpy(bin.data, name, len + 1); + + return enif_make_binary(env, &bin); +} + ERL_NIF_TERM geef_reference_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { diff --git a/c_src/reference.h b/c_src/reference.h index 241bd20..51594a2 100644 --- a/c_src/reference.h +++ b/c_src/reference.h @@ -17,6 +17,7 @@ ERL_NIF_TERM geef_reference_lookup(ErlNifEnv *env, int argc, const ERL_NIF_TERM ERL_NIF_TERM geef_reference_resolve(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_reference_target(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_reference_type(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); +ERL_NIF_TERM geef_reference_name(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_reference_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); void geef_ref_free(ErlNifEnv *env, void *cd); diff --git a/src/geef_nif.erl b/src/geef_nif.erl index 47d98d0..44f8295 100644 --- a/src/geef_nif.erl +++ b/src/geef_nif.erl @@ -59,6 +59,9 @@ reference_resolve(_Handle) -> reference_type(_Handle) -> nif_error(?LINE). +reference_name(_Handle) -> + nif_error(?LINE). + odb_object_exists(_Val, _Val) -> nif_error(?LINE). diff --git a/src/geef_records.hrl b/src/geef_records.hrl index 3037ec5..748c5ec 100644 --- a/src/geef_records.hrl +++ b/src/geef_records.hrl @@ -1,4 +1,4 @@ --record(geef_ref, {handle, type :: atom(), target :: binary() | geef_oid()}). +-record(geef_ref, {handle, name :: binary(), type :: atom(), target :: binary() | geef_oid()}). -record(geef_odb, {handle}). -record(geef_oid, {oid}). -record(geef_object, {type :: atom(), handle}). diff --git a/src/geef_ref.erl b/src/geef_ref.erl index 876e0a2..df6a001 100644 --- a/src/geef_ref.erl +++ b/src/geef_ref.erl @@ -1,11 +1,11 @@ -module(geef_ref). --export([lookup/2, resolve/1, create/4, target/1]). +-export([lookup/2, resolve/1, create/4, name/1, type/1, target/1]). -include("geef_records.hrl"). --spec new(term()) -> geef_ref(). -new(Handle) -> +-spec new(binary(), term()) -> geef_ref(). +new(Name, Handle) -> Type = geef_nif:reference_type(Handle), Bin = geef_nif:reference_target(Handle), Target = case Type of @@ -14,19 +14,20 @@ new(Handle) -> oid -> #geef_oid{oid=Bin} end, - #geef_ref{handle=Handle, type=Type, target=Target}. + #geef_ref{handle=Handle, name=Name, type=Type, target=Target}. -spec create(pid(), iolist(), geef_oid() | binary(), boolean()) -> {ok, geef_ref()} | {error, term()} . create(Repo, Refname, Target, Force) -> {ok, Ref} = geef_repo:create_reference(Repo, Refname, Target, Force), - {ok, new(Ref)}. + {ok, new(Refname, Ref)}. -spec lookup(pid(), iolist()) -> {ok, geef_ref()} | {error, term()}. lookup(Repo, Refname) -> - case geef_repo:lookup_reference(Repo, Refname) of + Name = iolist_to_binary(Refname), + case geef_repo:lookup_reference(Repo, Name) of {ok, Ref} -> - {ok, new(Ref)}; + {ok, new(Name, Ref)}; Other -> Other end. @@ -35,7 +36,8 @@ lookup(Repo, Refname) -> resolve(#geef_ref{handle=Handle}) -> case geef_nif:reference_resolve(Handle) of {ok, Ref} -> - {ok, new(Ref)}; + {ok, Name} = geef_nif:reference_name(Ref), + {ok, new(Name, Ref)}; Other -> Other end. @@ -43,3 +45,11 @@ resolve(#geef_ref{handle=Handle}) -> -spec target(geef_ref()) -> {geef_oid(), binary()}. target(#geef_ref{target=Target}) -> Target. + +-spec type(geef_ref()) -> symbolic | oid. +type(#geef_ref{type=Type}) -> + Type. + +-spec name(geef_ref()) -> binary(). +name(#geef_ref{name=Name}) -> + Name.