1
0
mirror of https://github.com/moparisthebest/minetest synced 2024-11-15 22:05:07 -05:00

Properly handle mod name conflicts

This commit is contained in:
Perttu Ahola 2011-12-03 03:32:30 +02:00
parent 2f4a92d701
commit 6b2023dc3e
2 changed files with 20 additions and 2 deletions

View File

@ -21,8 +21,10 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <queue> #include <queue>
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
#include <map>
#include "filesys.h" #include "filesys.h"
#include "strfnd.h" #include "strfnd.h"
#include "log.h"
// Get a dependency-sorted list of ModSpecs // Get a dependency-sorted list of ModSpecs
core::list<ModSpec> getMods(core::list<std::string> &modspaths) core::list<ModSpec> getMods(core::list<std::string> &modspaths)
@ -31,6 +33,8 @@ core::list<ModSpec> getMods(core::list<std::string> &modspaths)
std::queue<ModSpec> mods_satisfied; std::queue<ModSpec> mods_satisfied;
core::list<ModSpec> mods_unsorted; core::list<ModSpec> mods_unsorted;
core::list<ModSpec> mods_sorted; core::list<ModSpec> mods_sorted;
// name, path: For detecting name conflicts
std::map<std::string, std::string> mod_names;
for(core::list<std::string>::Iterator i = modspaths.begin(); for(core::list<std::string>::Iterator i = modspaths.begin();
i != modspaths.end(); i++){ i != modspaths.end(); i++){
std::string modspath = *i; std::string modspath = *i;
@ -40,6 +44,19 @@ core::list<ModSpec> getMods(core::list<std::string> &modspaths)
continue; continue;
std::string modname = dirlist[j].name; std::string modname = dirlist[j].name;
std::string modpath = modspath + DIR_DELIM + modname; std::string modpath = modspath + DIR_DELIM + modname;
// Detect mod name conflicts
{
std::map<std::string, std::string>::const_iterator i;
i = mod_names.find(modname);
if(i != mod_names.end()){
std::string s;
infostream<<"WARNING: Mod name conflict detected: "
<<std::endl
<<"Already loaded: "<<i->second<<std::endl
<<"Will not load: "<<modpath<<std::endl;
continue;
}
}
std::set<std::string> depends; std::set<std::string> depends;
std::ifstream is((modpath+DIR_DELIM+"depends.txt").c_str(), std::ifstream is((modpath+DIR_DELIM+"depends.txt").c_str(),
std::ios_base::binary); std::ios_base::binary);
@ -54,6 +71,7 @@ core::list<ModSpec> getMods(core::list<std::string> &modspaths)
mods_unsorted.push_back(spec); mods_unsorted.push_back(spec);
if(depends.empty()) if(depends.empty())
mods_satisfied.push(spec); mods_satisfied.push(spec);
mod_names[modname] = modpath;
} }
} }
// Sort by depencencies // Sort by depencencies

View File

@ -881,9 +881,9 @@ Server::Server(
std::string builtinpath = porting::path_data + DIR_DELIM + "builtin.lua"; std::string builtinpath = porting::path_data + DIR_DELIM + "builtin.lua";
// Add default global mod search path // 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 // Add world mod search path
m_modspaths.push_back(mapsavedir + DIR_DELIM + "mods"); m_modspaths.push_front(mapsavedir + DIR_DELIM + "mods");
// Initialize scripting // Initialize scripting