diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp index 8b011c642e9..9e55ffb1964 100644 --- a/src/plugins/qbsprojectmanager/qbsnodes.cpp +++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp @@ -35,7 +35,6 @@ #include #include -#include #include #include #include @@ -116,46 +115,6 @@ static qbs::GroupData findMainQbsGroup(const qbs::ProductData &productData) return qbs::GroupData(); } -static bool addQbsFiles(QbsBaseProjectNode *node, const QStringList &filePaths, qbs::Project prj, - const qbs::ProductData &productData, const qbs::GroupData &groupData, - const QString &productPath, QStringList *notAdded) -{ - QStringList allPaths = groupData.allFilePaths(); - foreach (const QString &path, filePaths) { - qbs::ErrorInfo err = prj.addFiles(productData, groupData, QStringList() << path); - if (err.hasError()) { - Core::MessageManager::write(err.toString()); - *notAdded += path; - } else { - allPaths += path; - } - } - - if (notAdded->count() != filePaths.count()) - QbsGroupNode::setupFiles(node, allPaths, productPath, true); - return notAdded->isEmpty(); -} - -static bool removeQbsFiles(QbsBaseProjectNode *node, const QStringList &filePaths, qbs::Project prj, - const qbs::ProductData &productData, const qbs::GroupData &groupData, - const QString &productPath, QStringList *notRemoved) -{ - QStringList allPaths = groupData.allFilePaths(); - foreach (const QString &path, filePaths) { - qbs::ErrorInfo err = prj.removeFiles(productData, groupData, QStringList() << path); - if (err.hasError()) { - Core::MessageManager::write(err.toString()); - *notRemoved += path; - } else { - allPaths.removeOne(path); - } - } - - if (notRemoved->count() != filePaths.count()) - QbsGroupNode::setupFiles(node, allPaths, productPath, true); - return notRemoved->isEmpty(); -} - class FileTreeNode { public: explicit FileTreeNode(const QString &n = QString(), FileTreeNode *p = 0, bool f = false) : @@ -428,8 +387,8 @@ bool QbsGroupNode::addFiles(const QStringList &filePaths, QStringList *notAdded) return false; } - return addQbsFiles(this, filePaths, prjNode->qbsProject(), prdNode->qbsProductData(), - *m_qbsGroupData, m_productPath, notAdded); + return prjNode->project()->addFilesToProduct(this, filePaths, prdNode->qbsProductData(), + *m_qbsGroupData, notAdded); } bool QbsGroupNode::removeFiles(const QStringList &filePaths, QStringList *notRemoved) @@ -450,8 +409,8 @@ bool QbsGroupNode::removeFiles(const QStringList &filePaths, QStringList *notRem return false; } - return removeQbsFiles(this, filePaths, prjNode->qbsProject(), prdNode->qbsProductData(), - *m_qbsGroupData, m_productPath, notRemoved); + return prjNode->project()->removeFilesFromProduct(this, filePaths, prdNode->qbsProductData(), + *m_qbsGroupData, notRemoved); } void QbsGroupNode::updateQbsGroupData(const qbs::GroupData *grp, const QString &productPath, @@ -632,8 +591,8 @@ bool QbsProductNode::addFiles(const QStringList &filePaths, QStringList *notAdde qbs::GroupData grp = findMainQbsGroup(m_qbsProductData); if (grp.isValid()) { - const QString &productPath = QFileInfo(m_qbsProductData.location().fileName()).absolutePath(); - return addQbsFiles(this, filePaths, prjNode->qbsProject(), m_qbsProductData, grp, productPath, notAdded); + return prjNode->project()->addFilesToProduct(this, filePaths, m_qbsProductData, grp, + notAdded); } QTC_ASSERT(false, return false); @@ -653,8 +612,8 @@ bool QbsProductNode::removeFiles(const QStringList &filePaths, QStringList *notR qbs::GroupData grp = findMainQbsGroup(m_qbsProductData); if (grp.isValid()) { - const QString &productPath = QFileInfo(m_qbsProductData.location().fileName()).absolutePath(); - return removeQbsFiles(this, filePaths, prjNode->qbsProject(), m_qbsProductData, grp, productPath, notRemoved); + return prjNode->project()->removeFilesFromProduct(this, filePaths, m_qbsProductData, grp, + notRemoved); } QTC_ASSERT(false, return false); diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 023a8b5a366..77286d177a2 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -37,10 +37,9 @@ #include "qbsnodes.h" #include -#include - #include #include +#include #include #include #include @@ -62,6 +61,7 @@ #include #include #include +#include #include @@ -185,6 +185,84 @@ QStringList QbsProject::files(Project::FilesMode fileMode) const return result.toList(); } +class ChangeExpector +{ +public: + ChangeExpector(const QString &filePath, const QSet &documents) + : m_document(0) + { + foreach (Core::IDocument * const doc, documents) { + if (doc->filePath() == filePath) { + m_document = doc; + break; + } + } + QTC_ASSERT(m_document, return); + Core::DocumentManager::expectFileChange(filePath); + m_wasInDocumentManager = Core::DocumentManager::removeDocument(m_document); + QTC_CHECK(m_wasInDocumentManager); + } + + ~ChangeExpector() + { + QTC_ASSERT(m_document, return); + Core::DocumentManager::addDocument(m_document); + Core::DocumentManager::unexpectFileChange(m_document->filePath()); + } + +private: + Core::IDocument *m_document; + bool m_wasInDocumentManager; +}; + +bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList &filePaths, + const qbs::ProductData &productData, const qbs::GroupData &groupData, QStringList *notAdded) +{ + QTC_ASSERT(m_qbsProject.isValid(), return false); + QStringList allPaths = groupData.allFilePaths(); + const QString productFilePath = productData.location().fileName(); + ChangeExpector expector(productFilePath, m_qbsDocuments); + foreach (const QString &path, filePaths) { + qbs::ErrorInfo err = m_qbsProject.addFiles(productData, groupData, QStringList() << path); + if (err.hasError()) { + Core::MessageManager::write(err.toString()); + *notAdded += path; + } else { + allPaths += path; + } + } + if (notAdded->count() != filePaths.count()) { + m_projectData = m_qbsProject.projectData(); + QbsGroupNode::setupFiles(node, allPaths, QFileInfo(productFilePath).absolutePath(), true); + } + return notAdded->isEmpty(); +} + +bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringList &filePaths, + const qbs::ProductData &productData, const qbs::GroupData &groupData, + QStringList *notRemoved) +{ + QTC_ASSERT(m_qbsProject.isValid(), return false); + QStringList allPaths = groupData.allFilePaths(); + const QString productFilePath = productData.location().fileName(); + ChangeExpector expector(productFilePath, m_qbsDocuments); + foreach (const QString &path, filePaths) { + qbs::ErrorInfo err + = m_qbsProject.removeFiles(productData, groupData, QStringList() << path); + if (err.hasError()) { + Core::MessageManager::write(err.toString()); + *notRemoved += path; + } else { + allPaths.removeOne(path); + } + } + if (notRemoved->count() != filePaths.count()) { + m_projectData = m_qbsProject.projectData(); + QbsGroupNode::setupFiles(node, allPaths, QFileInfo(productFilePath).absolutePath(), true); + } + return notRemoved->isEmpty(); +} + void QbsProject::invalidate() { prepareForParsing(); diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 1f22cde680e..e464d444815 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -48,6 +48,8 @@ namespace qbs { class BuildJob; class CleanJob; class Error; +class GroupData; +class ProductData; class ProjectData; class CleanOptions; class InstallJob; @@ -62,7 +64,7 @@ namespace ProjectExplorer { class BuildConfiguration; } namespace QbsProjectManager { namespace Internal { - +class QbsBaseProjectNode; class QbsProjectNode; class QbsRootProjectNode; class QbsProjectParser; @@ -84,6 +86,13 @@ public: QStringList files(FilesMode fileMode) const; + bool addFilesToProduct(QbsBaseProjectNode *node, const QStringList &filePaths, + const qbs::ProductData &productData, const qbs::GroupData &groupData, + QStringList *notAdded); + bool removeFilesFromProduct(QbsBaseProjectNode *node, const QStringList &filePaths, + const qbs::ProductData &productData, const qbs::GroupData &groupData, + QStringList *notRemoved); + qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products = QStringList()); qbs::CleanJob *clean(const qbs::CleanOptions &opts); qbs::InstallJob *install(const qbs::InstallOptions &opts);