From ad59559fdd19f89852eebd94299691e6091ff02f Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 5 Jan 2018 20:03:43 +0000 Subject: [PATCH] Backup more than one config on failure to load. --- src/lib/config.cc | 29 ++++++++++----- src/lib/config.h | 2 + test/config_test.cc | 90 +++++++++++++++++++++++++++++++++++++++++++++ test/wscript | 1 + 4 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 test/config_test.cc diff --git a/src/lib/config.cc b/src/lib/config.cc index 2a8a3cc89..983fb69d8 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -31,6 +31,7 @@ #include "cross.h" #include "film.h" #include "dkdm_wrapper.h" +#include "compose.hpp" #include #include #include @@ -65,6 +66,7 @@ using dcp::raw_convert; Config* Config::_instance = 0; boost::signals2::signal Config::FailedToLoad; boost::signals2::signal Config::Warning; +boost::optional Config::test_path; /** Construct default configuration */ Config::Config () @@ -390,8 +392,13 @@ catch (...) { /* Make a copy of the configuration */ try { - boost::filesystem::copy_file (path ("config.xml", false), path ("config.xml.backup", false)); - boost::filesystem::copy_file (path ("cinemas.xml", false), path ("cinemas.xml.backup", false)); + int n = 1; + while (n < 100 && boost::filesystem::exists(path(String::compose("config.xml.%1", n)))) { + ++n; + } + + boost::filesystem::copy_file(path("config.xml", false), path(String::compose("config.xml.%1", n), false)); + boost::filesystem::copy_file(path("cinemas.xml", false), path(String::compose("cinemas.xml.%1", n), false)); } catch (...) {} /* We have a config file but it didn't load */ @@ -410,16 +417,20 @@ boost::filesystem::path Config::path (string file, bool create_directories) { boost::filesystem::path p; + if (test_path) { + p = test_path.get(); + } else { #ifdef DCPOMATIC_OSX - p /= g_get_home_dir (); - p /= "Library"; - p /= "Preferences"; - p /= "com.dcpomatic"; - p /= "2"; + p /= g_get_home_dir (); + p /= "Library"; + p /= "Preferences"; + p /= "com.dcpomatic"; + p /= "2"; #else - p /= g_get_user_config_dir (); - p /= "dcpomatic2"; + p /= g_get_user_config_dir (); + p /= "dcpomatic2"; #endif + } boost::system::error_code ec; if (create_directories) { boost::filesystem::create_directories (p, ec); diff --git a/src/lib/config.h b/src/lib/config.h index a57fbd587..61d9c64e6 100644 --- a/src/lib/config.h +++ b/src/lib/config.h @@ -675,6 +675,8 @@ public: static bool have_existing (std::string); static boost::filesystem::path config_file (); + static boost::optional test_path; + private: Config (); static boost::filesystem::path path (std::string file, bool create_directories = true); diff --git a/test/config_test.cc b/test/config_test.cc new file mode 100644 index 000000000..25e8c7d9d --- /dev/null +++ b/test/config_test.cc @@ -0,0 +1,90 @@ +/* + Copyright (C) 2018 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "lib/config.h" +#include +#include + +using std::ofstream; + +static void +rewrite_bad_config () +{ + boost::system::error_code ec; + boost::filesystem::remove ("build/test/config.xml", ec); + + Config::test_path = "build/test"; + ofstream f ("build/test/config.xml"); + f << "\n" + << "\n" + << "\n" + << "\n"; + f.close (); +} + + +BOOST_AUTO_TEST_CASE (config_backup_test) +{ + Config::drop(); + + boost::system::error_code ec; + boost::filesystem::remove ("build/test/config.xml.1", ec); + boost::filesystem::remove ("build/test/config.xml.2", ec); + boost::filesystem::remove ("build/test/config.xml.3", ec); + boost::filesystem::remove ("build/test/config.xml.4", ec); + boost::filesystem::remove ("build/test/config.xml.5", ec); + boost::filesystem::remove ("build/test/config.xml.5", ec); + + rewrite_bad_config(); + + Config::instance(); + + BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.1")); + BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.2")); + BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.3")); + BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.4")); + + Config::drop(); + rewrite_bad_config(); + Config::instance(); + + BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.1")); + BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.2")); + BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.3")); + BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.4")); + + Config::drop(); + rewrite_bad_config(); + Config::instance(); + + BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.1")); + BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.2")); + BOOST_CHECK ( boost::filesystem::exists ("build/test/config.xml.3")); + BOOST_CHECK (!boost::filesystem::exists ("build/test/config.xml.4")); + + Config::drop(); + rewrite_bad_config(); + Config::instance(); + + BOOST_CHECK (boost::filesystem::exists ("build/test/config.xml.1")); + BOOST_CHECK (boost::filesystem::exists ("build/test/config.xml.2")); + BOOST_CHECK (boost::filesystem::exists ("build/test/config.xml.3")); + BOOST_CHECK (boost::filesystem::exists ("build/test/config.xml.4")); +} diff --git a/test/wscript b/test/wscript index ecbc32fab..f0533cfa1 100644 --- a/test/wscript +++ b/test/wscript @@ -52,6 +52,7 @@ def build(bld): butler_test.cc client_server_test.cc colour_conversion_test.cc + config_test.cc content_test.cc dcpomatic_time_test.cc dcp_subtitle_test.cc -- 2.30.2