From 749bc50e1b2202846730d636d4d969bba3f24c82 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 8 Feb 2019 15:50:49 +0100 Subject: [PATCH] QmakeProjectManager: Prevent adding files to the project a second time We check the child nodes of the current project and only add the new file if it doesn't occur there already. Fixes: QTCREATORBUG-19546 Change-Id: Ic784a117515eb7e433ebf1d08db1708da6cf5440 Reviewed-by: Joerg Bornemann --- .../qmakeprojectmanager/qmakenodes.cpp | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmakeprojectmanager/qmakenodes.cpp b/src/plugins/qmakeprojectmanager/qmakenodes.cpp index ab518780abd..7ae34f31b62 100644 --- a/src/plugins/qmakeprojectmanager/qmakenodes.cpp +++ b/src/plugins/qmakeprojectmanager/qmakenodes.cpp @@ -171,7 +171,28 @@ bool QmakePriFileNode::removeSubProject(const QString &proFilePath) bool QmakePriFileNode::addFiles(const QStringList &filePaths, QStringList *notAdded) { QmakePriFile *pri = priFile(); - return pri ? pri->addFiles(filePaths, notAdded) : false; + if (!pri) + return false; + QList matchingNodes = findNodes([filePaths](const Node *n) { + return n->nodeType() == NodeType::File && filePaths.contains(n->filePath().toString()); + }); + matchingNodes = filtered(matchingNodes, [](const Node *n) { + for (const Node *parent = n->parentFolderNode(); parent; + parent = parent->parentFolderNode()) { + if (dynamic_cast(parent)) + return false; + } + return true; + }); + QStringList alreadyPresentFiles = transform(matchingNodes, + [](const Node *n) { return n->filePath().toString(); }); + alreadyPresentFiles.removeDuplicates(); + QStringList actualFilePaths = filePaths; + for (const QString &e : alreadyPresentFiles) + actualFilePaths.removeOne(e); + if (notAdded) + *notAdded = alreadyPresentFiles; + return pri->addFiles(actualFilePaths, notAdded); } bool QmakePriFileNode::removeFiles(const QStringList &filePaths, QStringList *notRemoved)