diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-07-18 18:00:12 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-07-22 15:29:15 +0200 |
commit | 5492470c39547dfedf7763ef12dfb218f1c93c31 (patch) | |
tree | 6013ecff85b1d14e4f151b2ac6860e4839a2c90f /src/lib/corelib/language | |
parent | ccc47f723118b78e5c17967497c32f625b13e960 (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/corelib/language')
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() |