From 0e644be8257f2ce627249b2cf5dce5bdb3fe5fed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Thu, 30 May 2013 03:39:51 +0200 Subject: [PATCH] Add tag-peeling support --- c_src/geef.c | 2 ++ c_src/tag.c | 35 +++++++++++++++++++++++++++++++++++ c_src/tag.h | 6 ++++++ src/geef_nif.erl | 4 ++++ src/geef_tag.erl | 22 ++++++++++++++++++++++ 5 files changed, 69 insertions(+) create mode 100644 c_src/tag.c create mode 100644 c_src/tag.h create mode 100644 src/geef_tag.erl diff --git a/c_src/geef.c b/c_src/geef.c index 5eca500..8a1dea5 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -6,6 +6,7 @@ #include "commit.h" #include "tree.h" #include "blob.h" +#include "tag.h" #include "library.h" #include "revwalk.h" #include "index.h" @@ -162,6 +163,7 @@ static ErlNifFunc geef_funcs[] = {"tree_bypath", 2, geef_tree_bypath}, {"blob_size", 1, geef_blob_size}, {"blob_content", 1, geef_blob_content}, + {"tag_peel", 1, geef_tag_peel}, {"library_version", 0, geef_library_version}, {"revwalk_new", 1, geef_revwalk_new}, {"revwalk_push", 3, geef_revwalk_push}, diff --git a/c_src/tag.c b/c_src/tag.c new file mode 100644 index 0000000..c23243d --- /dev/null +++ b/c_src/tag.c @@ -0,0 +1,35 @@ +#include +#include +#include + +#include "oid.h" +#include "geef.h" +#include "tree.h" + +ERL_NIF_TERM +geef_tag_peel(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + geef_object *obj, *peeled; + ERL_NIF_TERM term_peeled; + + if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj)) + return enif_make_badarg(env); + + if (git_object_type(obj->obj) != GIT_OBJ_TAG) + return enif_make_badarg(env); + + peeled = enif_alloc_resource(geef_object_type, sizeof(geef_object)); + if (!obj) + return geef_oom(env); + + if (git_tag_peel(&peeled->obj, (git_tag *)obj->obj) < 0) + return geef_error(env); + + peeled->repo = obj->repo; + enif_keep_resource(peeled->repo); + + term_peeled = enif_make_resource(env, peeled); + enif_release_resource(peeled); + + return enif_make_tuple3(env, atoms.ok, geef_object_type2atom(git_object_type(peeled->obj)), term_peeled); +} diff --git a/c_src/tag.h b/c_src/tag.h new file mode 100644 index 0000000..9d3768e --- /dev/null +++ b/c_src/tag.h @@ -0,0 +1,6 @@ +#ifndef GEEF_TAG_H +#define GEEF_TAG_H + +ERL_NIF_TERM geef_tag_peel(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); + +#endif diff --git a/src/geef_nif.erl b/src/geef_nif.erl index 44f8295..dba27bc 100644 --- a/src/geef_nif.erl +++ b/src/geef_nif.erl @@ -101,6 +101,10 @@ blob_size(_ObjHandle) -> blob_content(_ObjHandle) -> nif_error(?LINE). +-spec tag_peel(term()) -> {ok, atom(), term()} | {error, term()}. +tag_peel(_Tag) -> + ?NIF_FN. + -spec library_version() -> {integer, integer, integer}. library_version() -> nif_error(?LINE). diff --git a/src/geef_tag.erl b/src/geef_tag.erl new file mode 100644 index 0000000..33ab2a1 --- /dev/null +++ b/src/geef_tag.erl @@ -0,0 +1,22 @@ +-module(geef_tag). + +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). +-endif. + +-export([lookup/2, peel/1]). + +-include("geef_records.hrl"). + +-spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}. +lookup(Repo, Id) -> + geef_object:lookup(Repo, Id, tag). + +-spec peel(geef_object()) -> {ok, geef_object()} | {error, term()}. +peel(#geef_object{type=tag, handle=Handle}) -> + case geef_nif:tag_peel(Handle) of + {ok, Type, PeeledHandle} -> + {ok, #geef_object{type=Type, handle=PeeledHandle}}; + Err = {error, _} -> + Err + end.