From 7ac46fbf5e57c994e1f7473baa0a45d543e870b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Wed, 23 Jan 2013 06:16:49 +0100 Subject: [PATCH] Add reference_type() --- c_src/geef.c | 3 +++ c_src/geef.h | 12 +++++++----- c_src/reference.c | 27 +++++++++++++++++++++++++++ c_src/reference.h | 1 + src/geef.erl | 5 ++++- src/reference.erl | 6 +++++- 6 files changed, 47 insertions(+), 7 deletions(-) diff --git a/c_src/geef.c b/c_src/geef.c index 75d98f4..47f32d2 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -40,6 +40,8 @@ static int load(ErlNifEnv *env, void **priv, ERL_NIF_TERM load_info) atoms.true = enif_make_atom(env, "true"); atoms.false = enif_make_atom(env, "false"); atoms.repository = enif_make_atom(env, "repository"); + atoms.oid = enif_make_atom(env, "oid"); + atoms.symbolic = enif_make_atom(env, "symbolic"); return 0; } @@ -79,6 +81,7 @@ static ErlNifFunc geef_funcs[] = {"reference_lookup", 2, geef_reference_lookup}, {"reference_resolve", 1, geef_reference_resolve}, {"reference_id", 1, geef_reference_id}, + {"reference_type", 1, geef_reference_type}, {"oid_fmt", 1, geef_oid_fmt}, {"oid_parse", 1, geef_oid_parse}, }; diff --git a/c_src/geef.h b/c_src/geef.h index c17048c..5dfda32 100644 --- a/c_src/geef.h +++ b/c_src/geef.h @@ -6,11 +6,13 @@ ERL_NIF_TERM geef_error(ErlNifEnv *env); typedef struct { - ERL_NIF_TERM ok; - ERL_NIF_TERM error; - ERL_NIF_TERM true; - ERL_NIF_TERM false; - ERL_NIF_TERM repository; + ERL_NIF_TERM ok; + ERL_NIF_TERM error; + ERL_NIF_TERM true; + ERL_NIF_TERM false; + ERL_NIF_TERM repository; + ERL_NIF_TERM oid; + ERL_NIF_TERM symbolic; } geef_atoms; extern geef_atoms atoms; diff --git a/c_src/reference.c b/c_src/reference.c index 46af246..12b8155 100644 --- a/c_src/reference.c +++ b/c_src/reference.c @@ -210,3 +210,30 @@ geef_reference_to_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) return enif_make_binary(env, &bin); } + +ERL_NIF_TERM +geef_reference_type(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + geef_ref *ref; + int type; + ERL_NIF_TERM term_type; + + if (!enif_get_resource(env, argv[0], geef_ref_type, (void **) &ref)) + return enif_make_badarg(env); + + type = git_reference_type(ref->ref); + + switch (type) { + case GIT_REF_OID: + term_type = atoms.oid; + break; + case GIT_REF_SYMBOLIC: + term_type = atoms.symbolic; + break; + default: + term_type = atoms.error; + break; + } + + return term_type; +} diff --git a/c_src/reference.h b/c_src/reference.h index 88f4dcf..436306b 100644 --- a/c_src/reference.h +++ b/c_src/reference.h @@ -16,6 +16,7 @@ ERL_NIF_TERM geef_reference_glob(ErlNifEnv *env, int argc, const ERL_NIF_TERM ar 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[]); +ERL_NIF_TERM geef_reference_type(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 ac9c95f..482af31 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, - reference_id/1, odb_object_exists/2]). + reference_id/1, reference_type/1, odb_object_exists/2]). -export([oid_fmt/1, oid_parse/1]). @@ -47,6 +47,9 @@ reference_id(_Handle) -> reference_resolve(_Handle) -> nif_error(?LINE). +reference_type(_Handle) -> + nif_error(?LINE). + repository(Path) -> case repository_open(Path) of {ok, Handle} -> diff --git a/src/reference.erl b/src/reference.erl index 00450a2..642c328 100644 --- a/src/reference.erl +++ b/src/reference.erl @@ -1,5 +1,5 @@ -module(reference, [Handle]). --export([resolve/0, id/0]). +-export([resolve/0, id/0, type/0]). resolve() -> case geef:reference_resolve(Handle) of @@ -12,3 +12,7 @@ resolve() -> -spec id() -> binary(). id() -> geef:reference_id(Handle). + +-spec type() -> oid | symbolic | error. +type() -> + geef:reference_type(Handle).