forked from Mirrorlandia_minetest/minetest
Fix configuration file behaviour
- Do not rewrite if nothing needs to be changed - Update at program exit, in addition to updating when continuing from main menu to game
This commit is contained in:
parent
98404ad8ea
commit
b485fac33e
@ -1708,6 +1708,10 @@ int main(int argc, char *argv[])
|
||||
|
||||
#endif // !SERVER
|
||||
|
||||
// Update configuration file
|
||||
if(configpath != "")
|
||||
g_settings->updateConfigFile(configpath.c_str());
|
||||
|
||||
END_DEBUG_EXCEPTION_HANDLER(errorstream)
|
||||
|
||||
debugstreams_deinit();
|
||||
|
@ -172,7 +172,8 @@ public:
|
||||
*/
|
||||
bool getUpdatedConfigObject(std::istream &is,
|
||||
core::list<std::string> &dst,
|
||||
core::map<std::string, bool> &updated)
|
||||
core::map<std::string, bool> &updated,
|
||||
bool &value_changed)
|
||||
{
|
||||
JMutexAutoLock lock(m_mutex);
|
||||
|
||||
@ -219,6 +220,7 @@ public:
|
||||
infostream<<"Changing value of \""<<name<<"\" = \""
|
||||
<<value<<"\" -> \""<<newvalue<<"\""
|
||||
<<std::endl;
|
||||
value_changed = true;
|
||||
}
|
||||
|
||||
dst.push_back(name + " = " + newvalue + line_end);
|
||||
@ -241,6 +243,7 @@ public:
|
||||
|
||||
core::list<std::string> objects;
|
||||
core::map<std::string, bool> updated;
|
||||
bool something_actually_changed = false;
|
||||
|
||||
// Read and modify stuff
|
||||
{
|
||||
@ -254,12 +257,34 @@ public:
|
||||
}
|
||||
else
|
||||
{
|
||||
while(getUpdatedConfigObject(is, objects, updated));
|
||||
while(getUpdatedConfigObject(is, objects, updated,
|
||||
something_actually_changed));
|
||||
}
|
||||
}
|
||||
|
||||
JMutexAutoLock lock(m_mutex);
|
||||
|
||||
// If something not yet determined to have been changed, check if
|
||||
// any new stuff was added
|
||||
if(!something_actually_changed){
|
||||
for(core::map<std::string, std::string>::Iterator
|
||||
i = m_settings.getIterator();
|
||||
i.atEnd() == false; i++)
|
||||
{
|
||||
if(updated.find(i.getNode()->getKey()))
|
||||
continue;
|
||||
something_actually_changed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// If nothing was actually changed, skip writing the file
|
||||
if(!something_actually_changed){
|
||||
infostream<<"Skipping writing of "<<filename
|
||||
<<" because content wouldn't be modified"<<std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
// Write stuff back
|
||||
{
|
||||
std::ofstream os(filename);
|
||||
|
Loading…
Reference in New Issue
Block a user