diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2023-09-22 12:02:43 +0200 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2023-09-22 12:14:30 +0000 |
commit | 9c9f30ebe7de41c7515effca7b1cde230239d6bd (patch) | |
tree | 221742e5ab5a858c16a21bc4e4c74f2bcc48a087 | |
parent | 2ff09f6e3ba7cf8d792b9aa45303432fadf9a308 (diff) |
QmlProject: Fix issues with cmakefiles.txt generation
If file names contain spaces we simply add quotes around the filename.
If file names contain special characters (!, % & etc), then we give a warning and skip the file to not break the build.
Task-number: QDS-10745
Change-Id: Iae9497725816769a8922a0ef38f0dc05fb1bb582
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
(cherry picked from commit e3461ccc5a3de03a92e665fe31ec0f95f29dab18)
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
Reviewed-by: Knud Dollereder <knud.dollereder@qt.io>
4 files changed, 56 insertions, 13 deletions
diff --git a/src/plugins/qmlprojectmanager/cmakegen/cmakegeneratordialog.cpp b/src/plugins/qmlprojectmanager/cmakegen/cmakegeneratordialog.cpp index 6ac7d9098d..aa733b68af 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/cmakegeneratordialog.cpp +++ b/src/plugins/qmlprojectmanager/cmakegen/cmakegeneratordialog.cpp @@ -2,9 +2,8 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #include "cmakegeneratordialog.h" -#include "cmakegeneratordialogtreemodel.h" -#include "generatecmakelistsconstants.h" #include "../qmlprojectmanagertr.h" +#include "cmakegeneratordialogtreemodel.h" #include <utils/utilsicons.h> #include <utils/detailswidget.h> @@ -21,10 +20,10 @@ using namespace Utils; namespace QmlProjectManager { namespace GenerateCmake { -CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, const FilePaths &files) - : QDialog(), - m_rootDir(rootDir), - m_files(files) +CmakeGeneratorDialog::CmakeGeneratorDialog(const FilePath &rootDir, + const FilePaths &files, + const FilePaths invalidFiles) + : QDialog(), m_rootDir(rootDir), m_files(files), m_invalidFiles(invalidFiles) { setWindowTitle(Tr::tr("Select Files to Generate")); @@ -106,6 +105,8 @@ FilePaths CmakeGeneratorDialog::getFilePaths() const QString FILE_CREATE_NOTIFICATION = Tr::tr("File %1 will be created.\n"); const QString FILE_OVERWRITE_NOTIFICATION = Tr::tr("File %1 will be overwritten.\n"); +const QString FILE_INVALID_NOTIFICATION = Tr::tr( + "File %1 contains invalid characters and will be skipped.\n"); void CmakeGeneratorDialog::refreshNotificationText() { @@ -119,6 +120,11 @@ void CmakeGeneratorDialog::refreshNotificationText() QList<CheckableFileTreeItem*> nodes = m_model->items(); + for (const auto &file : m_invalidFiles) { + cursor.insertImage(iformat); + cursor.insertText(QString(FILE_INVALID_NOTIFICATION).arg(file.displayName())); + } + for (CheckableFileTreeItem *node : nodes) { if (!m_files.contains(node->toFilePath())) continue; diff --git a/src/plugins/qmlprojectmanager/cmakegen/cmakegeneratordialog.h b/src/plugins/qmlprojectmanager/cmakegen/cmakegeneratordialog.h index 4c302b6736..fb15ec4de7 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/cmakegeneratordialog.h +++ b/src/plugins/qmlprojectmanager/cmakegen/cmakegeneratordialog.h @@ -22,7 +22,9 @@ class CmakeGeneratorDialog : public QDialog Q_OBJECT public: - CmakeGeneratorDialog(const Utils::FilePath &rootDir, const Utils::FilePaths &files); + CmakeGeneratorDialog(const Utils::FilePath &rootDir, + const Utils::FilePaths &files, + const Utils::FilePaths invalidFiles); Utils::FilePaths getFilePaths(); public slots: @@ -40,6 +42,7 @@ private: QVariant m_warningIcon; Utils::FilePath m_rootDir; Utils::FilePaths m_files; + Utils::FilePaths m_invalidFiles; }; } //GenerateCmake diff --git a/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp b/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp index 9603562dc6..cee9eb247e 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp +++ b/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.cpp @@ -142,7 +142,7 @@ void onGenerateCmakeLists() for (const GeneratableFile &file: cmakeGen.fileQueue().queuedFiles()) allFiles.append(file.filePath); - CmakeGeneratorDialog dialog(rootDir, allFiles); + CmakeGeneratorDialog dialog(rootDir, allFiles, cmakeGen.invalidFileNames()); if (dialog.exec()) { FilePaths confirmedFiles = dialog.getFilePaths(); cmakeGen.filterFileQueue(confirmedFiles); @@ -334,6 +334,11 @@ bool CmakeFileGenerator::execute() return m_fileQueue.writeQueuedFiles(); } +FilePaths CmakeFileGenerator::invalidFileNames() const +{ + return m_invalidFileNames; +} + const char DO_NOT_EDIT_FILE_COMMENT[] = "### This file is automatically generated by Qt Design Studio.\n### Do not change\n\n"; const char ADD_SUBDIR[] = "add_subdirectory(%1)\n"; @@ -491,8 +496,7 @@ QStringList CmakeFileGenerator::getDirectoryResources(const FilePath &dir) FilePaths allFiles = dir.dirEntries(FILES_ONLY); for (FilePath &file : allFiles) { - if (!file.fileName().endsWith(".qml", Qt::CaseInsensitive) && - includeFile(file)) { + if (!file.fileName().endsWith(".qml", Qt::CaseInsensitive) && includeFile(file)) { moduleFiles.append(file.fileName()); } } @@ -519,10 +523,20 @@ QStringList CmakeFileGenerator::getDirectoryTreeQmls(const FilePath &dir) return qmlFileList; } +static void appendWidthQuotes(QStringList &list, const QString &string) +{ + if (string.contains(' ')) + list.append("\"" + string + "\""); + else + list.append(string); +} + QStringList CmakeFileGenerator::getDirectoryTreeResources(const FilePath &dir) { QStringList resourceFileList; + //for (const auto &string : getDirectoryResources(dir)) + // appendWidthQuotes(resourceFileList, string); resourceFileList.append(getDirectoryResources(dir)); FilePaths subDirsList = dir.dirEntries(DIRS_ONLY); @@ -531,9 +545,8 @@ QStringList CmakeFileGenerator::getDirectoryTreeResources(const FilePath &dir) continue; QStringList subDirResources = getDirectoryTreeResources(subDir); for (QString &resource : subDirResources) { - resourceFileList.append(subDir.fileName().append('/').append(resource)); + appendWidthQuotes(resourceFileList, subDir.fileName().append('/').append(resource)); } - } return resourceFileList; @@ -556,6 +569,18 @@ bool CmakeFileGenerator::isDirBlacklisted(const FilePath &dir) return (!dir.fileName().compare(DIRNAME_DESIGNER)); } +bool CmakeFileGenerator::validFileName(const Utils::FilePath &filePath) +{ + QStringList invalidChars = {"!", "\"", "£", "$", "%", "!", "^", "&", "*", "(", ")", "=", "+", + "'", ",", ";", ":", "#", "~", "{", "{", "[", "]", "<", ">", "?"}; + const QString baseName = filePath.baseName(); + for (const auto &c : invalidChars) { + if (baseName.contains(c)) + return false; + } + return true; +} + bool CmakeFileGenerator::includeFile(const FilePath &filePath) { if (m_checkFileIsInProject) { @@ -564,7 +589,12 @@ bool CmakeFileGenerator::includeFile(const FilePath &filePath) return false; } - return !isFileBlacklisted(filePath.fileName()); + if (validFileName(filePath)) + return !isFileBlacklisted(filePath.fileName()); + else + m_invalidFileNames.append(filePath); + + return false; } bool CmakeFileGenerator::generateEntryPointFiles(const FilePath &dir) diff --git a/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.h b/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.h index 6afa9cda05..db025daa27 100644 --- a/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.h +++ b/src/plugins/qmlprojectmanager/cmakegen/generatecmakelists.h @@ -45,6 +45,7 @@ public: const FileQueue fileQueue() const; void filterFileQueue(const Utils::FilePaths &keepFiles); bool execute(); + Utils::FilePaths invalidFileNames() const; private: void generateMainCmake(const Utils::FilePath &rootDir); @@ -63,12 +64,15 @@ private: bool isFileBlacklisted(const QString &fileName); bool isDirBlacklisted(const Utils::FilePath &dir); bool includeFile(const Utils::FilePath &filePath); + bool validFileName(const Utils::FilePath &filePath); private: FileQueue m_fileQueue; QStringList m_resourceFileLocations; QStringList m_moduleNames; bool m_checkFileIsInProject; + + Utils::FilePaths m_invalidFileNames; }; } //GenerateCmake |