diff options
| author | Carl Hetherington <cth@carlh.net> | 2022-02-10 21:06:43 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2022-02-10 21:12:06 +0100 |
| commit | 7f5c053a13654224cea65beea0478267b97b8e1f (patch) | |
| tree | 3ec5516f837c033b1bac1552eed9e4f1864398d1 | |
| parent | 869e70cf34ac7f8e6b567bda17db3a72aa61142b (diff) | |
Don't give up on backups if config.xml isn't there (#2185).
Even if it isn't, we still want to try to back up other stuff.
Previously if copying config.xml threw an exception we'd just
give up.
| -rw-r--r-- | src/lib/config.cc | 26 | ||||
| -rw-r--r-- | test/config_test.cc | 26 |
2 files changed, 39 insertions, 13 deletions
diff --git a/src/lib/config.cc b/src/lib/config.cc index 7311189ad..b90f02816 100644 --- a/src/lib/config.cc +++ b/src/lib/config.cc @@ -235,7 +235,8 @@ Config::backup () while (n < 100 && exists(add_number(path_to_copy, n))) { ++n; } - copy_file(path_to_copy, add_number(path_to_copy, n)); + boost::system::error_code ec; + copy_file(path_to_copy, add_number(path_to_copy, n), ec); }; /* Make a backup copy of any config.xml, cinemas.xml, dkdm_recipients.xml that we might be about @@ -243,18 +244,17 @@ Config::backup () * and decide to overwrite it with a new one (possibly losing important details in the corrupted * file). But we might as well back up the other files while we're about it. */ - try { - /* This uses the State::write_path stuff so, e.g. for a current version 2.16 we might copy - * ~/.config/dcpomatic2/2.16/config.xml to ~/.config/dcpomatic2/2.16/config.xml.1 - */ - copy_adding_number (config_write_file()); - /* These do not use State::write_path, so whatever path is in the Config we will copy - * adding a number. - */ - copy_adding_number (_cinemas_file); - copy_adding_number (_dkdm_recipients_file); - } catch (...) {} + /* This uses the State::write_path stuff so, e.g. for a current version 2.16 we might copy + * ~/.config/dcpomatic2/2.16/config.xml to ~/.config/dcpomatic2/2.16/config.xml.1 + */ + copy_adding_number (config_write_file()); + + /* These do not use State::write_path, so whatever path is in the Config we will copy + * adding a number. + */ + copy_adding_number (_cinemas_file); + copy_adding_number (_dkdm_recipients_file); } void @@ -602,7 +602,7 @@ try } } catch (...) { - if (have_existing ("config.xml")) { + if (have_existing("config.xml") || have_existing("cinemas.xml") || have_existing("dkdm_recipients.xml")) { backup (); /* We have a config file but it didn't load */ FailedToLoad (); diff --git a/test/config_test.cc b/test/config_test.cc index 0e6a05ac0..6a65deb2e 100644 --- a/test/config_test.cc +++ b/test/config_test.cc @@ -19,13 +19,16 @@ */ +#include "lib/cinema.h" #include "lib/config.h" #include "test.h" #include <boost/test/unit_test.hpp> #include <fstream> +using std::list; using std::ofstream; +using std::make_shared; using std::string; using boost::optional; @@ -190,3 +193,26 @@ BOOST_AUTO_TEST_CASE (config_upgrade_test) BOOST_REQUIRE (!boost::filesystem::exists(dir / "2.16" / "cinemas.xml")); } + +BOOST_AUTO_TEST_CASE (config_keep_cinemas_if_making_new_config) +{ + boost::filesystem::path dir = "build/test/config_keep_cinemas_if_making_new_config"; + Config::override_path = dir; + Config::drop (); + boost::filesystem::remove_all (dir); + boost::filesystem::create_directories (dir); + + Config::instance()->write(); + + Config::instance()->add_cinema(make_shared<Cinema>("My Great Cinema", list<string>(), "", 0, 0)); + Config::instance()->write(); + + boost::filesystem::copy_file (dir / "cinemas.xml", dir / "backup_for_test.xml"); + + Config::drop (); + boost::filesystem::remove (dir / "2.16" / "config.xml"); + Config::instance(); + + check_text_file (dir / "backup_for_test.xml", dir / "cinemas.xml.1"); +} + |
