diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-06-15 09:32:55 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-06-15 12:38:55 +0000 |
commit | 62808656466750ce5a0d42c656e45832220fedaa (patch) | |
tree | d05c4948395487fbe3819845bc3ebff080e550f3 | |
parent | d994e54712efb69225d73d93fc57b89a3d39cacb (diff) |
Check for duplicate entries in multiplex properties
This used to lead to an error message about duplicate product names,
which left the user in the dark about the actual problem.
Change-Id: I460dcdf89112124cfd303529d42acd6c13fe9155
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 18 | ||||
-rw-r--r-- | tests/auto/api/tst_api.cpp | 4 | ||||
-rw-r--r-- | tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs | 8 | ||||
-rw-r--r-- | tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs | 8 | ||||
-rw-r--r-- | tests/auto/language/tst_language.cpp | 5 |
5 files changed, 39 insertions, 4 deletions
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index df47e36ea..41781cb7d 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -789,11 +789,18 @@ ModuleLoader::MultiplexInfo ModuleLoader::extractMultiplexInfo(Item *productItem if (!multiplexedType.isEmpty()) multiplexInfo.multiplexedType = VariantValue::create(multiplexedType); + Set<QString> uniqueMultiplexByQbsProperties; for (const QString &key : multiplexByQbsProperties) { const QString mappedKey = multiplexMap.property(key).toString(); if (mappedKey.isEmpty()) throw ErrorInfo(Tr::tr("There is no entry for '%1' in 'qbs.multiplexMap'.").arg(key)); + if (!uniqueMultiplexByQbsProperties.insert(mappedKey).second) { + throw ErrorInfo(Tr::tr("Duplicate entry '%1' in Product.%2.") + .arg(mappedKey, StringConstants::multiplexByQbsPropertiesProperty()), + productItem->location()); + } + const QScriptValue arr = m_evaluator->value(qbsModuleItem, key); if (arr.isUndefined()) continue; @@ -806,8 +813,15 @@ ModuleLoader::MultiplexInfo ModuleLoader::extractMultiplexInfo(Item *productItem MultiplexRow mprow; mprow.resize(arrlen); - for (quint32 i = 0; i < arrlen; ++i) - mprow[i] = VariantValue::create(arr.property(i).toVariant()); + Set<QVariant> entriesForKey; + for (quint32 i = 0; i < arrlen; ++i) { + const QVariant value = arr.property(i).toVariant(); + if (!entriesForKey.insert(value).second) { + throw ErrorInfo(Tr::tr("Duplicate entry '%1' in qbs.%2.") + .arg(value.toString(), key), productItem->location()); + } + mprow[i] = VariantValue::create(value); + } multiplexInfo.table = combine(multiplexInfo.table, mprow); multiplexInfo.properties.push_back(mappedKey); } diff --git a/tests/auto/api/tst_api.cpp b/tests/auto/api/tst_api.cpp index 83a5ccbda..7af87fc32 100644 --- a/tests/auto/api/tst_api.cpp +++ b/tests/auto/api/tst_api.cpp @@ -1822,7 +1822,7 @@ void TestApi::multiArch() setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.get()); QVERIFY(setupJob->error().hasError()); - QVERIFY2(setupJob->error().toString().contains("Duplicate product name 'p1'"), + QVERIFY2(setupJob->error().toString().contains("Duplicate entry 'host' in qbs.profiles."), qPrintable(setupJob->error().toString())); // Error check: Try to build for the same profile twice, this time attaching @@ -1834,7 +1834,7 @@ void TestApi::multiArch() setupJob.reset(project.setupProject(setupParams, m_logSink, 0)); waitForFinished(setupJob.get()); QVERIFY(setupJob->error().hasError()); - QVERIFY2(setupJob->error().toString().contains("Duplicate product name 'p1'"), + QVERIFY2(setupJob->error().toString().contains("Duplicate entry 'target' in qbs.profiles."), qPrintable(setupJob->error().toString())); } diff --git a/tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs b/tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs new file mode 100644 index 000000000..56da41af1 --- /dev/null +++ b/tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs @@ -0,0 +1,8 @@ +import qbs + +Product { + name: "p" + multiplexByQbsProperties: "architectures" + aggregate: false + qbs.architectures: ["x86", "arm", "x86"] +} diff --git a/tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs b/tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs new file mode 100644 index 000000000..e412e5210 --- /dev/null +++ b/tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs @@ -0,0 +1,8 @@ +import qbs + +Product { + name: "p" + multiplexByQbsProperties: ["architectures", "buildVariants", "architectures"] + aggregate: false + qbs.architectures: ["x86", "arm"] +} diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp index f52c6ec9c..961808f3d 100644 --- a/tests/auto/language/tst_language.cpp +++ b/tests/auto/language/tst_language.cpp @@ -834,6 +834,11 @@ void TestLanguage::erroneousFiles_data() << "mismatching-multiplex-dependency.qbs:9:5.*Dependency from product " "'b \\{\"architecture\":\"mips\"\\}' to product 'a \\{\"architecture\":\"mips\"\\}'" " not fulfilled."; + QTest::newRow("duplicate-multiplex-value") + << "duplicate-multiplex-value.qbs:3:1.*Duplicate entry 'x86' in qbs.architectures."; + QTest::newRow("duplicate-multiplex-value2") + << "duplicate-multiplex-value2.qbs:3:1.*Duplicate entry 'architecture' in " + "Product.multiplexByQbsProperties."; QTest::newRow("invalid-references") << "invalid-references.qbs:4:17.*Cannot open '.*nosuchproject.qbs'"; } |