Fix ReosurcesMergingHelper wrongly modifing extensions of files having filename conflicts during export

This commit is contained in:
Florian Rival
2018-11-05 18:52:23 +00:00
parent e6eb193e8e
commit 569adc1500
2 changed files with 26 additions and 10 deletions

View File

@@ -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;

View File

@@ -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.
};