Add tag-peeling support
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
#include "commit.h"
|
#include "commit.h"
|
||||||
#include "tree.h"
|
#include "tree.h"
|
||||||
#include "blob.h"
|
#include "blob.h"
|
||||||
|
#include "tag.h"
|
||||||
#include "library.h"
|
#include "library.h"
|
||||||
#include "revwalk.h"
|
#include "revwalk.h"
|
||||||
#include "index.h"
|
#include "index.h"
|
||||||
@@ -162,6 +163,7 @@ static ErlNifFunc geef_funcs[] =
|
|||||||
{"tree_bypath", 2, geef_tree_bypath},
|
{"tree_bypath", 2, geef_tree_bypath},
|
||||||
{"blob_size", 1, geef_blob_size},
|
{"blob_size", 1, geef_blob_size},
|
||||||
{"blob_content", 1, geef_blob_content},
|
{"blob_content", 1, geef_blob_content},
|
||||||
|
{"tag_peel", 1, geef_tag_peel},
|
||||||
{"library_version", 0, geef_library_version},
|
{"library_version", 0, geef_library_version},
|
||||||
{"revwalk_new", 1, geef_revwalk_new},
|
{"revwalk_new", 1, geef_revwalk_new},
|
||||||
{"revwalk_push", 3, geef_revwalk_push},
|
{"revwalk_push", 3, geef_revwalk_push},
|
||||||
|
|||||||
35
c_src/tag.c
Normal file
35
c_src/tag.c
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#include <git2.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "oid.h"
|
||||||
|
#include "geef.h"
|
||||||
|
#include "tree.h"
|
||||||
|
|
||||||
|
ERL_NIF_TERM
|
||||||
|
geef_tag_peel(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
||||||
|
{
|
||||||
|
geef_object *obj, *peeled;
|
||||||
|
ERL_NIF_TERM term_peeled;
|
||||||
|
|
||||||
|
if (!enif_get_resource(env, argv[0], geef_object_type, (void **) &obj))
|
||||||
|
return enif_make_badarg(env);
|
||||||
|
|
||||||
|
if (git_object_type(obj->obj) != GIT_OBJ_TAG)
|
||||||
|
return enif_make_badarg(env);
|
||||||
|
|
||||||
|
peeled = enif_alloc_resource(geef_object_type, sizeof(geef_object));
|
||||||
|
if (!obj)
|
||||||
|
return geef_oom(env);
|
||||||
|
|
||||||
|
if (git_tag_peel(&peeled->obj, (git_tag *)obj->obj) < 0)
|
||||||
|
return geef_error(env);
|
||||||
|
|
||||||
|
peeled->repo = obj->repo;
|
||||||
|
enif_keep_resource(peeled->repo);
|
||||||
|
|
||||||
|
term_peeled = enif_make_resource(env, peeled);
|
||||||
|
enif_release_resource(peeled);
|
||||||
|
|
||||||
|
return enif_make_tuple3(env, atoms.ok, geef_object_type2atom(git_object_type(peeled->obj)), term_peeled);
|
||||||
|
}
|
||||||
6
c_src/tag.h
Normal file
6
c_src/tag.h
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
#ifndef GEEF_TAG_H
|
||||||
|
#define GEEF_TAG_H
|
||||||
|
|
||||||
|
ERL_NIF_TERM geef_tag_peel(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -101,6 +101,10 @@ blob_size(_ObjHandle) ->
|
|||||||
blob_content(_ObjHandle) ->
|
blob_content(_ObjHandle) ->
|
||||||
nif_error(?LINE).
|
nif_error(?LINE).
|
||||||
|
|
||||||
|
-spec tag_peel(term()) -> {ok, atom(), term()} | {error, term()}.
|
||||||
|
tag_peel(_Tag) ->
|
||||||
|
?NIF_FN.
|
||||||
|
|
||||||
-spec library_version() -> {integer, integer, integer}.
|
-spec library_version() -> {integer, integer, integer}.
|
||||||
library_version() ->
|
library_version() ->
|
||||||
nif_error(?LINE).
|
nif_error(?LINE).
|
||||||
|
|||||||
22
src/geef_tag.erl
Normal file
22
src/geef_tag.erl
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
-module(geef_tag).
|
||||||
|
|
||||||
|
-ifdef(TEST).
|
||||||
|
-include_lib("eunit/include/eunit.hrl").
|
||||||
|
-endif.
|
||||||
|
|
||||||
|
-export([lookup/2, peel/1]).
|
||||||
|
|
||||||
|
-include("geef_records.hrl").
|
||||||
|
|
||||||
|
-spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}.
|
||||||
|
lookup(Repo, Id) ->
|
||||||
|
geef_object:lookup(Repo, Id, tag).
|
||||||
|
|
||||||
|
-spec peel(geef_object()) -> {ok, geef_object()} | {error, term()}.
|
||||||
|
peel(#geef_object{type=tag, handle=Handle}) ->
|
||||||
|
case geef_nif:tag_peel(Handle) of
|
||||||
|
{ok, Type, PeeledHandle} ->
|
||||||
|
{ok, #geef_object{type=Type, handle=PeeledHandle}};
|
||||||
|
Err = {error, _} ->
|
||||||
|
Err
|
||||||
|
end.
|
||||||
Reference in New Issue
Block a user