From d21d2cb9b0930cf46069e0fb12a59b2ebf4c2b5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Wed, 5 Jun 2013 22:15:40 +0200 Subject: [PATCH] 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. --- c_src/tag.c | 10 +++++++++- lib/geef/object.ex | 1 - src/geef_obj.erl | 17 ++++------------- src/geef_records.hrl | 2 +- src/geef_tag.erl | 4 ++-- 5 files changed, 16 insertions(+), 18 deletions(-) diff --git a/c_src/tag.c b/c_src/tag.c index c23243d..e313b3a 100644 --- a/c_src/tag.c +++ b/c_src/tag.c @@ -11,6 +11,7 @@ geef_tag_peel(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { geef_object *obj, *peeled; ERL_NIF_TERM term_peeled; + ErlNifBinary id; if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj)) 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) 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; enif_keep_resource(peeled->repo); term_peeled = enif_make_resource(env, 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); } diff --git a/lib/geef/object.ex b/lib/geef/object.ex index 6cfa61c..7be72a9 100644 --- a/lib/geef/object.ex +++ b/lib/geef/object.ex @@ -14,6 +14,5 @@ defmodule Geef.Object do def lookup(repo, id, type), do: :geef_obj.lookup(repo, id, type) - def id(obj), do: :geef_obj.id(obj) end diff --git a/src/geef_obj.erl b/src/geef_obj.erl index 1cc5710..b6c186a 100644 --- a/src/geef_obj.erl +++ b/src/geef_obj.erl @@ -6,13 +6,13 @@ -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()}. -lookup(Repo, #geef_oid{oid=Oid}) -> +lookup(Repo, Id = #geef_oid{oid=Oid}) -> case geef_repo:lookup_object(Repo, Oid) of {ok, Type, Handle} -> - {ok, #geef_object{type=Type, handle=Handle}}; + {ok, #geef_object{type=Type, id=Id, handle=Handle}}; {error, Err} -> {error, Err} end; @@ -29,15 +29,6 @@ lookup(Repo, Id, Type) -> {error, Err} 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). lookup_test() -> @@ -52,6 +43,6 @@ id_test() -> Sha = <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>, Id = geef_oid:parse(Sha), {ok, Commit = #geef_object{type=commit}} = lookup(Repo, Sha), - Id = id(Commit). + Id = Commit#geef_object.id. -endif. diff --git a/src/geef_records.hrl b/src/geef_records.hrl index 389c8a9..ba4f835 100644 --- a/src/geef_records.hrl +++ b/src/geef_records.hrl @@ -1,6 +1,6 @@ -record(geef_reference, {handle, name :: binary(), type :: atom(), target :: binary() | geef_oid()}). -record(geef_oid, {oid}). --record(geef_object, {type :: atom(), handle}). +-record(geef_object, {type :: atom(), id :: geef_oid(), handle}). -record(geef_index_entry, {ctime :: non_neg_integer(), mtime :: non_neg_integer(), dev :: non_neg_integer(), ino :: non_neg_integer(), diff --git a/src/geef_tag.erl b/src/geef_tag.erl index 33ab2a1..3112e39 100644 --- a/src/geef_tag.erl +++ b/src/geef_tag.erl @@ -15,8 +15,8 @@ lookup(Repo, Id) -> -spec peel(geef_object()) -> {ok, geef_object()} | {error, term()}. peel(#geef_object{type=tag, handle=Handle}) -> case geef_nif:tag_peel(Handle) of - {ok, Type, PeeledHandle} -> - {ok, #geef_object{type=Type, handle=PeeledHandle}}; + {ok, Type, Oid, PeeledHandle} -> + {ok, #geef_object{type=Type, id=#geef_oid{oid=Oid}, handle=PeeledHandle}}; Err = {error, _} -> Err end.