From: Perttu Ahola Date: Sat, 3 Dec 2011 01:32:30 +0000 (+0200) Subject: Properly handle mod name conflicts X-Git-Url: http://81.2.79.47:8989/gitweb/?a=commitdiff_plain;h=6b2023dc3eb1b483c92ba967f3335bb6880d2db1;p=zefram%2Fminetest%2Fminetest_engine.git Properly handle mod name conflicts --- diff --git a/src/mods.cpp b/src/mods.cpp index 285c4cbb..db878d78 100644 --- a/src/mods.cpp +++ b/src/mods.cpp @@ -21,8 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #include "filesys.h" #include "strfnd.h" +#include "log.h" // Get a dependency-sorted list of ModSpecs core::list getMods(core::list &modspaths) @@ -31,6 +33,8 @@ core::list getMods(core::list &modspaths) std::queue mods_satisfied; core::list mods_unsorted; core::list mods_sorted; + // name, path: For detecting name conflicts + std::map mod_names; for(core::list::Iterator i = modspaths.begin(); i != modspaths.end(); i++){ std::string modspath = *i; @@ -40,6 +44,19 @@ core::list getMods(core::list &modspaths) continue; std::string modname = dirlist[j].name; std::string modpath = modspath + DIR_DELIM + modname; + // Detect mod name conflicts + { + std::map::const_iterator i; + i = mod_names.find(modname); + if(i != mod_names.end()){ + std::string s; + infostream<<"WARNING: Mod name conflict detected: " + <second< depends; std::ifstream is((modpath+DIR_DELIM+"depends.txt").c_str(), std::ios_base::binary); @@ -54,6 +71,7 @@ core::list getMods(core::list &modspaths) mods_unsorted.push_back(spec); if(depends.empty()) mods_satisfied.push(spec); + mod_names[modname] = modpath; } } // Sort by depencencies diff --git a/src/server.cpp b/src/server.cpp index e4052015..032b57e3 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -881,9 +881,9 @@ Server::Server( std::string builtinpath = porting::path_data + DIR_DELIM + "builtin.lua"; // Add default global mod search path - m_modspaths.push_back(porting::path_data + DIR_DELIM + "mods"); + m_modspaths.push_front(porting::path_data + DIR_DELIM + "mods"); // Add world mod search path - m_modspaths.push_back(mapsavedir + DIR_DELIM + "mods"); + m_modspaths.push_front(mapsavedir + DIR_DELIM + "mods"); // Initialize scripting