Keep the reference name as part of the record
This commit is contained in:
@@ -151,6 +151,7 @@ static ErlNifFunc geef_funcs[] =
|
|||||||
{"reference_resolve", 1, geef_reference_resolve},
|
{"reference_resolve", 1, geef_reference_resolve},
|
||||||
{"reference_target", 1, geef_reference_target},
|
{"reference_target", 1, geef_reference_target},
|
||||||
{"reference_type", 1, geef_reference_type},
|
{"reference_type", 1, geef_reference_type},
|
||||||
|
{"reference_name", 1, geef_reference_name},
|
||||||
{"reference_create", 5, geef_reference_create},
|
{"reference_create", 5, geef_reference_create},
|
||||||
{"oid_fmt", 1, geef_oid_fmt},
|
{"oid_fmt", 1, geef_oid_fmt},
|
||||||
{"oid_parse", 1, geef_oid_parse},
|
{"oid_parse", 1, geef_oid_parse},
|
||||||
|
|||||||
@@ -230,6 +230,28 @@ geef_reference_type(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
|||||||
return term_type;
|
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
|
ERL_NIF_TERM
|
||||||
geef_reference_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
geef_reference_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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_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_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_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[]);
|
ERL_NIF_TERM geef_reference_create(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
|
||||||
|
|
||||||
void geef_ref_free(ErlNifEnv *env, void *cd);
|
void geef_ref_free(ErlNifEnv *env, void *cd);
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ reference_resolve(_Handle) ->
|
|||||||
reference_type(_Handle) ->
|
reference_type(_Handle) ->
|
||||||
nif_error(?LINE).
|
nif_error(?LINE).
|
||||||
|
|
||||||
|
reference_name(_Handle) ->
|
||||||
|
nif_error(?LINE).
|
||||||
|
|
||||||
odb_object_exists(_Val, _Val) ->
|
odb_object_exists(_Val, _Val) ->
|
||||||
nif_error(?LINE).
|
nif_error(?LINE).
|
||||||
|
|
||||||
|
|||||||
@@ -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_odb, {handle}).
|
||||||
-record(geef_oid, {oid}).
|
-record(geef_oid, {oid}).
|
||||||
-record(geef_object, {type :: atom(), handle}).
|
-record(geef_object, {type :: atom(), handle}).
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
-module(geef_ref).
|
-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").
|
-include("geef_records.hrl").
|
||||||
|
|
||||||
-spec new(term()) -> geef_ref().
|
-spec new(binary(), term()) -> geef_ref().
|
||||||
new(Handle) ->
|
new(Name, Handle) ->
|
||||||
Type = geef_nif:reference_type(Handle),
|
Type = geef_nif:reference_type(Handle),
|
||||||
Bin = geef_nif:reference_target(Handle),
|
Bin = geef_nif:reference_target(Handle),
|
||||||
Target = case Type of
|
Target = case Type of
|
||||||
@@ -14,19 +14,20 @@ new(Handle) ->
|
|||||||
oid ->
|
oid ->
|
||||||
#geef_oid{oid=Bin}
|
#geef_oid{oid=Bin}
|
||||||
end,
|
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()}
|
-spec create(pid(), iolist(), geef_oid() | binary(), boolean()) -> {ok, geef_ref()} | {error, term()}
|
||||||
.
|
.
|
||||||
create(Repo, Refname, Target, Force) ->
|
create(Repo, Refname, Target, Force) ->
|
||||||
{ok, Ref} = geef_repo:create_reference(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()}.
|
-spec lookup(pid(), iolist()) -> {ok, geef_ref()} | {error, term()}.
|
||||||
lookup(Repo, Refname) ->
|
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, Ref} ->
|
||||||
{ok, new(Ref)};
|
{ok, new(Name, Ref)};
|
||||||
Other ->
|
Other ->
|
||||||
Other
|
Other
|
||||||
end.
|
end.
|
||||||
@@ -35,7 +36,8 @@ lookup(Repo, Refname) ->
|
|||||||
resolve(#geef_ref{handle=Handle}) ->
|
resolve(#geef_ref{handle=Handle}) ->
|
||||||
case geef_nif:reference_resolve(Handle) of
|
case geef_nif:reference_resolve(Handle) of
|
||||||
{ok, Ref} ->
|
{ok, Ref} ->
|
||||||
{ok, new(Ref)};
|
{ok, Name} = geef_nif:reference_name(Ref),
|
||||||
|
{ok, new(Name, Ref)};
|
||||||
Other ->
|
Other ->
|
||||||
Other
|
Other
|
||||||
end.
|
end.
|
||||||
@@ -43,3 +45,11 @@ resolve(#geef_ref{handle=Handle}) ->
|
|||||||
-spec target(geef_ref()) -> {geef_oid(), binary()}.
|
-spec target(geef_ref()) -> {geef_oid(), binary()}.
|
||||||
target(#geef_ref{target=Target}) ->
|
target(#geef_ref{target=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.
|
||||||
|
|||||||
Reference in New Issue
Block a user