From 275eff97d9a82bb33df3fa44fbd05b6bb2f446db Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 17 Nov 2014 16:26:23 +0100 Subject: [PATCH] QbsProjectManager: Fix infinite loop on per-product build. - Setting the QFuture result is not enough, we also need to emit the finished() signal. - Never fail silently; use soft asserts for things that shouldn't happen and compile pane output for things that can. Task-number: QBS-705 Change-Id: I4dad18c2ad573a92f2a0c5aa92b596851c56541e Reviewed-by: Tobias Hunger --- .../qbsprojectmanager/qbsbuildstep.cpp | 6 ++- .../qbsprojectmanager/qbscleanstep.cpp | 1 + .../qbsprojectmanager/qbsinstallstep.cpp | 1 + src/plugins/qbsprojectmanager/qbsproject.cpp | 43 ++++++++++--------- src/plugins/qbsprojectmanager/qbsproject.h | 2 +- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 621581993b5..5e86c8b3ce7 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -365,10 +365,12 @@ void QbsBuildStep::build() options.setFilesToConsider(m_changedFiles); options.setActiveFileTags(m_activeFileTags); - m_job = qbsProject()->build(options, m_products); - + QString error; + m_job = qbsProject()->build(options, m_products, error); if (!m_job) { + emit addOutput(error, ErrorMessageOutput); m_fi->reportResult(false); + emit finished(); return; } diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.cpp b/src/plugins/qbsprojectmanager/qbscleanstep.cpp index d92b8674b90..f631dc21e7a 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.cpp +++ b/src/plugins/qbsprojectmanager/qbscleanstep.cpp @@ -105,6 +105,7 @@ void QbsCleanStep::run(QFutureInterface &fi) if (!m_job) { m_fi->reportResult(false); + emit finished(); return; } diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp index bf95db22577..b25038e2109 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp @@ -98,6 +98,7 @@ void QbsInstallStep::run(QFutureInterface &fi) if (!m_job) { m_fi->reportResult(false); + emit finished(); return; } diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 8b2c2bfe018..d3f5a1854bd 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -344,29 +344,32 @@ void QbsProject::invalidate() prepareForParsing(); } -qbs::BuildJob *QbsProject::build(const qbs::BuildOptions &opts, QStringList productNames) +qbs::BuildJob *QbsProject::build(const qbs::BuildOptions &opts, QStringList productNames, + QString &error) { - if (!qbsProject().isValid() || isParsing()) - return 0; - if (productNames.isEmpty()) { - return qbsProject().buildAllProducts(opts); - } else { - QList products; - foreach (const QString &productName, productNames) { - bool found = false; - foreach (const qbs::ProductData &data, qbsProjectData().allProducts()) { - if (uniqueProductName(data) == productName) { - found = true; - products.append(data); - break; - } - } - if (!found) - return 0; - } + QTC_ASSERT(qbsProject().isValid(), return 0); + QTC_ASSERT(!isParsing(), return 0); - return qbsProject().buildSomeProducts(products, opts); + if (productNames.isEmpty()) + return qbsProject().buildAllProducts(opts); + + QList products; + foreach (const QString &productName, productNames) { + bool found = false; + foreach (const qbs::ProductData &data, qbsProjectData().allProducts()) { + if (uniqueProductName(data) == productName) { + found = true; + products.append(data); + break; + } + } + if (!found) { + error = QLatin1String("Cannot build: Selected products do not exist anymore."); // TODO: Use tr() in 3.4 + return 0; + } } + + return qbsProject().buildSomeProducts(products, opts); } qbs::CleanJob *QbsProject::clean(const qbs::CleanOptions &opts) diff --git a/src/plugins/qbsprojectmanager/qbsproject.h b/src/plugins/qbsprojectmanager/qbsproject.h index 8a08a0ecb77..1d6155b690b 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.h +++ b/src/plugins/qbsprojectmanager/qbsproject.h @@ -84,7 +84,7 @@ public: const QString &newPath, const qbs::ProductData &productData, const qbs::GroupData &groupData); - qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products = QStringList()); + qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products, QString &error); qbs::CleanJob *clean(const qbs::CleanOptions &opts); qbs::InstallJob *install(const qbs::InstallOptions &opts);