Skip to content

Commit

Permalink
Refactor pkgmgr.install_dir to simplify logic
Browse files Browse the repository at this point in the history
  • Loading branch information
rubenwardy committed Aug 15, 2022
1 parent 0090446 commit db612c1
Showing 1 changed file with 29 additions and 148 deletions.
177 changes: 29 additions & 148 deletions builtin/mainmenu/pkgmgr.lua
Original file line number Diff line number Diff line change
Expand Up @@ -243,99 +243,14 @@ function pkgmgr.get_base_folder(temppath)
end

--------------------------------------------------------------------------------
function pkgmgr.isValidModname(modpath)
function pkgmgr.is_valid_modname(modpath)
if modpath:find("-") ~= nil then
return false
end

return true
end

--------------------------------------------------------------------------------
function pkgmgr.parse_register_line(line)
local pos1 = line:find("\"")
local pos2 = nil
if pos1 ~= nil then
pos2 = line:find("\"",pos1+1)
end

if pos1 ~= nil and pos2 ~= nil then
local item = line:sub(pos1+1,pos2-1)

if item ~= nil and
item ~= "" then
local pos3 = item:find(":")

if pos3 ~= nil then
local retval = item:sub(1,pos3-1)
if retval ~= nil and
retval ~= "" then
return retval
end
end
end
end
return nil
end

--------------------------------------------------------------------------------
function pkgmgr.parse_dofile_line(modpath,line)
local pos1 = line:find("\"")
local pos2 = nil
if pos1 ~= nil then
pos2 = line:find("\"",pos1+1)
end

if pos1 ~= nil and pos2 ~= nil then
local filename = line:sub(pos1+1,pos2-1)

if filename ~= nil and
filename ~= "" and
filename:find(".lua") then
return pkgmgr.identify_modname(modpath,filename)
end
end
return nil
end

--------------------------------------------------------------------------------
function pkgmgr.identify_modname(modpath,filename)
local testfile = io.open(modpath .. DIR_DELIM .. filename,"r")
if testfile ~= nil then
local line = testfile:read()

while line~= nil do
local modname = nil

if line:find("minetest.register_tool") then
modname = pkgmgr.parse_register_line(line)
end

if line:find("minetest.register_craftitem") then
modname = pkgmgr.parse_register_line(line)
end


if line:find("minetest.register_node") then
modname = pkgmgr.parse_register_line(line)
end

if line:find("dofile") then
modname = pkgmgr.parse_dofile_line(modpath,line)
end

if modname ~= nil then
testfile:close()
return modname
end

line = testfile:read()
end
testfile:close()
end

return nil
end
--------------------------------------------------------------------------------
function pkgmgr.render_packagelist(render_list, use_technical_names, with_error)
if not render_list then
Expand Down Expand Up @@ -597,12 +512,17 @@ function pkgmgr.get_worldconfig(worldpath)
end

--------------------------------------------------------------------------------
function pkgmgr.install_dir(type, path, basename, targetpath)
function pkgmgr.install_dir(expected_type, path, basename, targetpath)
assert(type(expected_type) == "string")
assert(type(path) == "string")
assert(basename == nil or type(basename) == "string")
assert(targetpath == nil or type(targetpath) == "string")

local basefolder = pkgmgr.get_base_folder(path)

-- There's no good way to detect a texture pack, so let's just assume
-- it's correct for now.
if type == "txp" then
if expected_type == "txp" then
-- There's no good way to detect a texture pack, so let's just assume
-- it's correct for now.
if basefolder and basefolder.type ~= "invalid" and basefolder.type ~= "txp" then
return nil, fgettext("Unable to install a $1 as a texture pack", basefolder.type)
end
Expand All @@ -619,73 +539,34 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
return targetpath, nil

elseif not basefolder then
return nil, fgettext("Unable to find a valid mod or modpack")
return nil, fgettext("Unable to find a valid mod, modpack, or game")
end

--
-- Get destination
--
if basefolder.type == "modpack" then
if type ~= "mod" then
return nil, fgettext("Unable to install a modpack as a $1", type)
end
-- Check type
if basefolder.type ~= expected_type and (basefolder.type ~= "modpack" or expected_type ~= "mod") then
return nil, fgettext("Unable to install a $1 as a $1", basefolder.type, expected_type)
end

-- Get destination name for modpack
if targetpath then
core.delete_dir(targetpath)
else
local clean_path = nil
if basename ~= nil then
clean_path = basename
end
if not clean_path then
clean_path = get_last_folder(cleanup_path(basefolder.path))
-- Set targetpath if not predetermined
if not targetpath then
local content_path
if basefolder.type == "modpack" or basefolder.type == "mod" then
if not basename then
basename = get_last_folder(cleanup_path(basefolder.path))
end
if clean_path then
targetpath = core.get_modpath() .. DIR_DELIM .. clean_path
else
return nil,
fgettext("Install Mod: Unable to find suitable folder name for modpack $1",
path)
end
end
elseif basefolder.type == "mod" then
if type ~= "mod" then
return nil, fgettext("Unable to install a mod as a $1", type)
end

if targetpath then
core.delete_dir(targetpath)
content_path = core.get_modpath()
elseif basefolder.type == "game" then
content_path = core.get_gamepath()
else
local targetfolder = basename
if targetfolder == nil then
targetfolder = pkgmgr.identify_modname(basefolder.path, "init.lua")
end

-- If heuristic failed try to use current foldername
if targetfolder == nil then
targetfolder = get_last_folder(basefolder.path)
end

if targetfolder ~= nil and pkgmgr.isValidModname(targetfolder) then
targetpath = core.get_modpath() .. DIR_DELIM .. targetfolder
else
return nil, fgettext("Install Mod: Unable to find real mod name for: $1", path)
end
error("Unknown content type")
end

elseif basefolder.type == "game" then
if type ~= "game" then
return nil, fgettext("Unable to install a game as a $1", type)
end

if targetpath then
core.delete_dir(targetpath)
if basename and (basefolder.type ~= "mod" or pkgmgr.is_valid_modname(basename)) then
targetpath = content_path .. DIR_DELIM .. basename
else
targetpath = core.get_gamepath() .. DIR_DELIM .. basename
return nil,
fgettext("Install: Unable to find suitable folder name for $1", path)
end
else
error("basefolder didn't return a recognised type, this shouldn't happen")
end

-- Copy it
Expand Down

0 comments on commit db612c1

Please sign in to comment.