diff --git a/c_src/geef.c b/c_src/geef.c index 0bc7e27..d6639ed 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -77,6 +77,7 @@ static ErlNifFunc geef_funcs[] = {"reference_glob", 2, geef_reference_glob}, {"reference_lookup", 2, geef_reference_lookup}, {"reference_resolve", 1, geef_reference_resolve}, + {"reference_id", 1, geef_reference_id}, }; ERL_NIF_INIT(geef, geef_funcs, load, NULL, NULL, unload) diff --git a/c_src/reference.c b/c_src/reference.c index 05e7dd0..4ef2b3a 100644 --- a/c_src/reference.c +++ b/c_src/reference.c @@ -160,6 +160,33 @@ geef_reference_glob(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) 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 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); } - if (!enif_alloc_binary(GIT_OID_RAWSZ, &bin)) + if (bin_from_oid(&bin, &id) < 0) return atoms.error; - memcpy(bin.data, &id, GIT_OID_RAWSZ); return enif_make_binary(env, &bin); } diff --git a/c_src/reference.h b/c_src/reference.h index e110b39..88f4dcf 100644 --- a/c_src/reference.h +++ b/c_src/reference.h @@ -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_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_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); void geef_ref_free(ErlNifEnv *env, void *cd); diff --git a/src/geef.erl b/src/geef.erl index 1162f17..0eda22a 100644 --- a/src/geef.erl +++ b/src/geef.erl @@ -2,7 +2,7 @@ -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, 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). hex_to_raw(_Val) -> @@ -38,6 +38,9 @@ reference_glob(_Repo, _Glob) -> reference_lookup(_Repo, _Refname) -> nif_error(?LINE). +reference_id(_Handle) -> + nif_error(?LINE). + reference_resolve(_Handle) -> nif_error(?LINE). diff --git a/src/reference.erl b/src/reference.erl index 04fc5c5..00450a2 100644 --- a/src/reference.erl +++ b/src/reference.erl @@ -1,5 +1,5 @@ -module(reference, [Handle]). --export([resolve/0]). +-export([resolve/0, id/0]). resolve() -> case geef:reference_resolve(Handle) of @@ -8,3 +8,7 @@ resolve() -> Other -> Other end. + +-spec id() -> binary(). +id() -> + geef:reference_id(Handle).