Merge branch 'revparse'
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
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
|
||||||
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
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) ->
|
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
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_() ->
|
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),
|
||||||
|
|||||||
Reference in New Issue
Block a user