Add reference_type()

This commit is contained in:
Carlos Martín Nieto
2013-01-23 06:16:49 +01:00
parent 71eea735d2
commit 7ac46fbf5e
6 changed files with 47 additions and 7 deletions

View File

@@ -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},
};

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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} ->

View File

@@ -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).