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 #endif // !SERVER
// Update configuration file
if(configpath != "")
g_settings->updateConfigFile(configpath.c_str());
END_DEBUG_EXCEPTION_HANDLER(errorstream) END_DEBUG_EXCEPTION_HANDLER(errorstream)
debugstreams_deinit(); debugstreams_deinit();

@ -172,7 +172,8 @@ public:
*/ */
bool getUpdatedConfigObject(std::istream &is, bool getUpdatedConfigObject(std::istream &is,
core::list<std::string> &dst, core::list<std::string> &dst,
core::map<std::string, bool> &updated) core::map<std::string, bool> &updated,
bool &value_changed)
{ {
JMutexAutoLock lock(m_mutex); JMutexAutoLock lock(m_mutex);
@ -219,6 +220,7 @@ public:
infostream<<"Changing value of \""<<name<<"\" = \"" infostream<<"Changing value of \""<<name<<"\" = \""
<<value<<"\" -> \""<<newvalue<<"\"" <<value<<"\" -> \""<<newvalue<<"\""
<<std::endl; <<std::endl;
value_changed = true;
} }
dst.push_back(name + " = " + newvalue + line_end); dst.push_back(name + " = " + newvalue + line_end);
@ -241,6 +243,7 @@ public:
core::list<std::string> objects; core::list<std::string> objects;
core::map<std::string, bool> updated; core::map<std::string, bool> updated;
bool something_actually_changed = false;
// Read and modify stuff // Read and modify stuff
{ {
@ -254,12 +257,34 @@ public:
} }
else else
{ {
while(getUpdatedConfigObject(is, objects, updated)); while(getUpdatedConfigObject(is, objects, updated,
something_actually_changed));
} }
} }
JMutexAutoLock lock(m_mutex); 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 // Write stuff back
{ {
std::ofstream os(filename); std::ofstream os(filename);