aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2014-07-18 18:00:12 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-07-22 15:29:15 +0200
commit5492470c39547dfedf7763ef12dfb218f1c93c31 (patch)
tree6013ecff85b1d14e4f151b2ac6860e4839a2c90f /src/lib
parentccc47f723118b78e5c17967497c32f625b13e960 (diff)
introduce Project.minimumQbsVersion
This property can be used to specify the minimum required QBS version of a project. Change-Id: I564f4298c060c3acf2f6221fb1d6978eda1dd1a5 Task-number: QBS-453 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/corelib/language/builtindeclarations.cpp1
-rw-r--r--src/lib/corelib/language/projectresolver.cpp32
-rw-r--r--src/lib/corelib/language/projectresolver.h3
-rw-r--r--src/lib/corelib/language/testdata/erroneous/oldQbsVersion.qbs5
-rw-r--r--src/lib/corelib/language/testdata/erroneous/wrongQbsVersionFormat.qbs5
-rw-r--r--src/lib/corelib/language/tst_language.cpp5
6 files changed, 51 insertions, 0 deletions
diff --git a/src/lib/corelib/language/builtindeclarations.cpp b/src/lib/corelib/language/builtindeclarations.cpp
index 85eedf843..eef7f78eb 100644
--- a/src/lib/corelib/language/builtindeclarations.cpp
+++ b/src/lib/corelib/language/builtindeclarations.cpp
@@ -284,6 +284,7 @@ void BuiltinDeclarations::addProjectItem()
item << nameProperty();
item << conditionProperty();
item << buildDirProperty();
+ item << PropertyDeclaration(QLatin1String("minimumQbsVersion"), PropertyDeclaration::String);
item << PropertyDeclaration(QLatin1String("sourceDirectory"), PropertyDeclaration::Path);
item << PropertyDeclaration(QLatin1String("profile"), PropertyDeclaration::String);
item << PropertyDeclaration(QLatin1String("references"), PropertyDeclaration::Variant,
diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp
index a30422cf8..5d6a97349 100644
--- a/src/lib/corelib/language/projectresolver.cpp
+++ b/src/lib/corelib/language/projectresolver.cpp
@@ -219,6 +219,23 @@ void ProjectResolver::resolveProject(Item *item, ProjectContext *projectContext)
return;
}
+ const QString minVersionStr
+ = m_evaluator->stringValue(item, QLatin1String("minimumQbsVersion"),
+ QLatin1String("1.3.0"));
+ bool ok;
+ const Version minVersion = qbsVersionFromString(minVersionStr, &ok);
+ if (!ok) {
+ throw ErrorInfo(Tr::tr("The value of Project.minimumQbsVersion "
+ "is not a valid version string."));
+ }
+ if (!m_qbsVersion.isValid())
+ m_qbsVersion = qbsVersionFromString(QLatin1String(QBS_VERSION));
+ if (m_qbsVersion < minVersion) {
+ throw ErrorInfo(Tr::tr("The project requires at least qbs version %1 but "
+ "this is qbs version %2.").arg(minVersion.toString(),
+ m_qbsVersion.toString()));
+ }
+
projectContext->dummyModule = ResolvedModule::create();
for (Item::PropertyDeclarationMap::const_iterator it
@@ -1107,5 +1124,20 @@ ProjectResolver::ProjectContext ProjectResolver::createProjectContext(ProjectCon
return subProjectContext;
}
+Version ProjectResolver::qbsVersionFromString(const QString &str, bool *ok)
+{
+ if (ok)
+ *ok = true;
+ QRegExp rex(QLatin1String("(\\d+)\\.(\\d+)(?:\\.(\\d+))?"));
+ if (rex.exactMatch(str)) {
+ const QString cap3 = rex.cap(3);
+ return Version(rex.cap(1).toInt(), rex.cap(2).toInt(),
+ cap3.isEmpty() ? 0 : cap3.toInt());
+ }
+ if (ok)
+ *ok = false;
+ return Version();
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/corelib/language/projectresolver.h b/src/lib/corelib/language/projectresolver.h
index ab1bfd6a2..091c932f3 100644
--- a/src/lib/corelib/language/projectresolver.h
+++ b/src/lib/corelib/language/projectresolver.h
@@ -35,6 +35,7 @@
#include "language.h"
#include <logging/logger.h>
#include <tools/setupprojectparameters.h>
+#include <tools/version.h>
#include <QMap>
#include <QSet>
@@ -123,12 +124,14 @@ private:
QString convertPathProperty(const QString &path, const QString &dirPath) const;
QStringList convertPathListProperty(const QStringList &paths, const QString &dirPath) const;
ProjectContext createProjectContext(ProjectContext *parentProjectContext) const;
+ static Version qbsVersionFromString(const QString &str, bool *ok = 0);
Evaluator *m_evaluator;
const BuiltinDeclarations *m_builtins;
Logger m_logger;
ScriptEngine *m_engine;
ProgressObserver *m_progressObserver;
+ Version m_qbsVersion;
ProductContext *m_productContext;
ModuleContext *m_moduleContext;
QMap<QString, ResolvedProductPtr> m_productsByName;
diff --git a/src/lib/corelib/language/testdata/erroneous/oldQbsVersion.qbs b/src/lib/corelib/language/testdata/erroneous/oldQbsVersion.qbs
new file mode 100644
index 000000000..9217c9410
--- /dev/null
+++ b/src/lib/corelib/language/testdata/erroneous/oldQbsVersion.qbs
@@ -0,0 +1,5 @@
+import qbs
+
+Project {
+ minimumQbsVersion: "999.5.4"
+}
diff --git a/src/lib/corelib/language/testdata/erroneous/wrongQbsVersionFormat.qbs b/src/lib/corelib/language/testdata/erroneous/wrongQbsVersionFormat.qbs
new file mode 100644
index 000000000..36c9fea7c
--- /dev/null
+++ b/src/lib/corelib/language/testdata/erroneous/wrongQbsVersionFormat.qbs
@@ -0,0 +1,5 @@
+import qbs
+
+Project {
+ minimumQbsVersion: "hfyh1234wat?"
+}
diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp
index 48252a5b4..e5fde813e 100644
--- a/src/lib/corelib/language/tst_language.cpp
+++ b/src/lib/corelib/language/tst_language.cpp
@@ -375,6 +375,11 @@ void TestLanguage::erroneousFiles_data()
<< "Duplicate source file '.*duplicate_sources_wildcards.qbs' "
"at .*duplicate_sources_wildcards.qbs:4:12 "
"and .*duplicate_sources_wildcards.qbs:6:16.";
+ QTest::newRow("oldQbsVersion")
+ << "The project requires at least qbs version \\d+\\.\\d+.\\d+ "
+ "but this is qbs version " QBS_VERSION ".";
+ QTest::newRow("wrongQbsVersionFormat")
+ << "The value of Project.minimumQbsVersion is not a valid version string.";
}
void TestLanguage::erroneousFiles()