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.
This commit is contained in:
@@ -98,6 +98,7 @@ geef_index_add(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
|
|||||||
geef_index *index;
|
geef_index *index;
|
||||||
const ERL_NIF_TERM *eentry;
|
const ERL_NIF_TERM *eentry;
|
||||||
int arity;
|
int arity;
|
||||||
|
unsigned int tmp;
|
||||||
ErlNifBinary path, id;
|
ErlNifBinary path, id;
|
||||||
git_index_entry entry;
|
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));
|
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))
|
if (!enif_get_uint(env, eentry[5], &entry.mode))
|
||||||
return enif_make_badarg(env);
|
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))
|
if (!enif_get_int64(env, eentry[8], &entry.file_size))
|
||||||
return enif_make_badarg(env);
|
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))
|
if (!enif_inspect_iolist_as_binary(env, eentry[12], &path))
|
||||||
return enif_make_badarg(env);
|
return enif_make_badarg(env);
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,9 @@ index_add_test(Repo) ->
|
|||||||
{ok, Odb} = geef_repo:odb(Repo),
|
{ok, Odb} = geef_repo:odb(Repo),
|
||||||
{ok, BlobId} = geef_odb:write(Odb, Data, blob),
|
{ok, BlobId} = geef_odb:write(Odb, Data, blob),
|
||||||
{ok, Idx} = geef_index:new(),
|
{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 = geef_index:add(Idx, Entry),
|
||||||
{ok, TreeId} = geef_index:write_tree(Idx, Repo),
|
{ok, TreeId} = geef_index:write_tree(Idx, Repo),
|
||||||
Expected = geef_oid:parse("5a20bbbf65ea75ad4d9f995d179156824ccca3a1"),
|
Expected = geef_oid:parse("5a20bbbf65ea75ad4d9f995d179156824ccca3a1"),
|
||||||
@@ -44,6 +46,7 @@ index_add_test(Repo) ->
|
|||||||
[?_assertEqual(Expected, TreeId),
|
[?_assertEqual(Expected, TreeId),
|
||||||
?_assertEqual(BlobId, Entry1#geef_index_entry.id),
|
?_assertEqual(BlobId, Entry1#geef_index_entry.id),
|
||||||
?_assertEqual(size(Data), Entry1#geef_index_entry.size),
|
?_assertEqual(size(Data), Entry1#geef_index_entry.size),
|
||||||
|
?_assertEqual(Time, Entry1#geef_index_entry.mtime),
|
||||||
?_assertEqual(geef_index:count(Idx), 1)].
|
?_assertEqual(geef_index:count(Idx), 1)].
|
||||||
|
|
||||||
ref_test(Repo) ->
|
ref_test(Repo) ->
|
||||||
|
|||||||
Reference in New Issue
Block a user