Namespace the records

This makes it useful for users of the bindings. The naming is the same
as the module to allow elixir to treat the records in much the same
way as its native module/record hybrid.
This commit is contained in:
Carlos Martín Nieto
2013-05-13 10:55:18 +02:00
parent cc8124a6b9
commit 4a2f2e8ab2
12 changed files with 83 additions and 92 deletions

View File

@@ -8,18 +8,18 @@
-export([lookup/2, id/1, size/1, content/1]). -export([lookup/2, id/1, size/1, content/1]).
-spec lookup(repo(), oid() | iolist()) -> object(). -spec lookup(pid(), geef_oid() | iolist()) -> geef_object().
lookup(Repo, Id) -> lookup(Repo, Id) ->
geef_object:lookup(Repo, Id, blob). geef_object:lookup(Repo, Id, blob).
-spec id(object()) -> oid(). -spec id(geef_object()) -> geef_oid().
id(Obj = #object{type=blob}) -> id(Obj = #geef_object{type=blob}) ->
geef_object:id(Obj). geef_object:id(Obj).
size(#object{type=blob, handle=Handle}) -> size(#geef_object{type=blob, handle=Handle}) ->
geef_nif:blob_size(Handle). geef_nif:blob_size(Handle).
content(#object{type=blob, handle=Handle}) -> content(#geef_object{type=blob, handle=Handle}) ->
{ok, Content} = geef_nif:blob_content(Handle), {ok, Content} = geef_nif:blob_content(Handle),
Content. Content.

View File

@@ -3,22 +3,22 @@
-include("geef_records.hrl"). -include("geef_records.hrl").
-spec tree_id(object()) -> oid(). -spec tree_id(geef_object()) -> geef_oid().
tree_id(#object{type=commit,handle=Handle}) -> tree_id(#geef_object{type=commit,handle=Handle}) ->
Oid = geef_nif:commit_tree_id(Handle), Oid = geef_nif:commit_tree_id(Handle),
#oid{oid=Oid}. #geef_oid{oid=Oid}.
tree(#object{type=commit,handle=Handle}) -> tree(#geef_object{type=commit,handle=Handle}) ->
case geef_nif:commit_tree(Handle) of case geef_nif:commit_tree(Handle) of
{ok, Type, Handle} -> {ok, Type, Handle} ->
{ok, #object{type=Type, handle=Handle}}; {ok, #geef_object{type=Type, handle=Handle}};
Other -> Other ->
Other Other
end. end.
-spec lookup(repo(), oid() | iolist()) -> object(). -spec lookup(pid(), geef_oid() | iolist()) -> geef_object().
lookup(Repo, Id) -> lookup(Repo, Id) ->
geef_object:lookup(Repo, Id, commit). geef_object:lookup(Repo, Id, commit).
id(Obj = #object{type=commit}) -> id(Obj = #geef_object{type=commit}) ->
geef_object:id(Obj). geef_object:id(Obj).

View File

@@ -39,20 +39,20 @@ write(Pid) ->
gen_server:call(Pid, write). gen_server:call(Pid, write).
%% @doc Write out the index's contents to its the repository. %% @doc Write out the index's contents to its the repository.
-spec write_tree(pid()) -> {ok, oid()} | {error, term()}. -spec write_tree(pid()) -> {ok, geef_oid()} | {error, term()}.
write_tree(Pid) -> write_tree(Pid) ->
gen_server:call(Pid, write_tree). gen_server:call(Pid, write_tree).
%% @doc Write out the index's contents to the given repository %% @doc Write out the index's contents to the given repository
-spec write_tree(pid(), pid()) -> {ok, oid()} | {error, term()}. -spec write_tree(pid(), pid()) -> {ok, geef_oid()} | {error, term()}.
write_tree(Pid, Repo) -> write_tree(Pid, Repo) ->
gen_server:call(Pid, {write_tree, Repo}). gen_server:call(Pid, {write_tree, Repo}).
read_tree(Pid, #object{type=tree, handle=TreeHandle}) -> read_tree(Pid, #geef_object{type=tree, handle=TreeHandle}) ->
gen_server:call(Pid, {read_tree, TreeHandle}). gen_server:call(Pid, {read_tree, TreeHandle}).
%% @doc Add an entry to the index %% @doc Add an entry to the index
-spec add(pid(), index_entry()) -> ok | {error, term()}. -spec add(pid(), geef_index_entry()) -> ok | {error, term()}.
add(Pid, Entry) -> add(Pid, Entry) ->
gen_server:call(Pid, {add, Entry}). gen_server:call(Pid, {add, Entry}).
@@ -83,12 +83,12 @@ handle_call(write, _From, State = #state{handle=Handle}) ->
{reply, Reply, State}; {reply, Reply, State};
handle_call(write_tree, _From, State = #state{handle=Handle}) -> handle_call(write_tree, _From, State = #state{handle=Handle}) ->
{ok, Oid} = geef_nif:index_write_tree(Handle), {ok, Oid} = geef_nif:index_write_tree(Handle),
Reply = #oid{oid=Oid}, Reply = #geef_oid{oid=Oid},
{reply, Reply, State}; {reply, Reply, State};
handle_call({write_tree, Repo}, _From, State = #state{handle=Handle}) -> handle_call({write_tree, Repo}, _From, State = #state{handle=Handle}) ->
RepoHandle = geef_repo:handle(Repo), RepoHandle = geef_repo:handle(Repo),
{ok, Oid} = geef_nif:index_write_tree(Handle, RepoHandle), {ok, Oid} = geef_nif:index_write_tree(Handle, RepoHandle),
Reply = {ok, #oid{oid=Oid}}, Reply = {ok, #geef_oid{oid=Oid}},
{reply, Reply, State}; {reply, Reply, State};
handle_call(clear, _From, State = #state{handle=Handle}) -> handle_call(clear, _From, State = #state{handle=Handle}) ->
Reply = geef_nif:index_clear(Handle), Reply = geef_nif:index_clear(Handle),

View File

@@ -8,11 +8,11 @@
-export([lookup/2, lookup/3, id/1]). -export([lookup/2, lookup/3, id/1]).
-spec lookup(pid(), oid() | iolist()) -> {ok, object()} | {error, term()}. -spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}.
lookup(Repo, #oid{oid=Oid}) -> lookup(Repo, #geef_oid{oid=Oid}) ->
case geef_repo:lookup_object(Repo, Oid) of case geef_repo:lookup_object(Repo, Oid) of
{ok, Type, Handle} -> {ok, Type, Handle} ->
{ok, #object{type=Type, handle=Handle}}; {ok, #geef_object{type=Type, handle=Handle}};
{error, Err} -> {error, Err} ->
{error, Err} {error, Err}
end; end;
@@ -20,20 +20,20 @@ lookup(Repo, Id) ->
lookup(Repo, geef_oid:parse(Id)). lookup(Repo, geef_oid:parse(Id)).
%% As lookup/2, but it asserts that the type is correct %% As lookup/2, but it asserts that the type is correct
-spec lookup(pid(), oid() | iolist(), atom()) -> {ok, object()} | {error, term()}. -spec lookup(pid(), geef_oid() | iolist(), atom()) -> {ok, geef_object()} | {error, term()}.
lookup(Repo, Id, Type) -> lookup(Repo, Id, Type) ->
case lookup(Repo, Id) of case lookup(Repo, Id) of
{ok, Obj = #object{type=Type}} -> {ok, Obj = #geef_object{type=Type}} ->
{ok, Obj}; {ok, Obj};
{error, Err} -> {error, Err} ->
{error, Err} {error, Err}
end. end.
-spec id(object()) -> {ok, oid()} | {error, term()}. -spec id(geef_object()) -> {ok, geef_oid()} | {error, term()}.
id(#object{handle=Handle}) -> id(#geef_object{handle=Handle}) ->
case geef_nif:object_id(Handle) of case geef_nif:object_id(Handle) of
{ok, Oid} -> {ok, Oid} ->
#oid{oid=Oid}; #geef_oid{oid=Oid};
Other -> Other ->
Other Other
end. end.
@@ -42,16 +42,16 @@ id(#object{handle=Handle}) ->
lookup_test() -> lookup_test() ->
{ok, Repo} = geef_repo:open(".."), {ok, Repo} = geef_repo:open(".."),
{ok, #object{type=commit}} = lookup(Repo, geef_oid:parse("b5b68cce8b92ca0e7bd48430617ac10c0f2c2923")), {ok, #geef_object{type=commit}} = lookup(Repo, geef_oid:parse("b5b68cce8b92ca0e7bd48430617ac10c0f2c2923")),
{ok, #object{type=commit}} = lookup(Repo, "b5b68cce8b92ca0e7bd48430617ac10c0f2c2923"), {ok, #geef_object{type=commit}} = lookup(Repo, "b5b68cce8b92ca0e7bd48430617ac10c0f2c2923"),
{ok, #object{type=commit}} = lookup(Repo, ["b5b68cce8b92ca0e7", "bd48430617ac10c0f2c2923"]), {ok, #geef_object{type=commit}} = lookup(Repo, ["b5b68cce8b92ca0e7", "bd48430617ac10c0f2c2923"]),
{ok, #object{type=commit}} = lookup(Repo, <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>). {ok, #geef_object{type=commit}} = lookup(Repo, <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>).
id_test() -> id_test() ->
{ok, Repo} = geef_repo:open(".."), {ok, Repo} = geef_repo:open(".."),
Sha = <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>, Sha = <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>,
Id = geef_oid:parse(Sha), Id = geef_oid:parse(Sha),
{ok, Commit = #object{type=commit}} = lookup(Repo, Sha), {ok, Commit = #geef_object{type=commit}} = lookup(Repo, Sha),
Id = id(Commit). Id = id(Commit).
-endif. -endif.

View File

@@ -8,17 +8,17 @@
-include("geef_records.hrl"). -include("geef_records.hrl").
-spec exists(odb(), oid() | iolist()) -> boolean(). -spec exists(geef_odb(), geef_oid() | iolist()) -> boolean().
exists(#odb{handle=Handle}, #oid{oid=Oid}) -> exists(#geef_odb{handle=Handle}, #geef_oid{oid=Oid}) ->
geef_nif:odb_object_exists(Handle, Oid); geef_nif:odb_object_exists(Handle, Oid);
exists(Odb = #odb{}, Sha) -> exists(Odb = #geef_odb{}, Sha) ->
exists(Odb, geef_oid:parse(Sha)). exists(Odb, geef_oid:parse(Sha)).
-spec write(odb(), iolist(), atom()) -> {ok, oid()} | {error, term}. -spec write(geef_odb(), iolist(), atom()) -> {ok, geef_oid()} | {error, term}.
write(#odb{handle=Handle}, Contents, Type) -> write(#geef_odb{handle=Handle}, Contents, Type) ->
case geef_nif:odb_write(Handle, Contents, Type) of case geef_nif:odb_write(Handle, Contents, Type) of
{ok, Oid} -> {ok, Oid} ->
{ok, #oid{oid=Oid}}; {ok, #geef_oid{oid=Oid}};
Other -> Other ->
Other Other
end. end.

View File

@@ -10,15 +10,15 @@
-export([parse/1, fmt/1]). -export([parse/1, fmt/1]).
%% @doc Get the hex-encoded hash %% @doc Get the hex-encoded hash
-spec fmt(oid()) -> binary(). -spec fmt(geef_oid()) -> binary().
fmt(#oid{oid=Oid}) -> fmt(#geef_oid{oid=Oid}) ->
geef_nif:oid_fmt(Oid). geef_nif:oid_fmt(Oid).
%% @doc Parse an iolist as a hash %% @doc Parse an iolist as a hash
-spec parse(iolist()) -> oid(). -spec parse(iolist()) -> geef_oid().
parse(Sha) -> parse(Sha) ->
Oid = geef_nif:oid_parse(Sha), Oid = geef_nif:oid_parse(Sha),
#oid{oid=Oid}. #geef_oid{oid=Oid}.
-ifdef(TEST). -ifdef(TEST).

View File

@@ -1,15 +1,11 @@
-record(ref, {handle, type :: atom(), target :: binary() | oid()}). -record(geef_ref, {handle, type :: atom(), target :: binary() | geef_oid()}).
-record(repo, {handle}). -record(geef_odb, {handle}).
-record(odb, {handle}). -record(geef_oid, {oid}).
-record(revwalk, {handle}). -record(geef_object, {type :: atom(), handle}).
-record(oid, {oid}). -record(geef_index_entry, {mode, id :: geef_oid(), path :: iolist()}).
-record(object, {type :: atom(), handle}).
-record(index_entry, {mode, id :: oid(), path :: iolist()}).
-type ref() :: #ref{}. -type geef_ref() :: #geef_ref{}.
-type repo() :: #repo{}. -type geef_odb() :: #geef_odb{}.
-type revwalk() :: #revwalk{}. -type geef_oid() :: #geef_oid{}.
-type odb() :: #odb{}. -type geef_object() :: #geef_object{}.
-type oid() :: #oid{}. -type geef_index_entry() :: #geef_index_entry{}.
-type object() :: #object{}.
-type index_entry() :: #index_entry{}.

View File

@@ -1,10 +1,10 @@
-module(geef_ref). -module(geef_ref).
-export([lookup/2, resolve/1, name_to_id/2, create/4]). -export([lookup/2, resolve/1, create/4, target/1]).
-include("geef_records.hrl"). -include("geef_records.hrl").
-spec new(term()) -> ref(). -spec new(term()) -> geef_ref().
new(Handle) -> new(Handle) ->
Type = geef_nif:reference_type(Handle), Type = geef_nif:reference_type(Handle),
Bin = geef_nif:reference_target(Handle), Bin = geef_nif:reference_target(Handle),
@@ -12,17 +12,17 @@ new(Handle) ->
symbolic -> symbolic ->
Bin; Bin;
oid -> oid ->
#oid{oid=Bin} #geef_oid{oid=Bin}
end, end,
#ref{handle=Handle, type=Type, target=Target}. #geef_ref{handle=Handle, type=Type, target=Target}.
-spec create(pid(), iolist(), oid() | binary(), boolean()) -> {ok, ref()} | {error, term()} -spec create(pid(), iolist(), geef_oid() | binary(), boolean()) -> {ok, geef_ref()} | {error, term()}
. .
create(Repo, Refname, Target, Force) -> create(Repo, Refname, Target, Force) ->
{ok, Ref} = geef_repo:create_reference(Repo, Refname, Target, Force), {ok, Ref} = geef_repo:create_reference(Repo, Refname, Target, Force),
{ok, new(Ref)}. {ok, new(Ref)}.
-spec lookup(pid(), iolist()) -> {ok, ref()} | {error, term()}. -spec lookup(pid(), iolist()) -> {ok, geef_ref()} | {error, term()}.
lookup(Repo, Refname) -> lookup(Repo, Refname) ->
case geef_repo:lookup_reference(Repo, Refname) of case geef_repo:lookup_reference(Repo, Refname) of
{ok, Ref} -> {ok, Ref} ->
@@ -31,8 +31,8 @@ lookup(Repo, Refname) ->
Other Other
end. end.
-spec resolve(ref()) -> {ok, ref()} | {error, term()}. -spec resolve(geef_ref()) -> {ok, geef_ref()} | {error, term()}.
resolve(#ref{handle=Handle}) -> resolve(#geef_ref{handle=Handle}) ->
case geef_nif:reference_resolve(Handle) of case geef_nif:reference_resolve(Handle) of
{ok, Ref} -> {ok, Ref} ->
{ok, new(Ref)}; {ok, new(Ref)};
@@ -40,11 +40,6 @@ resolve(#ref{handle=Handle}) ->
Other Other
end. end.
-spec name_to_id(repo(), iolist()) -> {ok, oid()} | {error, binary()}. -spec target(geef_ref()) -> {geef_oid(), binary()}.
name_to_id(#repo{handle=Handle}, Name) -> target(#geef_ref{target=Target}) ->
case geef_nif:reference_to_id(Handle, Name) of Target.
{ok, Oid} ->
{ok, #oid{oid=Oid}};
Other ->
Other
end.

View File

@@ -33,7 +33,7 @@ discover(Path) ->
%% @doc Open an existing repository. Path must point to the git-dir or %% @doc Open an existing repository. Path must point to the git-dir or
%% worktree %% worktree
-spec open(iolist()) -> {ok, repo()} | {error, term()}. -spec open(iolist()) -> {ok, pid()} | {error, term()}.
open(Path) -> open(Path) ->
case geef_nif:repository_open(Path) of case geef_nif:repository_open(Path) of
{ok, Handle} -> {ok, Handle} ->
@@ -64,7 +64,7 @@ workdir(Pid) ->
%% @doc The repository's current object database. This encompasses all %% @doc The repository's current object database. This encompasses all
%% the configured backends. %% the configured backends.
-spec odb(pid()) -> {ok, odb()} | {error, term}. -spec odb(pid()) -> {ok, geef_odb()} | {error, term}.
odb(Pid) -> odb(Pid) ->
gen_server:call(Pid, odb). gen_server:call(Pid, odb).
@@ -176,7 +176,7 @@ start_link(Handle) ->
handle_odb(Handle) -> handle_odb(Handle) ->
case geef_nif:repository_get_odb(Handle) of case geef_nif:repository_get_odb(Handle) of
{ok, OdbHandle} -> {ok, OdbHandle} ->
{ok, #odb{handle=OdbHandle}}; {ok, #geef_odb{handle=OdbHandle}};
Other -> Other ->
Other Other
end. end.
@@ -189,7 +189,7 @@ handle_revwalk(Handle) ->
Error Error
end. end.
handle_create_reference(Repo, Refname, #oid{oid=Oid}, Force) -> handle_create_reference(Repo, Refname, #geef_oid{oid=Oid}, Force) ->
geef_nif:reference_create(Repo, Refname, oid, Oid, Force); geef_nif:reference_create(Repo, Refname, oid, Oid, Force);
handle_create_reference(Repo, Refname, Target, Force) -> handle_create_reference(Repo, Refname, Target, Force) ->
geef_nif:reference_create(Repo, Refname, symbolic, Target, Force). geef_nif:reference_create(Repo, Refname, symbolic, Target, Force).

View File

@@ -28,21 +28,21 @@
%% @doc Push a commit. This commit and its parents will be included in %% @doc Push a commit. This commit and its parents will be included in
%% the walk as long as they haven't been hidden. At least one commit %% the walk as long as they haven't been hidden. At least one commit
%% must be pushed before starting a walk. %% must be pushed before starting a walk.
-spec push(pid(), oid() | iolist()) -> ok | {error, binary()}. -spec push(pid(), geef_oid() | iolist()) -> ok | {error, binary()}.
push(Pid, #oid{oid=Oid}) -> push(Pid, #geef_oid{oid=Oid}) ->
gen_server:call(Pid, {push, Oid}); gen_server:call(Pid, {push, Oid});
push(Pid, Id) -> push(Pid, Id) ->
#oid{oid=Oid} = geef_oid:parse(Id), #geef_oid{oid=Oid} = geef_oid:parse(Id),
gen_server:call(Pid, {push, Oid}). gen_server:call(Pid, {push, Oid}).
%% @doc Hide a commit. Hide a commit and its parents. Any Parent of %% @doc Hide a commit. Hide a commit and its parents. Any Parent of
%% this commit won't be included in the walk. %% this commit won't be included in the walk.
-spec hide(pid(), oid() | iolist()) -> ok | {error, binary()}. -spec hide(pid(), geef_oid() | iolist()) -> ok | {error, binary()}.
hide(Pid, #oid{oid=Oid}) -> hide(Pid, #geef_oid{oid=Oid}) ->
gen_server:call(Pid, {hide, Oid}); gen_server:call(Pid, {hide, Oid});
hide(Pid, Id) -> hide(Pid, Id) ->
#oid{oid=Oid} = geef_oid:parse(Id), #geef_oid{oid=Oid} = geef_oid:parse(Id),
gen_server:call(Pid, {hide, Oid}). gen_server:call(Pid, {hide, Oid}).
@@ -118,7 +118,7 @@ code_change(_OldVsn, State, _Extra) ->
handle_next(Handle) -> handle_next(Handle) ->
case geef_nif:revwalk_next(Handle) of case geef_nif:revwalk_next(Handle) of
{ok, Oid} -> {ok, Oid} ->
{ok, #oid{oid=Oid}}; {ok, #geef_oid{oid=Oid}};
Other -> Other ->
Other Other
end. end.

View File

@@ -8,20 +8,20 @@
-include("geef_records.hrl"). -include("geef_records.hrl").
-spec get(object(), iolist()) -> {ok, integer(), atom(), oid(), binary()} | {error, term()}. -spec get(geef_object(), iolist()) -> {ok, integer(), atom(), geef_oid(), binary()} | {error, term()}.
get(#object{type=tree,handle=Handle}, Path) -> get(#geef_object{type=tree,handle=Handle}, Path) ->
case geef_nif:tree_bypath(Handle, Path) of case geef_nif:tree_bypath(Handle, Path) of
{ok, Mode, Type, Oid, Name} -> {ok, Mode, Type, Geef_Oid, Name} ->
{ok, Mode, Type, #oid{oid=Oid}, Name}; {ok, Mode, Type, #geef_oid{oid=Geef_Oid}, Name};
Other -> Other ->
Other Other
end. end.
-spec id(object()) -> {ok, oid()} | {error, term()}. -spec id(geef_object()) -> {ok, geef_oid()} | {error, term()}.
id(Obj = #object{type=tree}) -> id(Obj = #geef_object{type=tree}) ->
geef_object:id(Obj). geef_object:id(Obj).
-spec lookup(repo(), oid() | iolist()) -> {ok, object()} | {error, term()}. -spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}.
lookup(Repo, Id) -> lookup(Repo, Id) ->
geef_object:lookup(Repo, Id, tree). geef_object:lookup(Repo, Id, tree).

View File

@@ -29,7 +29,7 @@ index_add_test(Repo) ->
{ok, Odb} = geef_repo:odb(Repo), {ok, Odb} = geef_repo:odb(Repo),
{ok, BlobId} = geef_odb:write(Odb, Data, blob), {ok, BlobId} = geef_odb:write(Odb, Data, blob),
{ok, Idx} = geef_index:new(), {ok, Idx} = geef_index:new(),
Entry = #index_entry{mode=8#100644, id=BlobId, path="README"}, Entry = #geef_index_entry{mode=8#100644, id=BlobId, path="README"},
ok = geef_index:add(Idx, Entry), ok = geef_index:add(Idx, Entry),
{ok, TreeId} = geef_index:write_tree(Idx, Repo), {ok, TreeId} = geef_index:write_tree(Idx, Repo),
Expected = geef_oid:parse("5a20bbbf65ea75ad4d9f995d179156824ccca3a1"), Expected = geef_oid:parse("5a20bbbf65ea75ad4d9f995d179156824ccca3a1"),
@@ -42,8 +42,8 @@ create_ref_test(Repo) ->
{ok, _} = geef_ref:create(Repo, "refs/heads/other", "refs/heads/branch", true), {ok, _} = geef_ref:create(Repo, "refs/heads/other", "refs/heads/branch", true),
{ok, Ref0} = geef_ref:lookup(Repo, "refs/heads/branch"), {ok, Ref0} = geef_ref:lookup(Repo, "refs/heads/branch"),
{ok, Ref1} = geef_ref:lookup(Repo, "refs/heads/other"), {ok, Ref1} = geef_ref:lookup(Repo, "refs/heads/other"),
[?_assertEqual(Ref0#ref.target, Id), [?_assertEqual(Ref0#geef_ref.target, Id),
?_assertEqual(Ref1#ref.target, <<"refs/heads/branch">>)]. ?_assertEqual(Ref1#geef_ref.target, <<"refs/heads/branch">>)].
rm_r(Path) -> rm_r(Path) ->
case filelib:is_dir(Path) of case filelib:is_dir(Path) of