From 5a58abc4a03ba48b2e24bb5b0f349a8d990786db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Fri, 25 Jan 2013 15:22:14 +0100 Subject: [PATCH] Let geef_ref:target/1 handle both oid and symrefs --- c_src/reference.c | 21 +++++++++++++++++---- src/geef_ref.erl | 2 +- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/c_src/reference.c b/c_src/reference.c index f29a4c4..7fd59d2 100644 --- a/c_src/reference.c +++ b/c_src/reference.c @@ -164,15 +164,28 @@ geef_reference_target(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 (git_reference_type(ref->ref) == GIT_REF_OID) { + const git_oid *id; + id = git_reference_target(ref->ref); - if (geef_oid_bin(&bin, id) < 0) - return atoms.error; + if (geef_oid_bin(&bin, id) < 0) + return atoms.error; + } else { + const char *name; + size_t len; + + name = git_reference_symbolic_target(ref->ref); + len = strlen(name); + + if (enif_alloc_binary(len, &bin) < 0) + return atoms.error; + + memcpy(bin.data, name, len + 1); + } return enif_make_binary(env, &bin); } diff --git a/src/geef_ref.erl b/src/geef_ref.erl index bf67a45..eb4d70a 100644 --- a/src/geef_ref.erl +++ b/src/geef_ref.erl @@ -28,5 +28,5 @@ resolve(#ref{handle=Handle}) -> end. -spec target(ref()) -> binary(). -target(#ref{handle=Handle, type=oid}) -> +target(#ref{handle=Handle}) -> geef:reference_target(Handle).