diff --git a/c_src/index.c b/c_src/index.c index 2c7264f..ab8586a 100644 --- a/c_src/index.c +++ b/c_src/index.c @@ -107,15 +107,14 @@ geef_index_add(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) if (!enif_get_tuple(env, argv[1], &arity, &eentry)) return enif_make_badarg(env); - if (arity != 13) - return enif_make_badarg(env); - - /* TODO: check for the 'tree_entry' tag */ memset(&entry, 0, sizeof(entry)); if (!enif_get_uint(env, eentry[5], &entry.mode)) return enif_make_badarg(env); + if (!enif_get_int64(env, eentry[8], &entry.file_size)) + return enif_make_badarg(env); + if (!enif_inspect_iolist_as_binary(env, eentry[12], &path)) return enif_make_badarg(env); @@ -152,7 +151,7 @@ geef_index_count(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) ERL_NIF_TERM entry_to_term(ErlNifEnv *env, const git_index_entry *entry) { ErlNifBinary id, path; - ERL_NIF_TERM mode; + ERL_NIF_TERM mode, file_size; size_t len; if (geef_oid_bin(&id, &entry->oid) < 0) @@ -166,9 +165,10 @@ ERL_NIF_TERM entry_to_term(ErlNifEnv *env, const git_index_entry *entry) memcpy(path.data, entry->path, len); mode = enif_make_uint(env, entry->mode); + file_size = enif_make_int64(env, entry->file_size); - return enif_make_tuple4(env, atoms.ok, enif_make_binary(env, &path), enif_make_binary(env, &id), - mode); + return enif_make_tuple5(env, atoms.ok, enif_make_binary(env, &path), enif_make_binary(env, &id), + mode, file_size); } ERL_NIF_TERM diff --git a/src/geef_index.erl b/src/geef_index.erl index cdee3a9..0bc1d38 100644 --- a/src/geef_index.erl +++ b/src/geef_index.erl @@ -74,8 +74,8 @@ get(Pid, Path, Stage) -> nth(Pid, Nth) -> maybe_entry(gen_server:call(Pid, {nth, Nth})). -maybe_entry({ok, Path, Id, Mode}) -> - {ok, #geef_index_entry{path=Path, id=#geef_oid{oid=Id}, mode=Mode}}; +maybe_entry({ok, Path, Id, Mode, Size}) -> + {ok, #geef_index_entry{path=Path, id=#geef_oid{oid=Id}, mode=Mode, size=Size}}; maybe_entry(Error = {error, _}) -> Error. @@ -136,7 +136,7 @@ handle_call({get, Path, Stage}, _From, State = #state{handle=Handle}) -> Reply = geef_nif:index_get(Handle, Path, Stage), {reply, Reply, State}; -handle_call({add, Entry}, _From, State = #state{handle=Handle}) -> +handle_call({add, Entry = #geef_index_entry{}}, _From, State = #state{handle=Handle}) -> Reply = geef_nif:index_add(Handle, Entry), {reply, Reply, State}. diff --git a/src/geef_records.hrl b/src/geef_records.hrl index 433eaff..c7c2534 100644 --- a/src/geef_records.hrl +++ b/src/geef_records.hrl @@ -5,7 +5,7 @@ {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(), + size = 0 :: non_neg_integer(), id :: geef_oid:oid(), flags, flags_extended, path :: iolist()}). diff --git a/test/repo_test.erl b/test/repo_test.erl index 28213f0..071b0aa 100644 --- a/test/repo_test.erl +++ b/test/repo_test.erl @@ -30,13 +30,14 @@ index_add_test(Repo) -> {ok, Odb} = geef_repo:odb(Repo), {ok, BlobId} = geef_odb:write(Odb, Data, blob), {ok, Idx} = geef_index:new(), - Entry = #geef_index_entry{mode=8#100644, id=BlobId, path="README"}, + Entry = #geef_index_entry{mode=8#100644, id=BlobId, path="README", size=size(Data)}, ok = geef_index:add(Idx, Entry), {ok, TreeId} = geef_index:write_tree(Idx, Repo), Expected = geef_oid:parse("5a20bbbf65ea75ad4d9f995d179156824ccca3a1"), {ok, Entry1} = geef_index:get(Idx, "README", 0), [?_assertEqual(Expected, TreeId), ?_assertEqual(BlobId, Entry1#geef_index_entry.id), + ?_assertEqual(size(Data), Entry1#geef_index_entry.size), ?_assertEqual(geef_index:count(Idx), 1)]. ref_test(Repo) ->