diff --git a/c_src/index.c b/c_src/index.c index ce270b7..fd97753 100644 --- a/c_src/index.c +++ b/c_src/index.c @@ -98,6 +98,7 @@ geef_index_add(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) geef_index *index; const ERL_NIF_TERM *eentry; int arity; + unsigned int tmp; ErlNifBinary path, id; git_index_entry entry; @@ -109,12 +110,48 @@ geef_index_add(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) memset(&entry, 0, sizeof(entry)); + if (enif_compare(eentry[1], atoms.undefined) && + !enif_get_int64(env, eentry[1], &entry.ctime.seconds)) + return enif_make_badarg(env); + + if (enif_compare(eentry[2], atoms.undefined) && + !enif_get_int64(env, eentry[2], &entry.mtime.seconds)) + return enif_make_badarg(env); + + if (enif_compare(eentry[3], atoms.undefined) && + !enif_get_uint(env, eentry[3], &entry.dev)) + return enif_make_badarg(env); + + if (enif_compare(eentry[4], atoms.undefined) && + !enif_get_uint(env, eentry[4], &entry.ino)) + return enif_make_badarg(env); + if (!enif_get_uint(env, eentry[5], &entry.mode)) return enif_make_badarg(env); + if (enif_compare(eentry[6], atoms.undefined) && + !enif_get_uint(env, eentry[6], &entry.uid)) + return enif_make_badarg(env); + + if (enif_compare(eentry[7], atoms.undefined) && + !enif_get_uint(env, eentry[7], &entry.gid)) + return enif_make_badarg(env); + if (!enif_get_int64(env, eentry[8], &entry.file_size)) return enif_make_badarg(env); + /* [9] comes later */ + + if (enif_compare(eentry[10], atoms.undefined) && + !enif_get_uint(env, eentry[10], &tmp)) + return enif_make_badarg(env); + entry.flags = tmp; + + if (enif_compare(eentry[11], atoms.undefined) && + !enif_get_uint(env, eentry[11], &tmp)) + return enif_make_badarg(env); + entry.flags_extended = tmp; + if (!enif_inspect_iolist_as_binary(env, eentry[12], &path)) return enif_make_badarg(env); diff --git a/test/repo_test.erl b/test/repo_test.erl index f2c0221..5b4e3ed 100644 --- a/test/repo_test.erl +++ b/test/repo_test.erl @@ -36,7 +36,9 @@ 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", size=size(Data)}, + {NowMega, NowSecs, _} = os:timestamp(), + Time = NowMega * 1000000 + NowSecs, + Entry = #geef_index_entry{mode=8#100644, id=BlobId, path="README", size=size(Data), mtime=Time}, ok = geef_index:add(Idx, Entry), {ok, TreeId} = geef_index:write_tree(Idx, Repo), Expected = geef_oid:parse("5a20bbbf65ea75ad4d9f995d179156824ccca3a1"), @@ -44,6 +46,7 @@ index_add_test(Repo) -> [?_assertEqual(Expected, TreeId), ?_assertEqual(BlobId, Entry1#geef_index_entry.id), ?_assertEqual(size(Data), Entry1#geef_index_entry.size), + ?_assertEqual(Time, Entry1#geef_index_entry.mtime), ?_assertEqual(geef_index:count(Idx), 1)]. ref_test(Repo) ->