Added fs.is_newer function to filesystem library
This commit is contained in:
@@ -20,6 +20,11 @@ int lua_fs_forall_dir_next(lua_State* L);
|
|||||||
int lua_fs_foreach_dir_dtor(lua_State* L);
|
int lua_fs_foreach_dir_dtor(lua_State* L);
|
||||||
int lua_fs_forall_dir_dtor(lua_State* L);
|
int lua_fs_forall_dir_dtor(lua_State* L);
|
||||||
|
|
||||||
|
// Returns true when a is newer than b. If b does not exist it returns true. If a does not exist it returns false
|
||||||
|
// boolean | table<boolean> function fs.is_newer(path_a: string | number, path_b: string | table[string])
|
||||||
|
int lua_fs_is_newer(lua_State* L);
|
||||||
|
// table<string> | nil function fs.filter_newer(path_a: string | number, path_b: string | table[string])
|
||||||
|
int lua_fs_filter_newer(lua_State* L);
|
||||||
|
|
||||||
// number | nil function fs.last_modified(path: string)
|
// number | nil function fs.last_modified(path: string)
|
||||||
int lua_fs_last_modified(lua_State* L);
|
int lua_fs_last_modified(lua_State* L);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
#include "lua_filesystem.h"
|
#include "lua_filesystem.h"
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
int luaopen_filesystem(lua_State* L)
|
int luaopen_filesystem(lua_State* L)
|
||||||
{
|
{
|
||||||
@@ -18,6 +19,12 @@ int luaopen_filesystem(lua_State* L)
|
|||||||
// Push functions
|
// Push functions
|
||||||
lua_newtable(L);
|
lua_newtable(L);
|
||||||
|
|
||||||
|
lua_pushcfunction(L, lua_fs_is_newer);
|
||||||
|
lua_setfield(L, -2, "is_newer");
|
||||||
|
|
||||||
|
lua_pushcfunction(L, lua_fs_filter_newer);
|
||||||
|
lua_setfield(L, -2, "filter_newer");
|
||||||
|
|
||||||
lua_pushcfunction(L, lua_fs_absolute);
|
lua_pushcfunction(L, lua_fs_absolute);
|
||||||
lua_setfield(L, -2, "absolute");
|
lua_setfield(L, -2, "absolute");
|
||||||
|
|
||||||
@@ -251,11 +258,107 @@ int lua_fs_file_directory(lua_State* L)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int lua_fs_is_newer(lua_State* L)
|
||||||
|
{
|
||||||
|
luaL_argcheck(L, lua_type(L, 1) == LUA_TSTRING, 1, "Expected first argument to be a string representing a full file path");
|
||||||
|
const char* test_file = lua_tostring(L, 1);
|
||||||
|
if (!std::filesystem::exists(test_file))
|
||||||
|
{
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lua_type(L, 2) == LUA_TTABLE)
|
||||||
|
{
|
||||||
|
size_t tbl_len = lua_objlen(L, 2);
|
||||||
|
lua_newtable(L);
|
||||||
|
for (size_t i = 1; i <= tbl_len; ++i)
|
||||||
|
{
|
||||||
|
lua_rawgeti(L, 2, i);
|
||||||
|
if (lua_type(L, -1) != LUA_TSTRING)
|
||||||
|
return luaL_error(L, "Expected second argument at index %llu to be a string, not %s\n",
|
||||||
|
i, lua_typename(L, lua_type(L, -1)));
|
||||||
|
const char* target = lua_tostring(L, 2);
|
||||||
|
lua_pushboolean(L,
|
||||||
|
std::filesystem::last_write_time(test_file) > std::filesystem::last_write_time(target));
|
||||||
|
lua_rawseti(L, -2, i);
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (lua_type(L, 2) == LUA_TSTRING)
|
||||||
|
{
|
||||||
|
const char* target = lua_tostring(L, 2);
|
||||||
|
if (!std::filesystem::exists(target))
|
||||||
|
{
|
||||||
|
lua_pushboolean(L, true);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
lua_pushboolean(L,
|
||||||
|
std::filesystem::last_write_time(test_file) > std::filesystem::last_write_time(target));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else return luaL_error(L, "Expected second argument to be a string or table of strings");
|
||||||
|
}
|
||||||
|
|
||||||
|
int lua_fs_filter_newer(lua_State* L)
|
||||||
|
{
|
||||||
|
luaL_argcheck(L, lua_type(L, 1) == LUA_TSTRING, 1, "Expected first argument to be a string representing a full file path");
|
||||||
|
const char* test_file = lua_tostring(L, 1);
|
||||||
|
if (!std::filesystem::exists(test_file))
|
||||||
|
{
|
||||||
|
lua_pushnil(L);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lua_type(L, 2) == LUA_TTABLE)
|
||||||
|
{
|
||||||
|
size_t tbl_len = lua_objlen(L, 2);
|
||||||
|
lua_newtable(L);
|
||||||
|
for (size_t i = 1; i <= tbl_len; ++i)
|
||||||
|
{
|
||||||
|
lua_rawgeti(L, 2, i);
|
||||||
|
if (lua_type(L, -1) != LUA_TSTRING)
|
||||||
|
return luaL_error(L, "Expected second argument at index %llu to be a string, not %s\n",
|
||||||
|
i, lua_typename(L, lua_type(L, -1)));
|
||||||
|
const char* target = lua_tostring(L, 2);
|
||||||
|
if (std::filesystem::last_write_time(test_file) > std::filesystem::last_write_time(target))
|
||||||
|
{
|
||||||
|
lua_pushvalue(L, -1);
|
||||||
|
lua_rawseti(L, -2, lua_objlen(L, -2)+1);
|
||||||
|
}
|
||||||
|
lua_pop(L, 1);
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if (lua_type(L, 2) == LUA_TSTRING)
|
||||||
|
{
|
||||||
|
const char* target = lua_tostring(L, 2);
|
||||||
|
if (!std::filesystem::exists(target))
|
||||||
|
{
|
||||||
|
lua_pushvalue(L, 2);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (std::filesystem::last_write_time(test_file) > std::filesystem::last_write_time(target))
|
||||||
|
lua_pushvalue(L, 2);
|
||||||
|
else lua_pushnil(L);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else return luaL_error(L, "Expected second argument to be a string or table of strings");
|
||||||
|
}
|
||||||
|
|
||||||
int lua_fs_last_modified(lua_State* L)
|
int lua_fs_last_modified(lua_State* L)
|
||||||
{
|
{
|
||||||
luaL_argcheck(L, lua_type(L, 1) == LUA_TSTRING, 1, "Expected first argument to be a string representing a full file path");
|
luaL_argcheck(L, lua_type(L, 1) == LUA_TSTRING, 1, "Expected first argument to be a string representing a full file path");
|
||||||
try {
|
try {
|
||||||
lua_pushinteger(L, std::filesystem::last_write_time(std::filesystem::path(lua_tostring(L, 1))).time_since_epoch().count());
|
const uint64_t file_last_write = std::chrono::duration_cast<std::chrono::milliseconds>(
|
||||||
|
std::chrono::clock_cast<std::chrono::system_clock>(
|
||||||
|
std::filesystem::last_write_time(lua_tostring(L, 1))
|
||||||
|
).time_since_epoch()
|
||||||
|
).count();
|
||||||
|
lua_pushinteger(L, file_last_write);
|
||||||
return 1;
|
return 1;
|
||||||
} catch (const std::exception& e)
|
} catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
|
|||||||
2
thirdparty/uniproc
vendored
2
thirdparty/uniproc
vendored
Submodule thirdparty/uniproc updated: f4927bf136...500fe17076
Reference in New Issue
Block a user