reference: add id() to get the sha

This commit is contained in:
Carlos Martín Nieto
2013-01-21 15:23:21 +01:00
parent 9e8052c6b0
commit 880d7b76fb
5 changed files with 39 additions and 4 deletions

View File

@@ -77,6 +77,7 @@ static ErlNifFunc geef_funcs[] =
{"reference_glob", 2, geef_reference_glob}, {"reference_glob", 2, geef_reference_glob},
{"reference_lookup", 2, geef_reference_lookup}, {"reference_lookup", 2, geef_reference_lookup},
{"reference_resolve", 1, geef_reference_resolve}, {"reference_resolve", 1, geef_reference_resolve},
{"reference_id", 1, geef_reference_id},
}; };
ERL_NIF_INIT(geef, geef_funcs, load, NULL, NULL, unload) ERL_NIF_INIT(geef, geef_funcs, load, NULL, NULL, unload)

View File

@@ -160,6 +160,33 @@ geef_reference_glob(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
return data.list; return data.list;
} }
static int bin_from_oid(ErlNifBinary *bin, const git_oid *id)
{
if (!enif_alloc_binary(GIT_OID_RAWSZ, bin))
return -1;
memcpy(bin->data, id, GIT_OID_RAWSZ);
return 0;
}
ERL_NIF_TERM
geef_reference_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
geef_ref *ref;
ErlNifBinary bin;
const git_oid *id;
if (!enif_get_resource(env, argv[0], geef_ref_type, (void **) &ref))
return enif_make_badarg(env);
id = git_reference_target(ref->ref);
if (bin_from_oid(&bin, id) < 0)
return atoms.error;
return enif_make_binary(env, &bin);
}
ERL_NIF_TERM ERL_NIF_TERM
geef_reference_to_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) geef_reference_to_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{ {
@@ -186,9 +213,8 @@ geef_reference_to_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
return geef_error(env); return geef_error(env);
} }
if (!enif_alloc_binary(GIT_OID_RAWSZ, &bin)) if (bin_from_oid(&bin, &id) < 0)
return atoms.error; return atoms.error;
memcpy(bin.data, &id, GIT_OID_RAWSZ);
return enif_make_binary(env, &bin); return enif_make_binary(env, &bin);
} }

View File

@@ -15,6 +15,7 @@ ERL_NIF_TERM geef_reference_to_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM a
ERL_NIF_TERM geef_reference_glob(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_reference_glob(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM geef_reference_lookup(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_reference_lookup(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_resolve(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
ERL_NIF_TERM geef_reference_id(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);

View File

@@ -2,7 +2,7 @@
-export([hex_to_raw/1, repository/1, repository_get_path/1, repository_get_odb/1, -export([hex_to_raw/1, repository/1, repository_get_path/1, repository_get_odb/1,
repository_init/2, repository_is_bare/1, repository_get_workdir/1, reference_list/1, repository_init/2, repository_is_bare/1, repository_get_workdir/1, reference_list/1,
reference_to_id/2, reference_glob/2, reference_lookup/2, reference_resolve/1, reference_to_id/2, reference_glob/2, reference_lookup/2, reference_resolve/1,
odb_object_exists/2]). reference_id/1, odb_object_exists/2]).
-on_load(load_enif/0). -on_load(load_enif/0).
hex_to_raw(_Val) -> hex_to_raw(_Val) ->
@@ -38,6 +38,9 @@ reference_glob(_Repo, _Glob) ->
reference_lookup(_Repo, _Refname) -> reference_lookup(_Repo, _Refname) ->
nif_error(?LINE). nif_error(?LINE).
reference_id(_Handle) ->
nif_error(?LINE).
reference_resolve(_Handle) -> reference_resolve(_Handle) ->
nif_error(?LINE). nif_error(?LINE).

View File

@@ -1,5 +1,5 @@
-module(reference, [Handle]). -module(reference, [Handle]).
-export([resolve/0]). -export([resolve/0, id/0]).
resolve() -> resolve() ->
case geef:reference_resolve(Handle) of case geef:reference_resolve(Handle) of
@@ -8,3 +8,7 @@ resolve() ->
Other -> Other ->
Other Other
end. end.
-spec id() -> binary().
id() ->
geef:reference_id(Handle).