aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-06-15 09:32:55 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-06-15 12:38:55 +0000
commit62808656466750ce5a0d42c656e45832220fedaa (patch)
treed05c4948395487fbe3819845bc3ebff080e550f3
parentd994e54712efb69225d73d93fc57b89a3d39cacb (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.cpp18
-rw-r--r--tests/auto/api/tst_api.cpp4
-rw-r--r--tests/auto/language/testdata/erroneous/duplicate-multiplex-value.qbs8
-rw-r--r--tests/auto/language/testdata/erroneous/duplicate-multiplex-value2.qbs8
-rw-r--r--tests/auto/language/tst_language.cpp5
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'";
}