mirror of
https://github.com/minetest/minetest.git
synced 2024-11-23 16:13:46 +01:00
Move archive extraction in content store to async job
This commit is contained in:
parent
2d5b7b5fb4
commit
2b5075f0e2
@ -532,7 +532,7 @@ if INIT == "mainmenu" then
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if INIT == "client" or INIT == "mainmenu" then
|
if core.gettext then -- for client and mainmenu
|
||||||
function fgettext_ne(text, ...)
|
function fgettext_ne(text, ...)
|
||||||
text = core.gettext(text)
|
text = core.gettext(text)
|
||||||
local arg = {n=select('#', ...), ...}
|
local arg = {n=select('#', ...), ...}
|
||||||
|
@ -119,17 +119,9 @@ function render_serverlist_row(spec)
|
|||||||
|
|
||||||
return table.concat(details, ",")
|
return table.concat(details, ",")
|
||||||
end
|
end
|
||||||
|
---------------------------------------------------------------------------------
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
os.tempfolder = function()
|
|
||||||
local temp = core.get_temp_path()
|
|
||||||
return temp .. DIR_DELIM .. "MT_" .. math.random(0, 10000)
|
|
||||||
end
|
|
||||||
|
|
||||||
os.tmpname = function()
|
os.tmpname = function()
|
||||||
local path = os.tempfolder()
|
error('do not use') -- instead use core.get_temp_path()
|
||||||
io.open(path, "w"):close()
|
|
||||||
return path
|
|
||||||
end
|
end
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -72,34 +72,52 @@ local function get_download_url(package, reason)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
local function download_package(param)
|
local function download_and_extract(param)
|
||||||
if core.download_file(param.url, param.filename) then
|
local package = param.package
|
||||||
|
|
||||||
|
local filename = core.get_temp_path(true)
|
||||||
|
if filename == "" or not core.download_file(param.url, filename) then
|
||||||
|
core.log("error", "Downloading " .. dump(param.url) .. " failed")
|
||||||
return {
|
return {
|
||||||
filename = param.filename,
|
msg = fgettext("Failed to download $1", package.name)
|
||||||
successful = true,
|
|
||||||
}
|
|
||||||
else
|
|
||||||
core.log("error", "downloading " .. dump(param.url) .. " failed")
|
|
||||||
return {
|
|
||||||
successful = false,
|
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local tempfolder = core.get_temp_path()
|
||||||
|
if tempfolder ~= "" then
|
||||||
|
tempfolder = tempfolder .. DIR_DELIM .. "MT_" .. math.random(1, 1024000)
|
||||||
|
if not core.extract_zip(filename, tempfolder) then
|
||||||
|
tempfolder = nil
|
||||||
|
end
|
||||||
|
else
|
||||||
|
tempfolder = nil
|
||||||
|
end
|
||||||
|
os.remove(filename)
|
||||||
|
if not tempfolder then
|
||||||
|
return {
|
||||||
|
msg = fgettext("Install: Unsupported file type or broken archive"),
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
return {
|
||||||
|
path = tempfolder
|
||||||
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
local function start_install(package, reason)
|
local function start_install(package, reason)
|
||||||
local params = {
|
local params = {
|
||||||
package = package,
|
package = package,
|
||||||
url = get_download_url(package, reason),
|
url = get_download_url(package, reason),
|
||||||
filename = os.tempfolder() .. "_MODNAME_" .. package.name .. ".zip",
|
|
||||||
}
|
}
|
||||||
|
|
||||||
number_downloading = number_downloading + 1
|
number_downloading = number_downloading + 1
|
||||||
|
|
||||||
local function callback(result)
|
local function callback(result)
|
||||||
if result.successful then
|
if result.msg then
|
||||||
local path, msg = pkgmgr.install(package.type,
|
gamedata.errormessage = result.msg
|
||||||
result.filename, package.name,
|
else
|
||||||
package.path)
|
local path, msg = pkgmgr.install_dir(package.type, result.path, package.name, package.path)
|
||||||
|
core.delete_dir(result.path)
|
||||||
if not path then
|
if not path then
|
||||||
gamedata.errormessage = msg
|
gamedata.errormessage = msg
|
||||||
else
|
else
|
||||||
@ -137,9 +155,6 @@ local function start_install(package, reason)
|
|||||||
conf:write()
|
conf:write()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
os.remove(result.filename)
|
|
||||||
else
|
|
||||||
gamedata.errormessage = fgettext("Failed to download $1", package.name)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
package.downloading = false
|
package.downloading = false
|
||||||
@ -159,7 +174,7 @@ local function start_install(package, reason)
|
|||||||
package.queued = false
|
package.queued = false
|
||||||
package.downloading = true
|
package.downloading = true
|
||||||
|
|
||||||
if not core.handle_async(download_package, params, callback) then
|
if not core.handle_async(download_and_extract, params, callback) then
|
||||||
core.log("error", "ERROR: async event failed")
|
core.log("error", "ERROR: async event failed")
|
||||||
gamedata.errormessage = fgettext("Failed to download $1", package.name)
|
gamedata.errormessage = fgettext("Failed to download $1", package.name)
|
||||||
return
|
return
|
||||||
|
@ -181,21 +181,6 @@ function pkgmgr.get_texture_packs()
|
|||||||
end
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
function pkgmgr.extract(modfile)
|
|
||||||
if modfile.type == "zip" then
|
|
||||||
local tempfolder = os.tempfolder()
|
|
||||||
|
|
||||||
if tempfolder ~= nil and
|
|
||||||
tempfolder ~= "" then
|
|
||||||
core.create_dir(tempfolder)
|
|
||||||
if core.extract_zip(modfile.name,tempfolder) then
|
|
||||||
return tempfolder
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
function pkgmgr.get_folder_type(path)
|
function pkgmgr.get_folder_type(path)
|
||||||
local testfile = io.open(path .. DIR_DELIM .. "init.lua","r")
|
local testfile = io.open(path .. DIR_DELIM .. "init.lua","r")
|
||||||
if testfile ~= nil then
|
if testfile ~= nil then
|
||||||
@ -657,23 +642,6 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
|
|||||||
return targetpath, nil
|
return targetpath, nil
|
||||||
end
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
function pkgmgr.install(type, modfilename, basename, dest)
|
|
||||||
local archive_info = pkgmgr.identify_filetype(modfilename)
|
|
||||||
local path = pkgmgr.extract(archive_info)
|
|
||||||
|
|
||||||
if path == nil then
|
|
||||||
return nil,
|
|
||||||
fgettext("Install: file: \"$1\"", archive_info.name) .. "\n" ..
|
|
||||||
fgettext("Install: Unsupported file type \"$1\" or broken archive",
|
|
||||||
archive_info.type)
|
|
||||||
end
|
|
||||||
|
|
||||||
local targetpath, msg = pkgmgr.install_dir(type, path, basename, dest)
|
|
||||||
core.delete_dir(path)
|
|
||||||
return targetpath, msg
|
|
||||||
end
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
function pkgmgr.preparemodlist(data)
|
function pkgmgr.preparemodlist(data)
|
||||||
local retval = {}
|
local retval = {}
|
||||||
@ -817,45 +785,6 @@ function pkgmgr.refresh_globals()
|
|||||||
pkgmgr.global_mods:set_sortmode("alphabetic")
|
pkgmgr.global_mods:set_sortmode("alphabetic")
|
||||||
end
|
end
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
function pkgmgr.identify_filetype(name)
|
|
||||||
|
|
||||||
if name:sub(-3):lower() == "zip" then
|
|
||||||
return {
|
|
||||||
name = name,
|
|
||||||
type = "zip"
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
if name:sub(-6):lower() == "tar.gz" or
|
|
||||||
name:sub(-3):lower() == "tgz"then
|
|
||||||
return {
|
|
||||||
name = name,
|
|
||||||
type = "tgz"
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
if name:sub(-6):lower() == "tar.bz2" then
|
|
||||||
return {
|
|
||||||
name = name,
|
|
||||||
type = "tbz"
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
if name:sub(-2):lower() == "7z" then
|
|
||||||
return {
|
|
||||||
name = name,
|
|
||||||
type = "7z"
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
return {
|
|
||||||
name = name,
|
|
||||||
type = "ukn"
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
function pkgmgr.find_by_gameid(gameid)
|
function pkgmgr.find_by_gameid(gameid)
|
||||||
for i=1,#pkgmgr.games,1 do
|
for i=1,#pkgmgr.games,1 do
|
||||||
|
@ -85,7 +85,9 @@ core.get_video_drivers()
|
|||||||
core.get_mapgen_names([include_hidden=false]) -> table of map generator algorithms
|
core.get_mapgen_names([include_hidden=false]) -> table of map generator algorithms
|
||||||
registered in the core (possible in async calls)
|
registered in the core (possible in async calls)
|
||||||
core.get_cache_path() -> path of cache
|
core.get_cache_path() -> path of cache
|
||||||
core.get_temp_path() -> path of temp folder
|
core.get_temp_path([param]) (possible in async calls)
|
||||||
|
^ param=true: returns path to a temporary file
|
||||||
|
^ otherwise: returns path to the temporary folder
|
||||||
|
|
||||||
|
|
||||||
HTTP Requests
|
HTTP Requests
|
||||||
|
@ -563,7 +563,10 @@ int ModApiMainMenu::l_get_cache_path(lua_State *L)
|
|||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
int ModApiMainMenu::l_get_temp_path(lua_State *L)
|
int ModApiMainMenu::l_get_temp_path(lua_State *L)
|
||||||
{
|
{
|
||||||
|
if (lua_isnoneornil(L, 1) || !lua_toboolean(L, 1))
|
||||||
lua_pushstring(L, fs::TempPath().c_str());
|
lua_pushstring(L, fs::TempPath().c_str());
|
||||||
|
else
|
||||||
|
lua_pushstring(L, fs::CreateTempFile().c_str());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -770,8 +773,9 @@ int ModApiMainMenu::l_get_video_drivers(lua_State *L)
|
|||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
int ModApiMainMenu::l_gettext(lua_State *L)
|
int ModApiMainMenu::l_gettext(lua_State *L)
|
||||||
{
|
{
|
||||||
std::string text = strgettext(std::string(luaL_checkstring(L, 1)));
|
const char *srctext = luaL_checkstring(L, 1);
|
||||||
lua_pushstring(L, text.c_str());
|
const char *text = *srctext ? gettext(srctext) : "";
|
||||||
|
lua_pushstring(L, text);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -921,5 +925,5 @@ void ModApiMainMenu::InitializeAsync(lua_State *L, int top)
|
|||||||
API_FCT(download_file);
|
API_FCT(download_file);
|
||||||
API_FCT(get_min_supp_proto);
|
API_FCT(get_min_supp_proto);
|
||||||
API_FCT(get_max_supp_proto);
|
API_FCT(get_max_supp_proto);
|
||||||
//API_FCT(gettext); (gettext lib isn't threadsafe)
|
API_FCT(gettext);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user