[Widelands-dev] [Merge] lp:~widelands-dev/widelands/robust-file-saving into lp:widelands
Arty has proposed merging lp:~widelands-dev/widelands/robust-file-saving into lp:widelands with lp:~widelands-dev/widelands/bug-1753230-working-with-tempfiles as a prerequisite. Requested reviews: Widelands Developers (widelands-dev) For more details, see: https://code.launchpad.net/~widelands-dev/widelands/robust-file-saving/+merge/358473 -- Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/robust-file-saving into lp:widelands. === modified file 'src/editor/CMakeLists.txt' --- src/editor/CMakeLists.txt 2018-07-19 16:43:14 + +++ src/editor/CMakeLists.txt 2018-11-08 02:11:06 + @@ -99,6 +99,7 @@ logic logic_constants logic_filesystem_constants +logic_generic_save_handler logic_tribe_basic_info logic_widelands_geometry map_io === modified file 'src/editor/ui_menus/main_menu_save_map.cc' --- src/editor/ui_menus/main_menu_save_map.cc 2018-11-08 02:11:06 + +++ src/editor/ui_menus/main_menu_save_map.cc 2018-11-08 02:11:06 + @@ -29,6 +29,7 @@ #include "base/i18n.h" #include "base/macros.h" +#include "base/time_string.h" #include "base/wexception.h" #include "editor/editorinteractive.h" #include "editor/ui_menus/main_menu_map_options.h" @@ -37,6 +38,7 @@ #include "io/filesystem/layered_filesystem.h" #include "io/filesystem/zip_filesystem.h" #include "logic/filesystem_constants.h" +#include "logic/generic_save_handler.h" #include "map_io/map_saver.h" #include "map_io/widelands_map_loader.h" #include "ui_basic/messagebox.h" @@ -119,7 +121,8 @@ * Called when the ok button was pressed or a file in list was double clicked. */ void MainMenuSaveMap::clicked_ok() { - assert(ok_.enabled()); + if (!ok_.enabled()) + return; std::string filename = editbox_->text(); std::string complete_filename; @@ -243,15 +246,12 @@ /** * Save the map in the current directory with - * the current filename + * the given filename * * returns true if dialog should close, false if it * should stay open */ bool MainMenuSaveMap::save_map(std::string filename, bool binary) { - // Make sure that the current directory exists and is writeable. - g_fs->ensure_directory_exists(curdir_); - // Trim it for preceding/trailing whitespaces in user input boost::trim(filename); @@ -272,18 +272,6 @@ if (mbox.run() == UI::Panel::Returncodes::kBack) return false; } - - // Try deleting file (if it exists). If it fails, give a message and let the player choose a new name. - try { - g_fs->fs_unlink(complete_filename); - } catch (const std::exception& e) { - const std::string s = - (boost::format(_("File ‘%s.tmp’ could not be deleted.")) % FileSystem::fs_filename(filename.c_str())).str() - + " " + _("Try saving under a different name!"); - UI::WLMessageBox mbox((), _("Error Saving Map!"), s, UI::WLMessageBox::MBoxType::kOk); - mbox.run(); - return false; - } Widelands::EditorGameBase& egbase = eia().egbase(); Widelands::Map* map = egbase.mutable_map(); @@ -301,23 +289,34 @@ } else { map->delete_tag("artifacts"); } - - // Try saving. - try { - std::unique_ptr fs( - g_fs->create_sub_file_system(complete_filename, binary ? FileSystem::ZIP : FileSystem::DIR)); - Widelands::MapSaver* wms = new Widelands::MapSaver(*fs, egbase); - wms->save(); - delete wms; - fs.reset(); - } catch (const std::exception& e) { - std::string s = _("Error Saving Map!\nSaved map file may be corrupt!\n\nReason " - "given:\n"); - s += e.what(); - UI::WLMessageBox mbox((), _("Error Saving Map!"), s, UI::WLMessageBox::MBoxType::kOk); - mbox.run(); + + // Try saving the map. + GenericSaveHandler gsh( + [](FileSystem& fs) { + Widelands::MapSaver wms(fs, egbase); + wms.save(); + }, + complete_filename, + binary ? FileSystem::ZIP : FileSystem::DIR + ); + uint32_t error = gsh.save(); + if (error == GenericSaveHandler::kSuccess || + error == GenericSaveHandler::kDeletingBackupFailed) { + // No need to bother the player if only the temporary backup couldn't be deleted. + // Automatic cleanup will try to deal with it later. + egbase.get_ibase()->log_message(_("Map saved")); + return true; } - die(); + std::string msg = gsh.localized_formatted_result_message(); + UI::WLMessageBox mbox(this, _("Error Saving Map!"), msg, UI::WLMessageBox::MBoxType::kOk); + mbox.run(); + + // If only the backup failed (likely just because of a file lock), + // then leave the dialog open for the player to try with a new filename. + if (error == GenericSaveHandler::kBackupFailed) + return false; + + // In the other error cases close the dialog. return true; } === modified file 'src/io/filesystem/disk_filesystem.cc' --- src/io/filesystem/disk_filesystem.cc 2018-04-07 16:59:00 + +++ src/io/filesystem/disk_filesystem.cc 2018-11-08 02:11:06 + @@ -167,15 +167,13 @@ } /** - * Create a sub filesystem out of this filesystem + * Make a sub filesystem out of this filesystem
Re: [Widelands-dev] [Merge] lp:~widelands-dev/widelands-website/tabbed_profile into lp:widelands-website
Friendly ping: What is the state of testing? Applying an other look and feel can be adjusted if this branch is deployed, i think. -- https://code.launchpad.net/~widelands-dev/widelands-website/tabbed_profile/+merge/356749 Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands-website/tabbed_profile into lp:widelands-website. ___ Mailing list: https://launchpad.net/~widelands-dev Post to : widelands-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp
Re: [Widelands-dev] [Merge] lp:~widelands-dev/widelands/bug-1800814-update-script into lp:widelands
Review: Approve compile.ch / 2 x update.sh Works as desigends, lets have it. @bunnybot merge -- https://code.launchpad.net/~widelands-dev/widelands/bug-1800814-update-script/+merge/358419 Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/bug-1800814-update-script. ___ Mailing list: https://launchpad.net/~widelands-dev Post to : widelands-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp
Re: [Widelands-dev] [Merge] lp:~widelands-dev/widelands/bug-1800814-update-script into lp:widelands
Had to manully inject code from number_of_cpus branch. code is straight foreward. -- https://code.launchpad.net/~widelands-dev/widelands/bug-1800814-update-script/+merge/358419 Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1800814-update-script into lp:widelands. ___ Mailing list: https://launchpad.net/~widelands-dev Post to : widelands-dev@lists.launchpad.net Unsubscribe : https://launchpad.net/~widelands-dev More help : https://help.launchpad.net/ListHelp
[Widelands-dev] [Merge] lp:~widelands-dev/widelands/bug-1800337-unlocalize-log into lp:widelands
GunChleoc has proposed merging lp:~widelands-dev/widelands/bug-1800337-unlocalize-log into lp:widelands. Commit message: Use internal names rather than descnames for log messages and workarea IDs. Requested reviews: Widelands Developers (widelands-dev) Related bugs: Bug #1800337 in widelands: "logoutput should not be localized" https://bugs.launchpad.net/widelands/+bug/1800337 For more details, see: https://code.launchpad.net/~widelands-dev/widelands/bug-1800337-unlocalize-log/+merge/358424 -- Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1800337-unlocalize-log into lp:widelands. === modified file 'src/logic/map_objects/tribes/militarysite.cc' --- src/logic/map_objects/tribes/militarysite.cc 2018-04-07 16:59:00 + +++ src/logic/map_objects/tribes/militarysite.cc 2018-11-07 10:28:51 + @@ -307,7 +307,7 @@ heal_per_second_ = table.get_int("heal_per_second"); if (conquer_radius_ > 0) - workarea_info_[conquer_radius_].insert(descname() + " conquer"); + workarea_info_[conquer_radius_].insert(name() + " conquer"); prefers_heroes_at_start_ = table.get_bool("prefer_heroes"); std::unique_ptr items_table = table.get_table("messages"); === modified file 'src/logic/map_objects/tribes/production_program.cc' --- src/logic/map_objects/tribes/production_program.cc 2018-10-12 10:29:33 + +++ src/logic/map_objects/tribes/production_program.cc 2018-11-07 10:28:51 + @@ -575,7 +575,7 @@ if (it == programs.end()) throw GameDataError("the program \"%s\" has not (yet) been declared in %s " "(wrong declaration order?)", -program_name, descr.descname().c_str()); +program_name, descr.name().c_str()); program_ = it->second.get(); } @@ -663,13 +663,13 @@ for (const auto& area_info : worker_workarea_info) { std::set& building_radius_infos = descr->workarea_info_[area_info.first]; - for (const std::string& worker_descname : area_info.second) { -std::string description = descr->descname(); + for (const std::string& worker_name : area_info.second) { +std::string description = descr->name(); description += ' '; description += production_program_name; description += " worker "; description += main_worker_descr.name(); -description += worker_descname; +description += worker_name; building_radius_infos.insert(description); } } @@ -1124,8 +1124,8 @@ throw GameDataError("expected %s but found \"%s\"", "percentage", parameters); } std::string description = - (boost::format("%1$s %2$s mine %3$s") % descr->descname() % production_program_name % - world.get_resource(resource_)->descname()) + (boost::format("%1$s %2$s mine %3$s") % descr->name() % production_program_name % + world.get_resource(resource_)->name()) .str(); descr->workarea_info_[distance_].insert(description); === modified file 'src/logic/map_objects/tribes/productionsite.cc' --- src/logic/map_objects/tribes/productionsite.cc 2018-09-10 05:59:47 + +++ src/logic/map_objects/tribes/productionsite.cc 2018-11-07 10:28:51 + @@ -559,7 +559,7 @@ * Intercept remove_worker() calls to unassign our worker, if necessary. */ void ProductionSite::remove_worker(Worker& w) { - molog("%s leaving\n", w.descr().descname().c_str()); + molog("%s leaving\n", w.descr().name().c_str()); WorkingPosition* wp = working_positions_; for (const auto& temp_wp : descr().working_positions()) { @@ -657,7 +657,7 @@ if (current == nuwo) throw wexception( "Something went wrong! No fitting place for worker %s in %s at (%u, %u) found!", - w->descr().descname().c_str(), psite.descr().descname().c_str(), + w->descr().name().c_str(), psite.descr().name().c_str(), psite.get_position().x, psite.get_position().y); } } === modified file 'src/logic/map_objects/tribes/tribe_descr.cc' --- src/logic/map_objects/tribes/tribe_descr.cc 2018-09-15 07:47:59 + +++ src/logic/map_objects/tribes/tribe_descr.cc 2018-11-07 10:28:51 + @@ -393,7 +393,7 @@ if (!res || !amount) { auto list = resource_indicators_.find(""); if (list == resource_indicators_.end() || list->second.empty()) { - throw GameDataError("Tribe '%s' has no indicator for no resources!", descname_.c_str()); + throw GameDataError("Tribe '%s' has no indicator for no resources!", name_.c_str()); } return list->second.begin()->second; } @@ -401,7 +401,7 @@ auto list = resource_indicators_.find(res->name()); if (list == resource_indicators_.end() || list->second.empty()) { throw GameDataError( - "Tribe '%s' has no indicators for resource '%s'!", descname_.c_str(), res->name().c_str()); + "Tribe '%s' has no indicators for resource '%s'!", name_.c_str(), res->name().c_str()); } uint32_t lowest = 0; @@ -416,7 +416,7 @@ if (lowest < amount) { throw GameDataError("Tribe '%s' has no