Keep an object's id in the record
We have the information there anyway, so don't make us allocate a new binary every time.
This commit is contained in:
10
c_src/tag.c
10
c_src/tag.c
@@ -11,6 +11,7 @@ geef_tag_peel(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
|||||||
{
|
{
|
||||||
geef_object *obj, *peeled;
|
geef_object *obj, *peeled;
|
||||||
ERL_NIF_TERM term_peeled;
|
ERL_NIF_TERM term_peeled;
|
||||||
|
ErlNifBinary id;
|
||||||
|
|
||||||
if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj))
|
if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj))
|
||||||
return enif_make_badarg(env);
|
return enif_make_badarg(env);
|
||||||
@@ -25,11 +26,18 @@ geef_tag_peel(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
|||||||
if (git_tag_peel(&peeled->obj, (git_tag *)obj->obj) < 0)
|
if (git_tag_peel(&peeled->obj, (git_tag *)obj->obj) < 0)
|
||||||
return geef_error(env);
|
return geef_error(env);
|
||||||
|
|
||||||
|
if(geef_oid_bin(&id, git_object_id(obj->obj)) < 0) {
|
||||||
|
enif_release_resource(peeled);
|
||||||
|
git_object_free(obj->obj);
|
||||||
|
return geef_oom(env);
|
||||||
|
}
|
||||||
|
|
||||||
peeled->repo = obj->repo;
|
peeled->repo = obj->repo;
|
||||||
enif_keep_resource(peeled->repo);
|
enif_keep_resource(peeled->repo);
|
||||||
|
|
||||||
term_peeled = enif_make_resource(env, peeled);
|
term_peeled = enif_make_resource(env, peeled);
|
||||||
enif_release_resource(peeled);
|
enif_release_resource(peeled);
|
||||||
|
|
||||||
return enif_make_tuple3(env, atoms.ok, geef_object_type2atom(git_object_type(peeled->obj)), term_peeled);
|
return enif_make_tuple4(env, atoms.ok, geef_object_type2atom(git_object_type(peeled->obj)),
|
||||||
|
enif_make_binary(env, &id), term_peeled);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,5 @@ defmodule Geef.Object do
|
|||||||
|
|
||||||
|
|
||||||
def lookup(repo, id, type), do: :geef_obj.lookup(repo, id, type)
|
def lookup(repo, id, type), do: :geef_obj.lookup(repo, id, type)
|
||||||
def id(obj), do: :geef_obj.id(obj)
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,13 +6,13 @@
|
|||||||
|
|
||||||
-include("geef_records.hrl").
|
-include("geef_records.hrl").
|
||||||
|
|
||||||
-export([lookup/2, lookup/3, id/1]).
|
-export([lookup/2, lookup/3]).
|
||||||
|
|
||||||
-spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}.
|
-spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}.
|
||||||
lookup(Repo, #geef_oid{oid=Oid}) ->
|
lookup(Repo, Id = #geef_oid{oid=Oid}) ->
|
||||||
case geef_repo:lookup_object(Repo, Oid) of
|
case geef_repo:lookup_object(Repo, Oid) of
|
||||||
{ok, Type, Handle} ->
|
{ok, Type, Handle} ->
|
||||||
{ok, #geef_object{type=Type, handle=Handle}};
|
{ok, #geef_object{type=Type, id=Id, handle=Handle}};
|
||||||
{error, Err} ->
|
{error, Err} ->
|
||||||
{error, Err}
|
{error, Err}
|
||||||
end;
|
end;
|
||||||
@@ -29,15 +29,6 @@ lookup(Repo, Id, Type) ->
|
|||||||
{error, Err}
|
{error, Err}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
-spec id(geef_object()) -> {ok, geef_oid()} | {error, term()}.
|
|
||||||
id(#geef_object{handle=Handle}) ->
|
|
||||||
case geef_nif:object_id(Handle) of
|
|
||||||
{ok, Oid} ->
|
|
||||||
#geef_oid{oid=Oid};
|
|
||||||
Other ->
|
|
||||||
Other
|
|
||||||
end.
|
|
||||||
|
|
||||||
-ifdef(TEST).
|
-ifdef(TEST).
|
||||||
|
|
||||||
lookup_test() ->
|
lookup_test() ->
|
||||||
@@ -52,6 +43,6 @@ id_test() ->
|
|||||||
Sha = <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>,
|
Sha = <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>,
|
||||||
Id = geef_oid:parse(Sha),
|
Id = geef_oid:parse(Sha),
|
||||||
{ok, Commit = #geef_object{type=commit}} = lookup(Repo, Sha),
|
{ok, Commit = #geef_object{type=commit}} = lookup(Repo, Sha),
|
||||||
Id = id(Commit).
|
Id = Commit#geef_object.id.
|
||||||
|
|
||||||
-endif.
|
-endif.
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
-record(geef_reference, {handle, name :: binary(), type :: atom(), target :: binary() | geef_oid()}).
|
-record(geef_reference, {handle, name :: binary(), type :: atom(), target :: binary() | geef_oid()}).
|
||||||
-record(geef_oid, {oid}).
|
-record(geef_oid, {oid}).
|
||||||
-record(geef_object, {type :: atom(), handle}).
|
-record(geef_object, {type :: atom(), id :: geef_oid(), handle}).
|
||||||
-record(geef_index_entry,
|
-record(geef_index_entry,
|
||||||
{ctime :: non_neg_integer(), mtime :: non_neg_integer(),
|
{ctime :: non_neg_integer(), mtime :: non_neg_integer(),
|
||||||
dev :: non_neg_integer(), ino :: non_neg_integer(),
|
dev :: non_neg_integer(), ino :: non_neg_integer(),
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ lookup(Repo, Id) ->
|
|||||||
-spec peel(geef_object()) -> {ok, geef_object()} | {error, term()}.
|
-spec peel(geef_object()) -> {ok, geef_object()} | {error, term()}.
|
||||||
peel(#geef_object{type=tag, handle=Handle}) ->
|
peel(#geef_object{type=tag, handle=Handle}) ->
|
||||||
case geef_nif:tag_peel(Handle) of
|
case geef_nif:tag_peel(Handle) of
|
||||||
{ok, Type, PeeledHandle} ->
|
{ok, Type, Oid, PeeledHandle} ->
|
||||||
{ok, #geef_object{type=Type, handle=PeeledHandle}};
|
{ok, #geef_object{type=Type, id=#geef_oid{oid=Oid}, handle=PeeledHandle}};
|
||||||
Err = {error, _} ->
|
Err = {error, _} ->
|
||||||
Err
|
Err
|
||||||
end.
|
end.
|
||||||
|
|||||||
Reference in New Issue
Block a user