Initial signature test

This commit is contained in:
Carlos Martín Nieto
2013-06-11 16:34:02 +02:00
parent f8f791296a
commit 9d222df593
8 changed files with 127 additions and 0 deletions

View File

@@ -10,6 +10,7 @@
#include "library.h"
#include "revwalk.h"
#include "index.h"
#include "signature.h"
#include "geef.h"
#include <stdio.h>
#include <string.h>
@@ -178,6 +179,8 @@ static ErlNifFunc geef_funcs[] =
{"index_add", 2, geef_index_add},
{"index_clear", 1, geef_index_clear},
{"index_read_tree", 2, geef_index_read_tree},
{"signature_new", 2, geef_signature_new},
{"signature_new", 3, geef_signature_new},
};
ERL_NIF_INIT(geef_nif, geef_funcs, load, NULL, upgrade, unload)

65
c_src/signature.c Normal file
View File

@@ -0,0 +1,65 @@
#include "geef.h"
#include <string.h>
#include <git2.h>
ERL_NIF_TERM
geef_signature_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
ErlNifBinary name, email;
git_signature *sig;
size_t len;
int error;
unsigned int at;
if (!enif_inspect_iolist_as_binary(env, argv[0], &name))
return enif_make_badarg(env);
if (!enif_inspect_iolist_as_binary(env, argv[1], &email))
return enif_make_badarg(env);
if (argc == 3 && !enif_get_uint(env, argv[2], &at))
return enif_make_badarg(env);
if (!geef_terminate_binary(&name))
return atoms.error;
if (!geef_terminate_binary(&email)) {
enif_release_binary(&name);
return atoms.error;
}
if (argc == 3)
error = git_signature_now(&sig, (char *)name.data, (char *)email.data);
else
error = git_signature_new(&sig, (char *)name.data, (char *)email.data, at, 0);
if (error < 0)
return geef_error(env);
len = strlen(sig->name);
if (!enif_realloc_binary(&name, len))
goto on_error;
memcpy(name.data, sig->name, len);
len = strlen(sig->email);
if (!enif_realloc_binary(&email, len))
goto on_error;
memcpy(email.data, sig->email, len);
git_signature_free(sig);
if (argc == 3)
return enif_make_tuple3(env, atoms.ok, enif_make_binary(env, &name), enif_make_binary(env, &email));
return enif_make_tuple5(env, atoms.ok,
enif_make_binary(env, &name), enif_make_binary(env, &email),
enif_make_ulong(env, sig->when.time), enif_make_uint(env, sig->when.offset));
on_error:
git_signature_free(sig);
enif_release_binary(&name);
enif_release_binary(&email);
return atoms.error;
}

3
c_src/signature.h Normal file
View File

@@ -0,0 +1,3 @@
#include "geef.h"
ERL_NIF_TERM geef_signature_new(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);