Merge branch 'revparse'

This commit is contained in:
Carlos Martín Nieto
2013-10-16 13:58:20 +02:00
9 changed files with 103 additions and 8 deletions

View File

@@ -11,6 +11,7 @@
#include "revwalk.h" #include "revwalk.h"
#include "index.h" #include "index.h"
#include "signature.h" #include "signature.h"
#include "revparse.h"
#include "geef.h" #include "geef.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@@ -185,6 +186,7 @@ static ErlNifFunc geef_funcs[] =
{"index_clear", 1, geef_index_clear}, {"index_clear", 1, geef_index_clear},
{"index_read_tree", 2, geef_index_read_tree}, {"index_read_tree", 2, geef_index_read_tree},
{"signature_default", 1, geef_signature_default}, {"signature_default", 1, geef_signature_default},
{"revparse_single", 2, geef_revparse_single},
}; };
ERL_NIF_INIT(geef_nif, geef_funcs, load, NULL, upgrade, unload) 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); return geef_error(env);
} }
term_obj = enif_make_resource(env, obj); term_obj = enif_make_resource(env, obj);
enif_release_resource(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

View File

@@ -7,15 +7,11 @@ defrecord Geef.Object, Record.extract(:geef_object, from: "src/geef_records.hrl"
end end
end end
def from_erl(obj) do def from_erl(obj) when elem(obj, 1) == :tree do
do_from_erl(obj, elem(obj, 0))
end
defp do_from_erl(obj, :geef_tree) do
set_elem(obj, 0, Geef.Tree) set_elem(obj, 0, Geef.Tree)
end end
defp do_from_erl(obj, _) do def rom_erl(obj) do
set_elem(obj, 0, Geef.Object) set_elem(obj, 0, Geef.Object)
end end

17
lib/geef/revparse.ex Normal file
View File

@@ -0,0 +1,17 @@
defmodule Geef.Revparse do
import Geef
use Geef
@spec single(pid, iolist) :: {:ok, Object.t} | {:error, term}
def single(repo, str) do
case :geef_revparse.single(repo, str) do
{:ok, obj} ->
{:ok, Object.from_erl(obj)}
error -> error
end
end
@spec single!(pid, iolist) :: {:ok, Object.t}
def single!(repo, str), do: single(repo, str) |> assert_ok
end

View File

@@ -182,6 +182,10 @@ signature_new(_Name, _Email) ->
signature_new(_Name, _Email, _Time) -> signature_new(_Name, _Email, _Time) ->
?NIF_FN. ?NIF_FN.
-spec revparse_single(term(), iolist()) -> {ok, term(), atom(), geef_oid:oid()} | {error, term()}.
revparse_single(_Handle, _Str) ->
?NIF_FN.
nif_error(Line) -> nif_error(Line) ->
erlang:nif_error({nif_not_loaded,module,?MODULE,line,Line}). erlang:nif_error({nif_not_loaded,module,?MODULE,line,Line}).

15
src/geef_revparse.erl Normal file
View File

@@ -0,0 +1,15 @@
-module(geef_revparse).
-include("geef_records.hrl").
-export([single/2]).
-spec single(pid(), iolist()) -> {ok, geef_obj:object()} | {error, term()}.
single(Repo, Str) ->
RepoHandle = geef_repo:handle(Repo),
case geef_nif:revparse_single(RepoHandle, Str) of
{ok, ObjHandle, Type, Id} ->
{ok, #geef_object{type=Type, id=Id, handle=ObjHandle}};
Error = {error, _} ->
Error
end.

View File

@@ -6,7 +6,7 @@
repo_test_() -> repo_test_() ->
{foreach, fun start/0, fun stop/1, [fun bare_test/1, fun odb_write_test/1, {foreach, fun start/0, fun stop/1, [fun bare_test/1, fun odb_write_test/1,
fun ref_test/1, fun index_add_test/1, fun ref_test/1, fun index_add_test/1,
fun ref_iter_test/1]}. fun ref_iter_test/1, fun revparse_test/1]}.
start() -> start() ->
{A, B, C} = now(), {A, B, C} = now(),
@@ -25,6 +25,12 @@ odb_write_test(Repo) ->
Expected = geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"), Expected = geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"),
[?_assertEqual(Actual, Expected)]. [?_assertEqual(Actual, Expected)].
revparse_test(Repo) ->
odb_write_test(Repo),
{ok, Obj} = geef_revparse:single(Repo, "c300118399"),
[?_assertEqual(Obj#geef_object.type, blob),
?_assertEqual(Obj#geef_object.id, geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"))].
index_add_test(Repo) -> index_add_test(Repo) ->
Data = <<"This is some text that will go in a file">>, Data = <<"This is some text that will go in a file">>,
{ok, Odb} = geef_repo:odb(Repo), {ok, Odb} = geef_repo:odb(Repo),