Wrap git_revparse_single

This commit is contained in:
Carlos Martín Nieto
2013-09-05 15:11:32 +02:00
parent 72078cb099
commit 21464aeece
8 changed files with 101 additions and 2 deletions

View File

@@ -11,6 +11,7 @@
#include "revwalk.h"
#include "index.h"
#include "signature.h"
#include "revparse.h"
#include "geef.h"
#include <stdio.h>
#include <string.h>
@@ -186,6 +187,7 @@ static ErlNifFunc geef_funcs[] =
{"index_read_tree", 2, geef_index_read_tree},
{"signature_new", 2, geef_signature_new},
{"signature_new", 3, geef_signature_new},
{"revparse_single", 2, geef_revparse_single},
};
ERL_NIF_INIT(geef_nif, geef_funcs, load, NULL, upgrade, unload)

View File

@@ -71,7 +71,6 @@ geef_object_lookup(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
return geef_error(env);
}
term_obj = enif_make_resource(env, obj);
enif_release_resource(obj);

48
c_src/revparse.c Normal file
View File

@@ -0,0 +1,48 @@
#include <git2.h>
#include "geef.h"
#include "repository.h"
#include "oid.h"
#include "object.h"
#include "revparse.h"
ERL_NIF_TERM
geef_revparse_single(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary bin, id;
geef_repository *repo;
geef_object *obj;
ERL_NIF_TERM type, term_obj;
if (!enif_get_resource(env, argv[0], geef_repository_type, (void **) &repo))
return enif_make_badarg(env);
if (!enif_inspect_iolist_as_binary(env, argv[1], &bin))
return enif_make_badarg(env);
if (geef_terminate_binary(&bin) < 0)
return geef_oom(env);
obj = enif_alloc_resource(geef_object_type, sizeof(geef_object));
if (!obj)
return geef_oom(env);
if (git_revparse_single(&obj->obj, repo->repo, (char *) bin.data) < 0) {
enif_release_binary(&bin);
enif_release_resource(obj);
return geef_error(env);
}
type = geef_object_type2atom(git_object_type(obj->obj));
if (geef_oid_bin(&id, git_object_id(obj->obj)) < 0)
return geef_oom(env);
term_obj = enif_make_resource(env, obj);
enif_release_resource(obj);
obj->repo = repo;
enif_keep_resource(repo);
return enif_make_tuple4(env, atoms.ok, term_obj, type, enif_make_binary(env, &id));
}

8
c_src/revparse.h Normal file
View File

@@ -0,0 +1,8 @@
#ifndef GEEF_REVPARSE_H
#define GEEF_REVPARSE_H
#include "erl_nif.h"
ERL_NIF_TERM geef_revparse_single(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
#endif