From 6c272e2c30cb1097b5513d31199a568ef8cb86a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Wed, 16 Oct 2013 15:01:16 +0200 Subject: [PATCH] index: write out all fields to disc There is still now way to access what the flags mean, and the times need to be in pure timestamp form, rather than erlang's. Non-essential fields are allowed to be 'undefined' and then the entry's field will remain zeroed. --- c_src/index.c | 37 +++++++++++++++++++++++++++++++++++++ test/repo_test.erl | 5 ++++- 2 files changed, 41 insertions(+), 1 deletion(-) 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) ->