diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2023-08-26 16:12:07 +0300 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2023-08-29 14:53:05 +0000 |
commit | 229061b696a14e4578a25f5288f7c994f1a6b0b8 (patch) | |
tree | 0d1f332d0fd26f817f15e7db68f2c60b7b4b5dd3 | |
parent | f19e6751987c54ee5cb16cfa144c82f4fd36dc73 (diff) |
providers: report exceptions in Provider items
If provider is seriously broken, we should give
user some hints in case of optional dependencies;
otherwise errors are silently ignored.
Change-Id: Ie88c2c706bff600086d7760056df155b7a7e8705
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
5 files changed, 63 insertions, 25 deletions
diff --git a/src/lib/corelib/loader/moduleproviderloader.cpp b/src/lib/corelib/loader/moduleproviderloader.cpp index bf2f23e19..9272a9f8e 100644 --- a/src/lib/corelib/loader/moduleproviderloader.cpp +++ b/src/lib/corelib/loader/moduleproviderloader.cpp @@ -82,34 +82,41 @@ ModuleProviderLoader::ModuleProviderResult ModuleProviderLoader::executeModulePr FallbackMode fallbackMode) { ModuleProviderLoader::ModuleProviderResult result; - std::vector<Provider> providersToRun; - qCDebug(lcModuleLoader) << "Module" << moduleName.toString() - << "not found, checking for module providers"; - const auto providerNames = getModuleProviders(productContext.item); - if (providerNames) { - providersToRun = transformed<std::vector<Provider>>(*providerNames, [](const auto &name) { - return Provider{name, ModuleProviderLookup::Named}; }); - } else { - for (QualifiedId providerName = moduleName; !providerName.empty(); - providerName.pop_back()) { - providersToRun.push_back({providerName, ModuleProviderLookup::Scoped}); + try { + std::vector<Provider> providersToRun; + qCDebug(lcModuleLoader) << "Module" << moduleName.toString() + << "not found, checking for module providers"; + const auto providerNames = getModuleProviders(productContext.item); + if (providerNames) { + providersToRun = transformed<std::vector<Provider>>(*providerNames, [](const auto &name) { + return Provider{name, ModuleProviderLookup::Named}; }); + } else { + for (QualifiedId providerName = moduleName; !providerName.empty(); + providerName.pop_back()) { + providersToRun.push_back({providerName, ModuleProviderLookup::Scoped}); + } } - } - result = executeModuleProvidersHelper( - productContext, dependsItemLocation, moduleName, providersToRun); - - if (fallbackMode == FallbackMode::Enabled - && !result.providerFound - && !providerNames) { - qCDebug(lcModuleLoader) << "Specific module provider not found for" - << moduleName.toString() << ", setting up fallback."; result = executeModuleProvidersHelper( - productContext, - dependsItemLocation, - moduleName, - {{moduleName, ModuleProviderLookup::Fallback}}); + productContext, dependsItemLocation, moduleName, providersToRun); + + if (fallbackMode == FallbackMode::Enabled + && !result.providerFound + && !providerNames) { + qCDebug(lcModuleLoader) << "Specific module provider not found for" + << moduleName.toString() << ", setting up fallback."; + result = executeModuleProvidersHelper( + productContext, + dependsItemLocation, + moduleName, + {{moduleName, ModuleProviderLookup::Fallback}}); + } + } catch (const ErrorInfo &error) { + auto ei = error; + ei.prepend( + Tr::tr("Error executing provider for module '%1':").arg(moduleName.toString()), + dependsItemLocation); + productContext.handleError(ei); } - return result; } diff --git a/tests/auto/blackbox/testdata-providers/broken-provider/broken-provider.qbs b/tests/auto/blackbox/testdata-providers/broken-provider/broken-provider.qbs new file mode 100644 index 000000000..461c7e30e --- /dev/null +++ b/tests/auto/blackbox/testdata-providers/broken-provider/broken-provider.qbs @@ -0,0 +1,13 @@ +Project { + qbsModuleProviders: "provider_a" + name: "project" + Project { + name: "innerProject" + Product { + name: "p1" + Depends { name: "qbsothermodule"; required: false } + Depends { name: "qbsmetatestmodule" } + } + } + +} diff --git a/tests/auto/blackbox/testdata-providers/broken-provider/module-providers/provider_a.qbs b/tests/auto/blackbox/testdata-providers/broken-provider/module-providers/provider_a.qbs new file mode 100644 index 000000000..f446d2d13 --- /dev/null +++ b/tests/auto/blackbox/testdata-providers/broken-provider/module-providers/provider_a.qbs @@ -0,0 +1,5 @@ +ModuleProvider { + relativeSearchPaths: { + throw "This provider is broken"; + } +} diff --git a/tests/auto/blackbox/tst_blackboxproviders.cpp b/tests/auto/blackbox/tst_blackboxproviders.cpp index 327fedea5..9d1c6d7d4 100644 --- a/tests/auto/blackbox/tst_blackboxproviders.cpp +++ b/tests/auto/blackbox/tst_blackboxproviders.cpp @@ -49,6 +49,18 @@ TestBlackboxProviders::TestBlackboxProviders() { } +void TestBlackboxProviders::brokenProvider() +{ + QDir::setCurrent(testDataDir + "/broken-provider"); + QbsRunParameters params; + params.expectFailure = true; + QVERIFY(runQbs(params) != 0); + + QVERIFY(m_qbsStderr.contains("Error executing provider for module 'qbsothermodule'")); + QVERIFY(m_qbsStderr.contains("Error executing provider for module 'qbsmetatestmodule'")); + QCOMPARE(m_qbsStderr.count("This provider is broken"), 2); +} + void TestBlackboxProviders::fallbackModuleProvider_data() { QTest::addColumn<bool>("fallbacksEnabledGlobally"); diff --git a/tests/auto/blackbox/tst_blackboxproviders.h b/tests/auto/blackbox/tst_blackboxproviders.h index 02bd91617..62dce9866 100644 --- a/tests/auto/blackbox/tst_blackboxproviders.h +++ b/tests/auto/blackbox/tst_blackboxproviders.h @@ -41,6 +41,7 @@ public: TestBlackboxProviders(); private slots: + void brokenProvider(); void fallbackModuleProvider_data(); void fallbackModuleProvider(); void moduleProviders(); |