Add tag-peeling support

This commit is contained in:
Carlos Martín Nieto
2013-05-30 03:39:51 +02:00
parent f410083711
commit 0e644be825
5 changed files with 69 additions and 0 deletions

View File

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

35
c_src/tag.c Normal file
View File

@@ -0,0 +1,35 @@
#include <git2.h>
#include <string.h>
#include <stdio.h>
#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);
}

6
c_src/tag.h Normal file
View File

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