From 569adc150047dc4cd3ea5d11510c4cae89d15bd9 Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Mon, 5 Nov 2018 18:52:23 +0000 Subject: [PATCH] Fix ReosurcesMergingHelper wrongly modifing extensions of files having filename conflicts during export --- .../IDE/Project/ResourcesMergingHelper.cpp | 24 +++++++++++++++---- .../IDE/Project/ResourcesMergingHelper.h | 12 ++++++---- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/Core/GDCore/IDE/Project/ResourcesMergingHelper.cpp b/Core/GDCore/IDE/Project/ResourcesMergingHelper.cpp index 040e1492ad..79eeed557e 100644 --- a/Core/GDCore/IDE/Project/ResourcesMergingHelper.cpp +++ b/Core/GDCore/IDE/Project/ResourcesMergingHelper.cpp @@ -49,11 +49,25 @@ void ResourcesMergingHelper::SetNewFilename(gd::String oldFilename, gd::String newFilename) { if (oldFilenames.find(oldFilename) != oldFilenames.end()) return; - // Make sure that the new filename is not already used. - gd::String finalFilename = gd::NewNameGenerator::Generate( - newFilename, [this](const gd::String& name) { - return newFilenames.find(name) != newFilenames.end(); - }); + // Extract baseName and extension from the new filename + size_t extensionPos = newFilename.find_last_of("."); + gd::String extension = + extensionPos != gd::String::npos + ? newFilename.substr(extensionPos, newFilename.length()) + : ""; + gd::String baseName = newFilename.substr(0, extensionPos); + + // Make sure that the new filename is not already used. Generate a + // new filename while there is a collision. + // Preserving extension is important. + gd::String finalFilename = + gd::NewNameGenerator::Generate( + baseName, + [this, extension](const gd::String& newBaseName) { + return newFilenames.find(newBaseName + extension) != + newFilenames.end(); + }) + + extension; oldFilenames[oldFilename] = finalFilename; newFilenames[finalFilename] = oldFilename; diff --git a/Core/GDCore/IDE/Project/ResourcesMergingHelper.h b/Core/GDCore/IDE/Project/ResourcesMergingHelper.h index 31a3aaa92b..8c8b69c519 100644 --- a/Core/GDCore/IDE/Project/ResourcesMergingHelper.h +++ b/Core/GDCore/IDE/Project/ResourcesMergingHelper.h @@ -18,8 +18,10 @@ class AbstractFileSystem; namespace gd { /** - * \brief ResourcesMergingHelper is used (mainly during compilation) so - * as to inventory resources and change their filenames + * \brief ResourcesMergingHelper is used (mainly during export) + * to list resources and generate new filenames, to allow them to be all copied + * in a single directory (potentially changing the filename to avoid conflicts, + * but preserving extensions). * * \see ArbitraryResourceWorker * @@ -82,9 +84,9 @@ class GD_CORE_API ResourcesMergingHelper : public ArbitraryResourceWorker { ///< baseDirectory, will be preserved in ///< filenames. bool preserveAbsoluteFilenames; ///< If set to true, the filenames which are - ///< absolute ( C:\MyFile.png ) will not be - ///< transformed into their filenames ( - ///< MyFile.png ). + ///< absolute (C:\MyFile.png will not be + ///< transformed into a relative filename + ///< (MyFile.png). gd::AbstractFileSystem& fs; ///< The gd::AbstractFileSystem used to manipulate files. };