From 4a2f2e8ab29ed1900c03fffe0c3d285566808dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Mon, 13 May 2013 10:55:18 +0200 Subject: [PATCH] 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. --- src/geef_blob.erl | 10 +++++----- src/geef_commit.erl | 14 +++++++------- src/geef_index.erl | 12 ++++++------ src/geef_object.erl | 26 +++++++++++++------------- src/geef_odb.erl | 12 ++++++------ src/geef_oid.erl | 8 ++++---- src/geef_records.hrl | 24 ++++++++++-------------- src/geef_ref.erl | 27 +++++++++++---------------- src/geef_repo.erl | 8 ++++---- src/geef_revwalk.erl | 14 +++++++------- src/geef_tree.erl | 14 +++++++------- test/repo_test.erl | 6 +++--- 12 files changed, 83 insertions(+), 92 deletions(-) diff --git a/src/geef_blob.erl b/src/geef_blob.erl index 3ce41f9..09cadf3 100644 --- a/src/geef_blob.erl +++ b/src/geef_blob.erl @@ -8,18 +8,18 @@ -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) -> geef_object:lookup(Repo, Id, blob). --spec id(object()) -> oid(). -id(Obj = #object{type=blob}) -> +-spec id(geef_object()) -> geef_oid(). +id(Obj = #geef_object{type=blob}) -> geef_object:id(Obj). -size(#object{type=blob, handle=Handle}) -> +size(#geef_object{type=blob, handle=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), Content. diff --git a/src/geef_commit.erl b/src/geef_commit.erl index 097d788..db97c49 100644 --- a/src/geef_commit.erl +++ b/src/geef_commit.erl @@ -3,22 +3,22 @@ -include("geef_records.hrl"). --spec tree_id(object()) -> oid(). -tree_id(#object{type=commit,handle=Handle}) -> +-spec tree_id(geef_object()) -> geef_oid(). +tree_id(#geef_object{type=commit,handle=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 {ok, Type, Handle} -> - {ok, #object{type=Type, handle=Handle}}; + {ok, #geef_object{type=Type, handle=Handle}}; Other -> Other end. --spec lookup(repo(), oid() | iolist()) -> object(). +-spec lookup(pid(), geef_oid() | iolist()) -> geef_object(). lookup(Repo, Id) -> geef_object:lookup(Repo, Id, commit). -id(Obj = #object{type=commit}) -> +id(Obj = #geef_object{type=commit}) -> geef_object:id(Obj). diff --git a/src/geef_index.erl b/src/geef_index.erl index 4d20d61..7fbdd90 100644 --- a/src/geef_index.erl +++ b/src/geef_index.erl @@ -39,20 +39,20 @@ write(Pid) -> gen_server:call(Pid, write). %% @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) -> gen_server:call(Pid, write_tree). %% @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) -> 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}). %% @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) -> gen_server:call(Pid, {add, Entry}). @@ -83,12 +83,12 @@ handle_call(write, _From, State = #state{handle=Handle}) -> {reply, Reply, State}; handle_call(write_tree, _From, State = #state{handle=Handle}) -> {ok, Oid} = geef_nif:index_write_tree(Handle), - Reply = #oid{oid=Oid}, + Reply = #geef_oid{oid=Oid}, {reply, Reply, State}; handle_call({write_tree, Repo}, _From, State = #state{handle=Handle}) -> RepoHandle = geef_repo:handle(Repo), {ok, Oid} = geef_nif:index_write_tree(Handle, RepoHandle), - Reply = {ok, #oid{oid=Oid}}, + Reply = {ok, #geef_oid{oid=Oid}}, {reply, Reply, State}; handle_call(clear, _From, State = #state{handle=Handle}) -> Reply = geef_nif:index_clear(Handle), diff --git a/src/geef_object.erl b/src/geef_object.erl index ceeaca8..644b3b3 100644 --- a/src/geef_object.erl +++ b/src/geef_object.erl @@ -8,11 +8,11 @@ -export([lookup/2, lookup/3, id/1]). --spec lookup(pid(), oid() | iolist()) -> {ok, object()} | {error, term()}. -lookup(Repo, #oid{oid=Oid}) -> +-spec lookup(pid(), geef_oid() | iolist()) -> {ok, geef_object()} | {error, term()}. +lookup(Repo, #geef_oid{oid=Oid}) -> case geef_repo:lookup_object(Repo, Oid) of {ok, Type, Handle} -> - {ok, #object{type=Type, handle=Handle}}; + {ok, #geef_object{type=Type, handle=Handle}}; {error, Err} -> {error, Err} end; @@ -20,20 +20,20 @@ lookup(Repo, Id) -> lookup(Repo, geef_oid:parse(Id)). %% 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) -> case lookup(Repo, Id) of - {ok, Obj = #object{type=Type}} -> + {ok, Obj = #geef_object{type=Type}} -> {ok, Obj}; {error, Err} -> {error, Err} end. --spec id(object()) -> {ok, oid()} | {error, term()}. -id(#object{handle=Handle}) -> +-spec id(geef_object()) -> {ok, geef_oid()} | {error, term()}. +id(#geef_object{handle=Handle}) -> case geef_nif:object_id(Handle) of {ok, Oid} -> - #oid{oid=Oid}; + #geef_oid{oid=Oid}; Other -> Other end. @@ -42,16 +42,16 @@ id(#object{handle=Handle}) -> lookup_test() -> {ok, Repo} = geef_repo:open(".."), - {ok, #object{type=commit}} = lookup(Repo, geef_oid:parse("b5b68cce8b92ca0e7bd48430617ac10c0f2c2923")), - {ok, #object{type=commit}} = lookup(Repo, "b5b68cce8b92ca0e7bd48430617ac10c0f2c2923"), - {ok, #object{type=commit}} = lookup(Repo, ["b5b68cce8b92ca0e7", "bd48430617ac10c0f2c2923"]), - {ok, #object{type=commit}} = lookup(Repo, <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>). + {ok, #geef_object{type=commit}} = lookup(Repo, geef_oid:parse("b5b68cce8b92ca0e7bd48430617ac10c0f2c2923")), + {ok, #geef_object{type=commit}} = lookup(Repo, "b5b68cce8b92ca0e7bd48430617ac10c0f2c2923"), + {ok, #geef_object{type=commit}} = lookup(Repo, ["b5b68cce8b92ca0e7", "bd48430617ac10c0f2c2923"]), + {ok, #geef_object{type=commit}} = lookup(Repo, <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>). id_test() -> {ok, Repo} = geef_repo:open(".."), Sha = <<"b5b68cce8b92ca0e7bd48430617ac10c0f2c2923">>, 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). -endif. diff --git a/src/geef_odb.erl b/src/geef_odb.erl index 5b36b5f..807b254 100644 --- a/src/geef_odb.erl +++ b/src/geef_odb.erl @@ -8,17 +8,17 @@ -include("geef_records.hrl"). --spec exists(odb(), oid() | iolist()) -> boolean(). -exists(#odb{handle=Handle}, #oid{oid=Oid}) -> +-spec exists(geef_odb(), geef_oid() | iolist()) -> boolean(). +exists(#geef_odb{handle=Handle}, #geef_oid{oid=Oid}) -> geef_nif:odb_object_exists(Handle, Oid); -exists(Odb = #odb{}, Sha) -> +exists(Odb = #geef_odb{}, Sha) -> exists(Odb, geef_oid:parse(Sha)). --spec write(odb(), iolist(), atom()) -> {ok, oid()} | {error, term}. -write(#odb{handle=Handle}, Contents, Type) -> +-spec write(geef_odb(), iolist(), atom()) -> {ok, geef_oid()} | {error, term}. +write(#geef_odb{handle=Handle}, Contents, Type) -> case geef_nif:odb_write(Handle, Contents, Type) of {ok, Oid} -> - {ok, #oid{oid=Oid}}; + {ok, #geef_oid{oid=Oid}}; Other -> Other end. diff --git a/src/geef_oid.erl b/src/geef_oid.erl index 7c1b5c2..b1bddb8 100644 --- a/src/geef_oid.erl +++ b/src/geef_oid.erl @@ -10,15 +10,15 @@ -export([parse/1, fmt/1]). %% @doc Get the hex-encoded hash --spec fmt(oid()) -> binary(). -fmt(#oid{oid=Oid}) -> +-spec fmt(geef_oid()) -> binary(). +fmt(#geef_oid{oid=Oid}) -> geef_nif:oid_fmt(Oid). %% @doc Parse an iolist as a hash --spec parse(iolist()) -> oid(). +-spec parse(iolist()) -> geef_oid(). parse(Sha) -> Oid = geef_nif:oid_parse(Sha), - #oid{oid=Oid}. + #geef_oid{oid=Oid}. -ifdef(TEST). diff --git a/src/geef_records.hrl b/src/geef_records.hrl index f695b6e..3037ec5 100644 --- a/src/geef_records.hrl +++ b/src/geef_records.hrl @@ -1,15 +1,11 @@ --record(ref, {handle, type :: atom(), target :: binary() | oid()}). --record(repo, {handle}). --record(odb, {handle}). --record(revwalk, {handle}). --record(oid, {oid}). --record(object, {type :: atom(), handle}). --record(index_entry, {mode, id :: oid(), path :: iolist()}). +-record(geef_ref, {handle, type :: atom(), target :: binary() | geef_oid()}). +-record(geef_odb, {handle}). +-record(geef_oid, {oid}). +-record(geef_object, {type :: atom(), handle}). +-record(geef_index_entry, {mode, id :: geef_oid(), path :: iolist()}). --type ref() :: #ref{}. --type repo() :: #repo{}. --type revwalk() :: #revwalk{}. --type odb() :: #odb{}. --type oid() :: #oid{}. --type object() :: #object{}. --type index_entry() :: #index_entry{}. +-type geef_ref() :: #geef_ref{}. +-type geef_odb() :: #geef_odb{}. +-type geef_oid() :: #geef_oid{}. +-type geef_object() :: #geef_object{}. +-type geef_index_entry() :: #geef_index_entry{}. diff --git a/src/geef_ref.erl b/src/geef_ref.erl index 8f7dc74..876e0a2 100644 --- a/src/geef_ref.erl +++ b/src/geef_ref.erl @@ -1,10 +1,10 @@ -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"). --spec new(term()) -> ref(). +-spec new(term()) -> geef_ref(). new(Handle) -> Type = geef_nif:reference_type(Handle), Bin = geef_nif:reference_target(Handle), @@ -12,17 +12,17 @@ new(Handle) -> symbolic -> Bin; oid -> - #oid{oid=Bin} + #geef_oid{oid=Bin} 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) -> {ok, Ref} = geef_repo:create_reference(Repo, Refname, Target, Force), {ok, new(Ref)}. --spec lookup(pid(), iolist()) -> {ok, ref()} | {error, term()}. +-spec lookup(pid(), iolist()) -> {ok, geef_ref()} | {error, term()}. lookup(Repo, Refname) -> case geef_repo:lookup_reference(Repo, Refname) of {ok, Ref} -> @@ -31,8 +31,8 @@ lookup(Repo, Refname) -> Other end. --spec resolve(ref()) -> {ok, ref()} | {error, term()}. -resolve(#ref{handle=Handle}) -> +-spec resolve(geef_ref()) -> {ok, geef_ref()} | {error, term()}. +resolve(#geef_ref{handle=Handle}) -> case geef_nif:reference_resolve(Handle) of {ok, Ref} -> {ok, new(Ref)}; @@ -40,11 +40,6 @@ resolve(#ref{handle=Handle}) -> Other end. --spec name_to_id(repo(), iolist()) -> {ok, oid()} | {error, binary()}. -name_to_id(#repo{handle=Handle}, Name) -> - case geef_nif:reference_to_id(Handle, Name) of - {ok, Oid} -> - {ok, #oid{oid=Oid}}; - Other -> - Other - end. +-spec target(geef_ref()) -> {geef_oid(), binary()}. +target(#geef_ref{target=Target}) -> + Target. diff --git a/src/geef_repo.erl b/src/geef_repo.erl index 9115570..591b9cd 100644 --- a/src/geef_repo.erl +++ b/src/geef_repo.erl @@ -33,7 +33,7 @@ discover(Path) -> %% @doc Open an existing repository. Path must point to the git-dir or %% worktree --spec open(iolist()) -> {ok, repo()} | {error, term()}. +-spec open(iolist()) -> {ok, pid()} | {error, term()}. open(Path) -> case geef_nif:repository_open(Path) of {ok, Handle} -> @@ -64,7 +64,7 @@ workdir(Pid) -> %% @doc The repository's current object database. This encompasses all %% the configured backends. --spec odb(pid()) -> {ok, odb()} | {error, term}. +-spec odb(pid()) -> {ok, geef_odb()} | {error, term}. odb(Pid) -> gen_server:call(Pid, odb). @@ -176,7 +176,7 @@ start_link(Handle) -> handle_odb(Handle) -> case geef_nif:repository_get_odb(Handle) of {ok, OdbHandle} -> - {ok, #odb{handle=OdbHandle}}; + {ok, #geef_odb{handle=OdbHandle}}; Other -> Other end. @@ -189,7 +189,7 @@ handle_revwalk(Handle) -> Error 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); handle_create_reference(Repo, Refname, Target, Force) -> geef_nif:reference_create(Repo, Refname, symbolic, Target, Force). diff --git a/src/geef_revwalk.erl b/src/geef_revwalk.erl index 9c0d2cc..4920cb4 100644 --- a/src/geef_revwalk.erl +++ b/src/geef_revwalk.erl @@ -28,21 +28,21 @@ %% @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(), oid() | iolist()) -> ok | {error, binary()}. -push(Pid, #oid{oid=Oid}) -> +-spec push(pid(), geef_oid() | iolist()) -> ok | {error, binary()}. +push(Pid, #geef_oid{oid=Oid}) -> gen_server:call(Pid, {push, Oid}); push(Pid, Id) -> - #oid{oid=Oid} = geef_oid:parse(Id), + #geef_oid{oid=Oid} = geef_oid:parse(Id), gen_server:call(Pid, {push, Oid}). %% @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(), oid() | iolist()) -> ok | {error, binary()}. -hide(Pid, #oid{oid=Oid}) -> +-spec hide(pid(), geef_oid() | iolist()) -> ok | {error, binary()}. +hide(Pid, #geef_oid{oid=Oid}) -> gen_server:call(Pid, {hide, Oid}); hide(Pid, Id) -> - #oid{oid=Oid} = geef_oid:parse(Id), + #geef_oid{oid=Oid} = geef_oid:parse(Id), gen_server:call(Pid, {hide, Oid}). @@ -118,7 +118,7 @@ code_change(_OldVsn, State, _Extra) -> handle_next(Handle) -> case geef_nif:revwalk_next(Handle) of {ok, Oid} -> - {ok, #oid{oid=Oid}}; + {ok, #geef_oid{oid=Oid}}; Other -> Other end. diff --git a/src/geef_tree.erl b/src/geef_tree.erl index f13321c..7e06903 100644 --- a/src/geef_tree.erl +++ b/src/geef_tree.erl @@ -8,20 +8,20 @@ -include("geef_records.hrl"). --spec get(object(), iolist()) -> {ok, integer(), atom(), oid(), binary()} | {error, term()}. -get(#object{type=tree,handle=Handle}, Path) -> +-spec get(geef_object(), iolist()) -> {ok, integer(), atom(), geef_oid(), binary()} | {error, term()}. +get(#geef_object{type=tree,handle=Handle}, Path) -> case geef_nif:tree_bypath(Handle, Path) of - {ok, Mode, Type, Oid, Name} -> - {ok, Mode, Type, #oid{oid=Oid}, Name}; + {ok, Mode, Type, Geef_Oid, Name} -> + {ok, Mode, Type, #geef_oid{oid=Geef_Oid}, Name}; Other -> Other end. --spec id(object()) -> {ok, oid()} | {error, term()}. -id(Obj = #object{type=tree}) -> +-spec id(geef_object()) -> {ok, geef_oid()} | {error, term()}. +id(Obj = #geef_object{type=tree}) -> 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) -> geef_object:lookup(Repo, Id, tree). diff --git a/test/repo_test.erl b/test/repo_test.erl index 49cbbea..a036315 100644 --- a/test/repo_test.erl +++ b/test/repo_test.erl @@ -29,7 +29,7 @@ index_add_test(Repo) -> {ok, Odb} = geef_repo:odb(Repo), {ok, BlobId} = geef_odb:write(Odb, Data, blob), {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, TreeId} = geef_index:write_tree(Idx, Repo), 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, Ref0} = geef_ref:lookup(Repo, "refs/heads/branch"), {ok, Ref1} = geef_ref:lookup(Repo, "refs/heads/other"), - [?_assertEqual(Ref0#ref.target, Id), - ?_assertEqual(Ref1#ref.target, <<"refs/heads/branch">>)]. + [?_assertEqual(Ref0#geef_ref.target, Id), + ?_assertEqual(Ref1#geef_ref.target, <<"refs/heads/branch">>)]. rm_r(Path) -> case filelib:is_dir(Path) of