mirror of
https://github.com/minetest/minetest.git
synced 2024-11-27 10:03:45 +01:00
Mods: Combine mod loading checks and deprection logging (#11503)
This limits the logged deprecation messages to the mods that are loaded Unifies the mod naming convention check for CSM & SSM
This commit is contained in:
parent
e7cd4cfa25
commit
32cb9d0828
@ -177,11 +177,7 @@ void Client::loadMods()
|
||||
|
||||
// Load "mod" scripts
|
||||
for (const ModSpec &mod : m_mods) {
|
||||
if (!string_allowed(mod.name, MODNAME_ALLOWED_CHARS)) {
|
||||
throw ModError("Error loading mod \"" + mod.name +
|
||||
"\": Mod name does not follow naming conventions: "
|
||||
"Only characters [a-z0-9_] are allowed.");
|
||||
}
|
||||
mod.checkAndLog();
|
||||
scanModIntoMemory(mod.name, mod.path);
|
||||
}
|
||||
|
||||
|
@ -30,6 +30,29 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||
#include "convert_json.h"
|
||||
#include "script/common/c_internal.h"
|
||||
|
||||
void ModSpec::checkAndLog() const
|
||||
{
|
||||
if (!string_allowed(name, MODNAME_ALLOWED_CHARS)) {
|
||||
throw ModError("Error loading mod \"" + name +
|
||||
"\": Mod name does not follow naming conventions: "
|
||||
"Only characters [a-z0-9_] are allowed.");
|
||||
}
|
||||
|
||||
// Log deprecation messages
|
||||
auto handling_mode = get_deprecated_handling_mode();
|
||||
if (!deprecation_msgs.empty() && handling_mode != DeprecatedHandlingMode::Ignore) {
|
||||
std::ostringstream os;
|
||||
os << "Mod " << name << " at " << path << ":" << std::endl;
|
||||
for (auto msg : deprecation_msgs)
|
||||
os << "\t" << msg << std::endl;
|
||||
|
||||
if (handling_mode == DeprecatedHandlingMode::Error)
|
||||
throw ModError(os.str());
|
||||
else
|
||||
warningstream << os.str();
|
||||
}
|
||||
}
|
||||
|
||||
bool parseDependsString(std::string &dep, std::unordered_set<char> &symbols)
|
||||
{
|
||||
dep = trim(dep);
|
||||
@ -45,21 +68,6 @@ bool parseDependsString(std::string &dep, std::unordered_set<char> &symbols)
|
||||
return !dep.empty();
|
||||
}
|
||||
|
||||
static void log_mod_deprecation(const ModSpec &spec, const std::string &warning)
|
||||
{
|
||||
auto handling_mode = get_deprecated_handling_mode();
|
||||
if (handling_mode != DeprecatedHandlingMode::Ignore) {
|
||||
std::ostringstream os;
|
||||
os << warning << " (" << spec.name << " at " << spec.path << ")" << std::endl;
|
||||
|
||||
if (handling_mode == DeprecatedHandlingMode::Error) {
|
||||
throw ModError(os.str());
|
||||
} else {
|
||||
warningstream << os.str();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void parseModContents(ModSpec &spec)
|
||||
{
|
||||
// NOTE: this function works in mutual recursion with getModsInPath
|
||||
@ -89,7 +97,7 @@ void parseModContents(ModSpec &spec)
|
||||
if (info.exists("name"))
|
||||
spec.name = info.get("name");
|
||||
else
|
||||
log_mod_deprecation(spec, "Mods not having a mod.conf file with the name is deprecated.");
|
||||
spec.deprecation_msgs.push_back("Mods not having a mod.conf file with the name is deprecated.");
|
||||
|
||||
if (info.exists("author"))
|
||||
spec.author = info.get("author");
|
||||
@ -130,7 +138,7 @@ void parseModContents(ModSpec &spec)
|
||||
std::ifstream is((spec.path + DIR_DELIM + "depends.txt").c_str());
|
||||
|
||||
if (is.good())
|
||||
log_mod_deprecation(spec, "depends.txt is deprecated, please use mod.conf instead.");
|
||||
spec.deprecation_msgs.push_back("depends.txt is deprecated, please use mod.conf instead.");
|
||||
|
||||
while (is.good()) {
|
||||
std::string dep;
|
||||
@ -153,7 +161,7 @@ void parseModContents(ModSpec &spec)
|
||||
if (info.exists("description"))
|
||||
spec.desc = info.get("description");
|
||||
else if (fs::ReadFile(spec.path + DIR_DELIM + "description.txt", spec.desc))
|
||||
log_mod_deprecation(spec, "description.txt is deprecated, please use mod.conf instead.");
|
||||
spec.deprecation_msgs.push_back("description.txt is deprecated, please use mod.conf instead.");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -49,6 +49,9 @@ struct ModSpec
|
||||
bool part_of_modpack = false;
|
||||
bool is_modpack = false;
|
||||
|
||||
// For logging purposes
|
||||
std::vector<const char *> deprecation_msgs;
|
||||
|
||||
// if modpack:
|
||||
std::map<std::string, ModSpec> modpack_content;
|
||||
ModSpec(const std::string &name = "", const std::string &path = "") :
|
||||
@ -59,6 +62,8 @@ struct ModSpec
|
||||
name(name), path(path), part_of_modpack(part_of_modpack)
|
||||
{
|
||||
}
|
||||
|
||||
void checkAndLog() const;
|
||||
};
|
||||
|
||||
// Retrieves depends, optdepends, is_modpack and modpack_content
|
||||
|
@ -61,12 +61,8 @@ void ServerModManager::loadMods(ServerScripting *script)
|
||||
infostream << std::endl;
|
||||
// Load and run "mod" scripts
|
||||
for (const ModSpec &mod : m_sorted_mods) {
|
||||
if (!string_allowed(mod.name, MODNAME_ALLOWED_CHARS)) {
|
||||
throw ModError("Error loading mod \"" + mod.name +
|
||||
"\": Mod name does not follow naming "
|
||||
"conventions: "
|
||||
"Only characters [a-z0-9_] are allowed.");
|
||||
}
|
||||
mod.checkAndLog();
|
||||
|
||||
std::string script_path = mod.path + DIR_DELIM + "init.lua";
|
||||
auto t = porting::getTimeMs();
|
||||
script->loadMod(script_path, mod.name);
|
||||
|
Loading…
Reference in New Issue
Block a user