diff --git a/src/geef_blob.erl b/src/geef_blob.erl index 1bdbf66..707d160 100644 --- a/src/geef_blob.erl +++ b/src/geef_blob.erl @@ -6,9 +6,12 @@ -include("geef_records.hrl"). +-type blob() :: geef_obj:object(blob). +-export_type([blob/0]). + -export([lookup/2, size/1, content/1]). --spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}. +-spec lookup(pid(), geef_oid:oid() | iolist()) -> {ok, blob()} | {error, term()}. lookup(Repo, Id) -> geef_obj:lookup(Repo, Id, blob). diff --git a/src/geef_commit.erl b/src/geef_commit.erl index e85a22e..7ac0bd6 100644 --- a/src/geef_commit.erl +++ b/src/geef_commit.erl @@ -3,11 +3,15 @@ -include("geef_records.hrl"). --spec tree_id(geef_object()) -> geef_oid(). +-type commit() :: geef_obj:object(commit). +-export_type([commit/0]). + +-spec tree_id(commit()) -> geef_oid:oid(). tree_id(#geef_object{type=commit,handle=Handle}) -> Oid = geef_nif:commit_tree_id(Handle), #geef_oid{oid=Oid}. +-spec tree(commit()) -> {ok, geef_tree:tree()} | {error, term()}. tree(#geef_object{type=commit,handle=Handle}) -> case geef_nif:commit_tree(Handle) of {ok, Type, Handle} -> @@ -16,6 +20,6 @@ tree(#geef_object{type=commit,handle=Handle}) -> Other end. --spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}. +-spec lookup(pid(), geef_oid:oid() | iolist()) -> {ok, commit()} | {error, term()}. lookup(Repo, Id) -> geef_obj:lookup(Repo, Id, commit). diff --git a/src/geef_index.erl b/src/geef_index.erl index 4ab93eb..114f485 100644 --- a/src/geef_index.erl +++ b/src/geef_index.erl @@ -21,6 +21,9 @@ -record(state, {handle}). -include("geef_records.hrl"). +-type entry() :: #geef_index_entry{}. +-export_type([entry/0]). + %%%=================================================================== %%% API %%%=================================================================== @@ -39,12 +42,12 @@ write(Pid) -> gen_server:call(Pid, write). %% @doc Write out the index's contents to its the repository. --spec write_tree(pid()) -> {ok, geef_oid()} | {error, term()}. +-spec write_tree(pid()) -> {ok, geef_oid:oid()} | {error, term()}. write_tree(Pid) -> gen_server:call(Pid, write_tree). %% @doc Write out the index's contents to the given repository --spec write_tree(pid(), pid()) -> {ok, geef_oid()} | {error, term()}. +-spec write_tree(pid(), pid()) -> {ok, geef_oid:oid()} | {error, term()}. write_tree(Pid, Repo) -> gen_server:call(Pid, {write_tree, Repo}). @@ -52,7 +55,7 @@ read_tree(Pid, #geef_object{type=tree, handle=TreeHandle}) -> gen_server:call(Pid, {read_tree, TreeHandle}). %% @doc Add an entry to the index --spec add(pid(), geef_index_entry()) -> ok | {error, term()}. +-spec add(pid(), entry()) -> ok | {error, term()}. add(Pid, Entry) -> gen_server:call(Pid, {add, Entry}). diff --git a/src/geef_nif.erl b/src/geef_nif.erl index ee01c92..c235c95 100644 --- a/src/geef_nif.erl +++ b/src/geef_nif.erl @@ -52,11 +52,11 @@ reference_glob(_Repo, _Glob) -> reference_lookup(_Repo, _Refname) -> nif_error(?LINE). --spec reference_iterator(term(), iolist() | undefined) -> {ok, geef_iterator()} | {error, term()}. +-spec reference_iterator(term(), iolist() | undefined) -> {ok, geef_ref:iterator()} | {error, term()}. reference_iterator(_Repo, _Regexp) -> nif_error(?LINE). --spec reference_next(geef_iterator()) -> {ok, term()} | {error, iterover | term()}. +-spec reference_next(geef_ref:iterator()) -> {ok, term()} | {error, iterover | term()}. reference_next(_Handle) -> nif_error(?LINE). @@ -69,6 +69,7 @@ reference_resolve(_Handle) -> reference_type(_Handle) -> nif_error(?LINE). +-spec reference_name(term()) -> {ok, binary()} | {error, term()}. reference_name(_Handle) -> nif_error(?LINE). diff --git a/src/geef_obj.erl b/src/geef_obj.erl index b6c186a..f8a4e15 100644 --- a/src/geef_obj.erl +++ b/src/geef_obj.erl @@ -6,9 +6,14 @@ -include("geef_records.hrl"). +-type object() :: #geef_object{type :: blob | tree | commit | tag}. +-type object(Type) :: #geef_object{type :: Type}. + +-export_type([object/0, object/1]). + -export([lookup/2, lookup/3]). --spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}. +-spec lookup(pid(), geef_oid:oid() | iolist()) -> {ok, object()} | {error, term()}. lookup(Repo, Id = #geef_oid{oid=Oid}) -> case geef_repo:lookup_object(Repo, Oid) of {ok, Type, Handle} -> @@ -20,7 +25,7 @@ lookup(Repo, Id) -> lookup(Repo, geef_oid:parse(Id)). %% As lookup/2, but it asserts that the type is correct --spec lookup(pid(), geef_oid() | iolist(), atom()) -> {ok, geef_object()} | {error, term()}. +-spec lookup(pid(), geef_oid:oid() | iolist(), atom()) -> {ok, object()} | {error, term()}. lookup(Repo, Id, Type) -> case lookup(Repo, Id) of {ok, Obj = #geef_object{type=Type}} -> diff --git a/src/geef_odb.erl b/src/geef_odb.erl index cde6927..a848c34 100644 --- a/src/geef_odb.erl +++ b/src/geef_odb.erl @@ -84,14 +84,14 @@ code_change(_OldVsn, State, _Extra) -> -include_lib("eunit/include/eunit.hrl"). -endif. --spec exists(pid(), geef_oid() | iolist()) -> boolean(). +-spec exists(pid(), geef_oid:oid() | iolist()) -> boolean(). exists(Pid, #geef_oid{oid=Oid}) -> gen_server:call(Pid, {exists, Oid}); exists(Pid, Sha) -> #geef_oid{oid=Oid} = geef_oid:parse(Sha), gen_server:call(Pid, {exists, Oid}). --spec write(pid(), iolist(), atom()) -> {ok, geef_oid()} | {error, term()}. +-spec write(pid(), iolist(), atom()) -> {ok, geef_oid:oid()} | {error, term()}. write(Pid, Contents, Type) -> gen_server:call(Pid, {write, Contents, Type}). diff --git a/src/geef_oid.erl b/src/geef_oid.erl index 4b51350..c39042d 100644 --- a/src/geef_oid.erl +++ b/src/geef_oid.erl @@ -7,15 +7,18 @@ -include("geef_records.hrl"). +-type oid() :: #geef_oid{oid :: binary()}. +-export_type([oid/0]). + -export([parse/1, hex/1]). %% @doc Get a hex-encoded string of the hash --spec hex(geef_oid()) -> binary(). +-spec hex(geef_oid:oid()) -> binary(). hex(#geef_oid{oid=Oid}) -> geef_nif:oid_fmt(Oid). %% @doc Parse an iolist as a hash --spec parse(iolist() | binary()) -> geef_oid(). +-spec parse(iolist() | binary()) -> geef_oid:oid(). parse(Sha) -> Oid = geef_nif:oid_parse(Sha), #geef_oid{oid=Oid}. diff --git a/src/geef_pkt.erl b/src/geef_pkt.erl index 48cdcf8..ebee037 100644 --- a/src/geef_pkt.erl +++ b/src/geef_pkt.erl @@ -15,7 +15,7 @@ line(Text) -> Prefix = io_lib:format("~4.16.0b", [Len]), [Prefix, Text, "\n"]. --spec parse(iolist()) -> {{want | have, geef_oid()}, binary()} | {error, ebufs}. +-spec parse(iolist()) -> {{want | have, geef_oid:oid()}, binary()} | {error, ebufs}. parse(In) -> case unpack(In) of Err = {error, ebufs} -> @@ -56,7 +56,7 @@ do_unpack(Len, Rest) when Len - 4 > size(Rest) -> do_unpack(Len, Rest) -> {Len - 4, Rest}. --spec parse_pkt(binary(), non_neg_integer()) -> {{want | have, geef_oid()}, binary()} | {done, binary()} | {flush, binary()}. +-spec parse_pkt(binary(), non_neg_integer()) -> {{want | have, geef_oid:oid()}, binary()} | {done, binary()} | {flush, binary()}. parse_pkt(In, 0) -> {flush, In}; parse_pkt(In, Len) -> diff --git a/src/geef_records.hrl b/src/geef_records.hrl index 4ab09db..7ddd4d4 100644 --- a/src/geef_records.hrl +++ b/src/geef_records.hrl @@ -1,26 +1,18 @@ --record(geef_reference, {handle, name :: binary(), type :: oid | symbolic, target :: binary() | geef_oid()}). +-record(geef_reference, {handle, name :: binary(), type :: oid | symbolic, target :: binary() | geef_oid:oid()}). -record(geef_oid, {oid :: binary()}). --record(geef_object, {type :: atom(), id :: geef_oid(), handle}). +-record(geef_object, {type :: atom(), id :: geef_oid:oid(), handle}). -record(geef_index_entry, {ctime :: non_neg_integer(), mtime :: non_neg_integer(), dev :: non_neg_integer(), ino :: non_neg_integer(), mode :: non_neg_integer(), uid :: non_neg_integer(), gid :: non_neg_integer(), size :: non_neg_integer(), - id :: geef_oid(), + id :: geef_oid:oid(), flags, flags_extended, path :: iolist()}). -record(geef_request, {service :: atom(), path :: binary(), host :: binary()}). -record(geef_tree_entry, {mode, type, id, name}). --record(geef_signature, {name :: iolist(), email :: iolist(), time :: geef_time()}). +-record(geef_signature, {name :: iolist(), email :: iolist(), time :: geef_sig:time()}). -record(geef_iterator, {type :: atom(), repo :: pid(), regexp :: iolist(), handle}). --type geef_reference() :: #geef_reference{name :: binary(), target :: binary() | geef_oid()}. --type geef_oid() :: #geef_oid{oid :: binary()}. --type geef_object() :: #geef_object{}. --type geef_index_entry() :: #geef_index_entry{}. -type geef_request() :: #geef_request{}. --type geef_tree_entry() :: #geef_tree_entry{}. --type geef_signature() :: #geef_signature{}. --type geef_time() :: {erlang:timestamp(), non_neg_integer()}. --type geef_iterator() :: #geef_iterator{}. diff --git a/src/geef_ref.erl b/src/geef_ref.erl index 4924093..70fe0d0 100644 --- a/src/geef_ref.erl +++ b/src/geef_ref.erl @@ -4,12 +4,16 @@ -include("geef_records.hrl"). --spec new(term()) -> geef_reference(). +-type iterator() :: #geef_iterator{type :: ref}. +-type ref() :: #geef_reference{name :: binary()}. +-export_type([reference/0, iterator/0]). + +-spec new(term()) -> ref(). new(Handle) -> {ok, Name} = geef_nif:reference_name(Handle), new(Name, Handle). --spec new(binary(), term()) -> geef_reference(). +-spec new(binary(), term()) -> ref(). new(Name, Handle) -> Type = geef_nif:reference_type(Handle), Bin = geef_nif:reference_target(Handle), @@ -21,7 +25,7 @@ new(Name, Handle) -> end, #geef_reference{handle=Handle, name=Name, type=Type, target=Target}. --spec create(pid(), iolist(), geef_oid() | binary(), boolean()) -> {ok, geef_reference()} | {error, term()}. +-spec create(pid(), iolist(), geef_oid:oid() | binary(), boolean()) -> {ok, ref()} | {error, term()}. create(Repo, Refname, Target, Force) -> case geef_repo:create_reference(Repo, Refname, Target, Force) of {ok, Ref} -> @@ -30,7 +34,7 @@ create(Repo, Refname, Target, Force) -> Err end. --spec lookup(pid(), iolist()) -> {ok, geef_reference()} | {error, term()}. +-spec lookup(pid(), iolist()) -> {ok, ref()} | {error, term()}. lookup(Repo, Refname) -> Name = iolist_to_binary(Refname), case geef_repo:lookup_reference(Repo, Name) of @@ -40,7 +44,7 @@ lookup(Repo, Refname) -> Other end. --spec iterator(pid(), iolist() | undefined) -> {ok, geef_iterator()} | {error, term()}. +-spec iterator(pid(), iolist() | undefined) -> {ok, iterator()} | {error, term()}. iterator(Repo, Regexp) -> case geef_repo:iterator(Repo, Regexp) of {ok, Handle} -> @@ -49,10 +53,11 @@ iterator(Repo, Regexp) -> Other end. --spec iterator(pid()) -> {ok, geef_iterator()} | {error, term()}. +-spec iterator(pid()) -> {ok, iterator()} | {error, term()}. iterator(Repo) -> iterator(Repo, undefined). +-spec next(iterator()) -> {ok, ref()} | {error, term()}. next(#geef_iterator{type=ref, handle=Handle}) -> case geef_nif:reference_next(Handle) of {ok, RefHandle} -> @@ -61,18 +66,18 @@ next(#geef_iterator{type=ref, handle=Handle}) -> Other end. --spec resolve(geef_reference()) -> {ok, geef_reference()} | {error, term()}. +-spec resolve(ref()) -> {ok, ref()} | {error, term()}. resolve(Ref = #geef_reference{type=oid}) -> {ok, Ref}; % resolving an oid ref is a no-op, skip going into the NIF -resolve(#geef_reference{handle=Handle}) -> +resolve(#geef_reference{type=symbolic, handle=Handle}) -> case geef_nif:reference_resolve(Handle) of {ok, Ref} -> {ok, new(Ref)}; - Other -> + Other = {error, _} -> Other end. --spec dwim(pid(), iolist()) -> {ok, geef_reference()} | {error, term()}. +-spec dwim(pid(), iolist()) -> {ok, ref()} | {error, term()}. dwim(Repo, Name) -> case geef_repo:reference_dwim(Repo, Name) of {ok, Handle} -> @@ -82,7 +87,7 @@ dwim(Repo, Name) -> end. %% @doc Get the shorthand name for a particular reference --spec shorthand(geef_reference() | binary()) -> binary(). +-spec shorthand(ref() | binary()) -> binary(). shorthand(<<"refs/heads/", Rest/binary>>) -> Rest; shorthand(<<"refs/tags/", Rest/binary>>) -> diff --git a/src/geef_repo.erl b/src/geef_repo.erl index 9f20b08..623df3b 100644 --- a/src/geef_repo.erl +++ b/src/geef_repo.erl @@ -87,7 +87,7 @@ lookup_reference(Pid, Name) -> gen_server:call(Pid, {lookup_reference, Name}). %% @private --spec iterator(pid(), iolist() | undefined) -> {ok, geef_iterator()} | {error, term()}. +-spec iterator(pid(), iolist() | undefined) -> {ok, geef_ref:iterator()} | {error, term()}. iterator(Pid, Regexp) -> gen_server:call(Pid, {iterator, Regexp}). diff --git a/src/geef_revwalk.erl b/src/geef_revwalk.erl index 4920cb4..6a02cca 100644 --- a/src/geef_revwalk.erl +++ b/src/geef_revwalk.erl @@ -28,7 +28,7 @@ %% @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 %% must be pushed before starting a walk. --spec push(pid(), geef_oid() | iolist()) -> ok | {error, binary()}. +-spec push(pid(), geef_oid:oid() | iolist()) -> ok | {error, binary()}. push(Pid, #geef_oid{oid=Oid}) -> gen_server:call(Pid, {push, Oid}); push(Pid, Id) -> @@ -38,7 +38,7 @@ push(Pid, Id) -> %% @doc Hide a commit. Hide a commit and its parents. Any Parent of %% this commit won't be included in the walk. --spec hide(pid(), geef_oid() | iolist()) -> ok | {error, binary()}. +-spec hide(pid(), geef_oid:oid() | iolist()) -> ok | {error, binary()}. hide(Pid, #geef_oid{oid=Oid}) -> gen_server:call(Pid, {hide, Oid}); hide(Pid, Id) -> diff --git a/src/geef_sig.erl b/src/geef_sig.erl index 972fec0..afb7d70 100644 --- a/src/geef_sig.erl +++ b/src/geef_sig.erl @@ -2,9 +2,13 @@ -include("geef_records.hrl"). +-type time() :: {erlang:timestamp(), non_neg_integer()}. +-type signature() :: #geef_signature{}. +-export_type([time/0, signature/0]). + -export([new/2, new/3]). --spec new(iolist(), iolist()) -> {ok, geef_signature()} | {error, term()}. +-spec new(iolist(), iolist()) -> {ok, signature()} | {error, term()}. new(Name0, Email0) -> case geef_nif:signature_new(Name0, Email0) of {ok, Name, Email, Time0, Offset} -> @@ -14,7 +18,7 @@ new(Name0, Email0) -> Err end. --spec new(iolist(), iolist(), geef_time()) -> {ok, geef_signature()} | {error, term()}. +-spec new(iolist(), iolist(), time()) -> {ok, signature()} | {error, term()}. new(Name0, Email0, Time) -> case geef_nif:signature_new(Name0, Email0, 0) of {ok, Name, Email} -> diff --git a/src/geef_tag.erl b/src/geef_tag.erl index 4762c93..460cd26 100644 --- a/src/geef_tag.erl +++ b/src/geef_tag.erl @@ -8,11 +8,14 @@ -include("geef_records.hrl"). --spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}. +-type tag() :: geef_obj:object(tag). +-export_type([tag/0]). + +-spec lookup(pid(), geef_oid:oid() | iolist()) -> {ok, tag()} | {error, term()}. lookup(Repo, Id) -> geef_obj:lookup(Repo, Id, tag). --spec peel(geef_object()) -> {ok, geef_object()} | {error, term()}. +-spec peel(tag()) -> {ok, geef_obj:object()} | {error, term()}. peel(#geef_object{type=tag, handle=Handle}) -> case geef_nif:tag_peel(Handle) of {ok, Type, Oid, PeeledHandle} -> diff --git a/src/geef_tree.erl b/src/geef_tree.erl index 2f9dc31..3f55444 100644 --- a/src/geef_tree.erl +++ b/src/geef_tree.erl @@ -8,24 +8,29 @@ -include("geef_records.hrl"). +-type tree() :: geef_obj:object(tree). +-type entry() :: #geef_tree_entry{}. +-export_type([tree/0, entry/0]). + + from_nif({ok, Mode, Type, Oid, Name}) -> {ok, #geef_tree_entry{mode=Mode, type=Type, id=#geef_oid{oid=Oid}, name=Name}}; from_nif(Err = {error, _}) -> Err. --spec get(geef_object(), iolist()) -> {ok, geef_tree_entry()} | {error, term()}. +-spec get(tree(), iolist()) -> {ok, entry()} | {error, term()}. get(#geef_object{type=tree,handle=Handle}, Path) -> from_nif(geef_nif:tree_bypath(Handle, Path)). --spec nth(geef_object(), non_neg_integer()) -> {ok, geef_tree_entry()} | {error, term()}. +-spec nth(tree(), non_neg_integer()) -> {ok, entry()} | {error, term()}. nth(#geef_object{type=tree,handle=Handle}, Nth) -> from_nif(geef_nif:tree_nth(Handle, Nth)). --spec count(geef_object()) -> non_neg_integer(). +-spec count(tree()) -> non_neg_integer(). count(#geef_object{type=tree,handle=Handle}) -> geef_nif:tree_count(Handle). --spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}. +-spec lookup(pid(), geef_oid:oid() | iolist()) -> {ok, tree()} | {error, term()}. lookup(Repo, Id) -> geef_obj:lookup(Repo, Id, tree).