[Widelands-dev] [Merge] lp:~widelands-dev/widelands/robust-file-saving into lp:widelands

2018-11-07 Thread Arty
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

2018-11-07 Thread kaputtnik
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

2018-11-07 Thread Klaus Halfmann
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

2018-11-07 Thread Klaus Halfmann
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

2018-11-07 Thread GunChleoc
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