Merge branch 'revparse'
This commit is contained in:
@@ -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>
|
||||
@@ -185,6 +186,7 @@ static ErlNifFunc geef_funcs[] =
|
||||
{"index_clear", 1, geef_index_clear},
|
||||
{"index_read_tree", 2, geef_index_read_tree},
|
||||
{"signature_default", 1, geef_signature_default},
|
||||
{"revparse_single", 2, geef_revparse_single},
|
||||
};
|
||||
|
||||
ERL_NIF_INIT(geef_nif, geef_funcs, load, NULL, upgrade, unload)
|
||||
|
||||
@@ -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
48
c_src/revparse.c
Normal 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
8
c_src/revparse.h
Normal 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
|
||||
@@ -7,15 +7,11 @@ defrecord Geef.Object, Record.extract(:geef_object, from: "src/geef_records.hrl"
|
||||
end
|
||||
end
|
||||
|
||||
def from_erl(obj) do
|
||||
do_from_erl(obj, elem(obj, 0))
|
||||
end
|
||||
|
||||
defp do_from_erl(obj, :geef_tree) do
|
||||
def from_erl(obj) when elem(obj, 1) == :tree do
|
||||
set_elem(obj, 0, Geef.Tree)
|
||||
end
|
||||
|
||||
defp do_from_erl(obj, _) do
|
||||
def rom_erl(obj) do
|
||||
set_elem(obj, 0, Geef.Object)
|
||||
end
|
||||
|
||||
|
||||
17
lib/geef/revparse.ex
Normal file
17
lib/geef/revparse.ex
Normal 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
|
||||
@@ -182,6 +182,10 @@ signature_new(_Name, _Email) ->
|
||||
signature_new(_Name, _Email, _Time) ->
|
||||
?NIF_FN.
|
||||
|
||||
-spec revparse_single(term(), iolist()) -> {ok, term(), atom(), geef_oid:oid()} | {error, term()}.
|
||||
revparse_single(_Handle, _Str) ->
|
||||
?NIF_FN.
|
||||
|
||||
nif_error(Line) ->
|
||||
erlang:nif_error({nif_not_loaded,module,?MODULE,line,Line}).
|
||||
|
||||
|
||||
15
src/geef_revparse.erl
Normal file
15
src/geef_revparse.erl
Normal 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.
|
||||
@@ -6,7 +6,7 @@
|
||||
repo_test_() ->
|
||||
{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_iter_test/1]}.
|
||||
fun ref_iter_test/1, fun revparse_test/1]}.
|
||||
|
||||
start() ->
|
||||
{A, B, C} = now(),
|
||||
@@ -25,6 +25,12 @@ odb_write_test(Repo) ->
|
||||
Expected = geef_oid:parse("c300118399f01fe52b316061b5d32beb27e0adfd"),
|
||||
[?_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) ->
|
||||
Data = <<"This is some text that will go in a file">>,
|
||||
{ok, Odb} = geef_repo:odb(Repo),
|
||||
|
||||
Reference in New Issue
Block a user