Deprecate modpack.txt and use modpack.conf instead (#7892)

* Deprecate modpack.txt and use modpack.conf instead
This commit is contained in:
rubenwardy 2019-01-06 09:23:35 +00:00 committed by Loïc Blot
parent 3a9fe2bd5b
commit 70bf3439ab
6 changed files with 75 additions and 23 deletions

@ -76,10 +76,17 @@ local function start_install(calling_dialog, package)
if not path then if not path then
gamedata.errormessage = msg gamedata.errormessage = msg
else else
core.log("action", "Installed package to " .. path)
local conf_path local conf_path
local name_is_title = false local name_is_title = false
if result.package.type == "mod" then if result.package.type == "mod" then
conf_path = path .. DIR_DELIM .. "mod.conf" local actual_type = pkgmgr.get_folder_type(path)
if actual_type.type == "modpack" then
conf_path = path .. DIR_DELIM .. "modpack.conf"
else
conf_path = path .. DIR_DELIM .. "mod.conf"
end
elseif result.package.type == "game" then elseif result.package.type == "game" then
conf_path = path .. DIR_DELIM .. "game.conf" conf_path = path .. DIR_DELIM .. "game.conf"
name_is_title = true name_is_title = true

@ -25,27 +25,46 @@ function get_mods(path,retval,modpack)
local toadd = {} local toadd = {}
retval[#retval + 1] = toadd retval[#retval + 1] = toadd
local mod_conf = Settings(prefix .. DIR_DELIM .. "mod.conf"):to_table() -- Get config file
if mod_conf.name then local mod_conf
name = mod_conf.name local modpack_conf = io.open(prefix .. DIR_DELIM .. "modpack.conf")
if modpack_conf then
toadd.is_modpack = true
modpack_conf:close()
mod_conf = Settings(prefix .. DIR_DELIM .. "modpack.conf"):to_table()
if mod_conf.name then
name = mod_conf.name
end
else
mod_conf = Settings(prefix .. DIR_DELIM .. "mod.conf"):to_table()
if mod_conf.name then
name = mod_conf.name
end
end end
-- Read from config
toadd.name = name toadd.name = name
toadd.author = mod_conf.author toadd.author = mod_conf.author
toadd.release = tonumber(mod_conf.release or "0") toadd.release = tonumber(mod_conf.release or "0")
toadd.path = prefix toadd.path = prefix
toadd.type = "mod" toadd.type = "mod"
if modpack ~= nil and modpack ~= "" then -- Check modpack.txt
-- Note: modpack.conf is already checked above
local modpackfile = io.open(prefix .. DIR_DELIM .. "modpack.txt")
if modpackfile then
modpackfile:close()
toadd.is_modpack = true
end
-- Deal with modpack contents
if modpack and modpack ~= "" then
toadd.modpack = modpack toadd.modpack = modpack
else elseif toadd.is_modpack then
local modpackfile = io.open(prefix .. DIR_DELIM .. "modpack.txt") toadd.type = "modpack"
if modpackfile then toadd.is_modpack = true
modpackfile:close() get_mods(prefix, retval, name)
toadd.type = "modpack"
toadd.is_modpack = true
get_mods(prefix, retval, name)
end
end end
end end
end end
@ -114,6 +133,12 @@ function pkgmgr.get_folder_type(path)
return { type = "mod", path = path } return { type = "mod", path = path }
end end
testfile = io.open(path .. DIR_DELIM .. "modpack.conf","r")
if testfile ~= nil then
testfile:close()
return { type = "modpack", path = path }
end
testfile = io.open(path .. DIR_DELIM .. "modpack.txt","r") testfile = io.open(path .. DIR_DELIM .. "modpack.txt","r")
if testfile ~= nil then if testfile ~= nil then
testfile:close() testfile:close()
@ -422,7 +447,7 @@ function pkgmgr.install_dir(type, path, basename, targetpath)
else else
local clean_path = nil local clean_path = nil
if basename ~= nil then if basename ~= nil then
clean_path = "mp_" .. basename clean_path = basename
end end
if not clean_path then if not clean_path then
clean_path = get_last_folder(cleanup_path(basefolder.path)) clean_path = get_last_folder(cleanup_path(basefolder.path))

@ -68,8 +68,12 @@ Modpack support
**NOTE: Not implemented yet.** **NOTE: Not implemented yet.**
Mods can be put in a subdirectory, if the parent directory, which otherwise Mods can be put in a subdirectory, if the parent directory, which otherwise
should be a mod, contains a file named `modpack.txt`. This file shall be should be a mod, contains a file named `modpack.conf`.
empty, except for lines starting with `#`, which are comments. The file is a key-value store of modpack details.
* `name`: The modpack name.
* `description`: Description of mod to be shown in the Mods tab of the main
menu.
Mod directory structure Mod directory structure
------------------------ ------------------------

@ -119,8 +119,14 @@ Modpacks
-------- --------
Mods can be put in a subdirectory, if the parent directory, which otherwise Mods can be put in a subdirectory, if the parent directory, which otherwise
should be a mod, contains a file named `modpack.txt`. This file shall be should be a mod, contains a file named `modpack.conf`.
empty, except for lines starting with `#`, which are comments. The file is a key-value store of modpack details.
* `name`: The modpack name.
* `description`: Description of mod to be shown in the Mods tab of the main
menu.
Note: to support 0.4.x, please also create an empty modpack.txt file.
Mod directory structure Mod directory structure
----------------------- -----------------------

@ -41,6 +41,12 @@ ContentType getContentType(const ContentSpec &spec)
return ECT_MODPACK; return ECT_MODPACK;
} }
std::ifstream modpack2_is((spec.path + DIR_DELIM + "modpack.conf").c_str());
if (modpack2_is.good()) {
modpack2_is.close();
return ECT_MODPACK;
}
std::ifstream init_is((spec.path + DIR_DELIM + "init.lua").c_str()); std::ifstream init_is((spec.path + DIR_DELIM + "init.lua").c_str());
if (init_is.good()) { if (init_is.good()) {
init_is.close(); init_is.close();
@ -73,7 +79,7 @@ void parseContentInfo(ContentSpec &spec)
break; break;
case ECT_MODPACK: case ECT_MODPACK:
spec.type = "modpack"; spec.type = "modpack";
conf_path = spec.path + DIR_DELIM + "mod.conf"; conf_path = spec.path + DIR_DELIM + "modpack.conf";
break; break;
case ECT_GAME: case ECT_GAME:
spec.type = "game"; spec.type = "game";

@ -66,12 +66,16 @@ void parseModContents(ModSpec &spec)
// Handle modpacks (defined by containing modpack.txt) // Handle modpacks (defined by containing modpack.txt)
std::ifstream modpack_is((spec.path + DIR_DELIM + "modpack.txt").c_str()); std::ifstream modpack_is((spec.path + DIR_DELIM + "modpack.txt").c_str());
if (modpack_is.good()) { // a modpack, recursively get the mods in it std::ifstream modpack2_is((spec.path + DIR_DELIM + "modpack.conf").c_str());
modpack_is.close(); // We don't actually need the file if (modpack_is.good() || modpack2_is.good()) {
if (modpack_is.good())
modpack_is.close();
if (modpack2_is.good())
modpack2_is.close();
spec.is_modpack = true; spec.is_modpack = true;
spec.modpack_content = getModsInPath(spec.path, true); spec.modpack_content = getModsInPath(spec.path, true);
// modpacks have no dependencies; they are defined and
// tracked separately for each mod in the modpack
} else { } else {
// Attempt to load dependencies from mod.conf // Attempt to load dependencies from mod.conf