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:
Perttu Ahola 2012-03-11 00:53:39 +02:00
parent 98404ad8ea
commit b485fac33e
2 changed files with 31 additions and 2 deletions

@ -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);