From 125e132af9bc3950413b4bee721e9e83d8cffac1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Sat, 30 Mar 2013 14:19:05 +0100 Subject: [PATCH] Add geef_odb:write --- c_src/geef.c | 1 + c_src/object.c | 14 ++++++++++++++ c_src/object.h | 1 + c_src/repository.c | 26 ++++++++++++++++++++++++++ c_src/repository.h | 1 + src/geef.erl | 6 +++++- src/geef_odb.erl | 11 ++++++++++- 7 files changed, 58 insertions(+), 2 deletions(-) diff --git a/c_src/geef.c b/c_src/geef.c index 898ae54..c3dc544 100644 --- a/c_src/geef.c +++ b/c_src/geef.c @@ -89,6 +89,7 @@ static ErlNifFunc geef_funcs[] = {"repository_get_workdir", 1, geef_repository_workdir}, {"repository_get_odb", 1, geef_repository_odb}, {"odb_object_exists", 2, geef_odb_exists}, + {"odb_write", 3, geef_odb_write}, {"reference_list", 1, geef_reference_list}, {"reference_to_id", 2, geef_reference_to_id}, {"reference_glob", 2, geef_reference_glob}, diff --git a/c_src/object.c b/c_src/object.c index cb0abf3..3956c17 100644 --- a/c_src/object.c +++ b/c_src/object.c @@ -28,6 +28,20 @@ ERL_NIF_TERM geef_object_type2atom(const git_otype type) } } +git_otype geef_object_atom2type(ERL_NIF_TERM term) +{ + if (!enif_compare(term, atoms.commit)) + return GIT_OBJ_COMMIT; + else if (!enif_compare(term, atoms.tree)) + return GIT_OBJ_TREE; + else if (!enif_compare(term, atoms.blob)) + return GIT_OBJ_BLOB; + else if (!enif_compare(term, atoms.tag)) + return GIT_OBJ_TAG; + + return GIT_OBJ_BAD; +} + ERL_NIF_TERM geef_object_lookup(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { diff --git a/c_src/object.h b/c_src/object.h index 80f4547..e730379 100644 --- a/c_src/object.h +++ b/c_src/object.h @@ -16,6 +16,7 @@ ERL_NIF_TERM geef_object_lookup(ErlNifEnv *env, int argc, const ERL_NIF_TERM arg ERL_NIF_TERM geef_object_id(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_object_type2atom(const git_otype type); +git_otype geef_object_atom2type(ERL_NIF_TERM term); void geef_object_free(ErlNifEnv *env, void *cd); diff --git a/c_src/repository.c b/c_src/repository.c index a7ae70f..3da3002 100644 --- a/c_src/repository.c +++ b/c_src/repository.c @@ -1,4 +1,6 @@ #include "repository.h" +#include "object.h" +#include "oid.h" #include "geef.h" #include #include @@ -191,3 +193,27 @@ geef_odb_exists(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) return atoms.false; } + +ERL_NIF_TERM +geef_odb_write(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) +{ + git_otype type; + git_oid oid; + geef_odb *odb; + ErlNifBinary contents, oid_bin; + + if (!enif_get_resource(env, argv[0], geef_odb_type, (void **) &odb)) + return enif_make_badarg(env); + + if (!enif_inspect_iolist_as_binary(env, argv[1], &contents)) + return enif_make_badarg(env); + + type = geef_object_atom2type(argv[2]); + if (git_odb_write(&oid, odb->odb, contents.data, contents.size, type) < 0) + return geef_error(env); + + if (geef_oid_bin(&oid_bin, &oid) < 0) + return atoms.error; + + return enif_make_tuple2(env, atoms.ok, enif_make_binary(env, &oid_bin)); +} diff --git a/c_src/repository.h b/c_src/repository.h index 38f2665..9021aef 100644 --- a/c_src/repository.h +++ b/c_src/repository.h @@ -13,6 +13,7 @@ ERL_NIF_TERM geef_repository_workdir(ErlNifEnv *env, int argc, const ERL_NIF_TER ERL_NIF_TERM geef_repository_is_bare(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_repository_odb(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); ERL_NIF_TERM geef_odb_exists(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); +ERL_NIF_TERM geef_odb_write(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]); void geef_repository_free(ErlNifEnv *env, void *cd); diff --git a/src/geef.erl b/src/geef.erl index 87a15b5..18995bd 100644 --- a/src/geef.erl +++ b/src/geef.erl @@ -1,7 +1,7 @@ -module(geef). -export([hex_to_raw/1, reference_list/1, reference_to_id/2, reference_glob/2, reference_lookup/2, reference_resolve/1, - reference_target/1, reference_type/1, odb_object_exists/2]). + reference_target/1, reference_type/1, odb_object_exists/2, odb_write/3]). % repository operations -export([repository_get_path/1, repository_get_odb/1, repository_open/1, repository_init/2, @@ -65,6 +65,10 @@ reference_type(_Handle) -> odb_object_exists(_Val, _Val) -> nif_error(?LINE). +-spec odb_write(term, iolist(), atom()) -> term. +odb_write(_Handle, _Contents, _Type) -> + nif_error(?LINE). + oid_fmt(_Oid) -> nif_error(?LINE). diff --git a/src/geef_odb.erl b/src/geef_odb.erl index 210ee54..c6caa38 100644 --- a/src/geef_odb.erl +++ b/src/geef_odb.erl @@ -1,8 +1,17 @@ -module(geef_odb). --export([exists/2]). +-export([exists/2, write/3]). -include("geef_records.hrl"). -spec exists(odb(), string()) -> boolean(). exists(#odb{handle=Handle}, Sha) -> geef:odb_object_exists(Handle, Sha). + +-spec write(odb(), iolist(), atom()) -> {ok, oid()} | {error, term}. +write(#odb{handle=Handle}, Contents, Type) -> + case geef:odb_write(Handle, Contents, Type) of + {ok, Oid} -> + {ok, #oid{oid=Oid}}; + Other -> + Other + end.