Fix configuration file behaviour
authorPerttu Ahola <celeron55@gmail.com>
Sat, 10 Mar 2012 22:53:39 +0000 (00:53 +0200)
committerPerttu Ahola <celeron55@gmail.com>
Sat, 10 Mar 2012 22:54:51 +0000 (00:54 +0200)
- Do not rewrite if nothing needs to be changed
- Update at program exit, in addition to updating when continuing from main menu to game

src/main.cpp
src/settings.h

index 10e01be2ad006a6d0fd2f92263839d4adc8a91d7..83bca7c44626f88fd459247ecfd75f4625a8c6a6 100644 (file)
@@ -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();
index 4bc22eaa1e08f47682108872b272a7790dc246d4..c08d54a4713ad3c696640ee5e1542f651f189040 100644 (file)
@@ -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);