summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSmallJoker <SmallJoker@users.noreply.github.com>2021-07-31 19:54:52 +0200
committerGitHub <noreply@github.com>2021-07-31 19:54:52 +0200
commit32cb9d0828828da3068259c9e0a3c0f5da170439 (patch)
tree7a768f3ffca8309b595db10102773c249db37c41 /src
parente7cd4cfa25485610c05a906859e8365158a13f69 (diff)
downloadminetest-32cb9d0828828da3068259c9e0a3c0f5da170439.tar.gz
minetest-32cb9d0828828da3068259c9e0a3c0f5da170439.tar.bz2
minetest-32cb9d0828828da3068259c9e0a3c0f5da170439.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/client/client.cpp6
-rw-r--r--src/content/mods.cpp44
-rw-r--r--src/content/mods.h5
-rw-r--r--src/server/mods.cpp8
4 files changed, 34 insertions, 29 deletions
diff --git a/src/client/client.cpp b/src/client/client.cpp
index 17661c242..923369afe 100644
--- a/src/client/client.cpp
+++ b/src/client/client.cpp
@@ -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);
}
diff --git a/src/content/mods.cpp b/src/content/mods.cpp
index 434004b29..6f088a5b3 100644
--- a/src/content/mods.cpp
+++ b/src/content/mods.cpp
@@ -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.");
}
}
diff --git a/src/content/mods.h b/src/content/mods.h
index b3500fbc8..b56a97edb 100644
--- a/src/content/mods.h
+++ b/src/content/mods.h
@@ -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
diff --git a/src/server/mods.cpp b/src/server/mods.cpp
index 83fa12da9..609d8c346 100644
--- a/src/server/mods.cpp
+++ b/src/server/mods.cpp
@@ -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);