From d2243c9765b2c7d917ab2d078e412d72f53bd959 Mon Sep 17 00:00:00 2001 From: Daniel Teske <daniel.teske@nokia.com> Date: Mon, 17 Oct 2011 14:18:40 +0200 Subject: [PATCH] Add a maximum Qt Version to the wizards All existing wizards derived from AbstractMobileWizard do not support qt 5. So they won't offer them, nor default to them. Task-number: QTCREATORBUG-6321 Change-Id: I999e2565cec5b0d7da04c10e38ac2cb101352e5b Reviewed-by: Alessandro Portale <alessandro.portale@nokia.com> --- .../qt-desktop/qt4desktoptargetfactory.cpp | 11 +++++++---- .../qt-desktop/qt4desktoptargetfactory.h | 5 ++++- .../qt-s60/qt4symbiantargetfactory.cpp | 7 +++++-- .../qt-s60/qt4symbiantargetfactory.h | 4 +++- .../qt4projectmanager/qt4basetargetfactory.h | 5 ++++- src/plugins/qt4projectmanager/qt4target.cpp | 18 ++++++++++++------ src/plugins/qt4projectmanager/qt4target.h | 2 ++ .../wizards/abstractmobileappwizard.cpp | 5 ++++- .../wizards/abstractmobileappwizard.h | 2 +- .../wizards/html5appwizard.cpp | 3 ++- .../wizards/mobileappwizard.cpp | 2 +- .../wizards/qtquickappwizard.cpp | 2 +- .../wizards/targetsetuppage.cpp | 12 ++++++++++-- .../wizards/targetsetuppage.h | 4 ++++ src/plugins/qtsupport/qtversionmanager.cpp | 7 +++++-- src/plugins/qtsupport/qtversionmanager.h | 4 +++- 16 files changed, 68 insertions(+), 25 deletions(-) diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp index aedab9d6458..8f09417a7fa 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.cpp @@ -125,15 +125,18 @@ ProjectExplorer::Target *Qt4DesktopTargetFactory::restore(ProjectExplorer::Proj return 0; } -Qt4TargetSetupWidget *Qt4DesktopTargetFactory::createTargetSetupWidget(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &number, bool importEnabled, QList<BuildConfigurationInfo> importInfos) +Qt4TargetSetupWidget *Qt4DesktopTargetFactory::createTargetSetupWidget(const QString &id, const QString &proFilePath, + const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion, + bool importEnabled, QList<BuildConfigurationInfo> importInfos) { - QList<BuildConfigurationInfo> infos = this->availableBuildConfigurations(id, proFilePath, number); + QList<BuildConfigurationInfo> infos = this->availableBuildConfigurations(id, proFilePath, minimumQtVersion, maximumQtVersion); if (infos.isEmpty()) return 0; Qt4DefaultTargetSetupWidget *widget = new Qt4DefaultTargetSetupWidget(this, id, proFilePath, infos, - number, importEnabled, - importInfos, + minimumQtVersion, maximumQtVersion, + importEnabled, importInfos, Qt4DefaultTargetSetupWidget::USER); widget->setBuildConfiguraionComboBoxVisible(true); return widget; diff --git a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h index 55e784c3e0e..42d5d88c95a 100644 --- a/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h +++ b/src/plugins/qt4projectmanager/qt-desktop/qt4desktoptargetfactory.h @@ -54,7 +54,10 @@ public: virtual bool supportsTargetId(const QString &id) const; - Qt4TargetSetupWidget *createTargetSetupWidget(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &minimumQtVersion, bool importEnabled, QList<BuildConfigurationInfo> importInfos); + Qt4TargetSetupWidget *createTargetSetupWidget(const QString &id, const QString &proFilePath, + const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion, + bool importEnabled, QList<BuildConfigurationInfo> importInfos); QString buildNameForId(const QString &id) const; QSet<QString> targetFeatures(const QString &id) const; ProjectExplorer::Target *create(ProjectExplorer::Project *parent, const QString &id); diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp index 262adefa8dd..74ba7764b60 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.cpp @@ -164,9 +164,12 @@ QList<ProjectExplorer::Task> Qt4SymbianTargetFactory::reportIssues(const QString return results; } -QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &minimumQtVersion) +QList<BuildConfigurationInfo> Qt4SymbianTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, + const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion) { - QList<BuildConfigurationInfo> infos = Qt4BaseTargetFactory::availableBuildConfigurations(id, proFilePath, minimumQtVersion); + QList<BuildConfigurationInfo> infos + = Qt4BaseTargetFactory::availableBuildConfigurations(id, proFilePath, minimumQtVersion, maximumQtVersion); if (id != Constants::S60_EMULATOR_TARGET_ID) return infos; // For emulator filter out all non debug builds diff --git a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h index 2f5723bfc86..4afa6790a7f 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h +++ b/src/plugins/qt4projectmanager/qt-s60/qt4symbiantargetfactory.h @@ -59,7 +59,9 @@ public: QString shadowBuildDirectory(const QString &profilePath, const QString &id, const QString &suffix); QList<ProjectExplorer::Task> reportIssues(const QString &proFile); - QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &minimumQtVersion); + QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, + const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion); bool selectByDefault(const QString &id) const; QSet<QString> targetFeatures(const QString &id) const; diff --git a/src/plugins/qt4projectmanager/qt4basetargetfactory.h b/src/plugins/qt4projectmanager/qt4basetargetfactory.h index 633613854bb..af258569ba9 100644 --- a/src/plugins/qt4projectmanager/qt4basetargetfactory.h +++ b/src/plugins/qt4projectmanager/qt4basetargetfactory.h @@ -58,6 +58,7 @@ public: virtual Qt4TargetSetupWidget *createTargetSetupWidget(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion, bool importEnabled, QList<BuildConfigurationInfo> importInfos); @@ -69,7 +70,9 @@ public: /// used by the default implementation of createTargetSetupWidget /// not needed otherwise /// by default creates one debug + one release buildconfiguration per qtversion - virtual QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &minimumQtVersion); + virtual QList<BuildConfigurationInfo> availableBuildConfigurations(const QString &id, const QString &proFilePath, + const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion); virtual QList<ProjectExplorer::Task> reportIssues(const QString &proFile); /// only used in the TargetSetupPage diff --git a/src/plugins/qt4projectmanager/qt4target.cpp b/src/plugins/qt4projectmanager/qt4target.cpp index 014887462de..dcc9246ac80 100644 --- a/src/plugins/qt4projectmanager/qt4target.cpp +++ b/src/plugins/qt4projectmanager/qt4target.cpp @@ -90,17 +90,18 @@ Qt4BaseTargetFactory::~Qt4BaseTargetFactory() Qt4TargetSetupWidget *Qt4BaseTargetFactory::createTargetSetupWidget(const QString &id, const QString &proFilePath, - const QtSupport::QtVersionNumber &number, + const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion, bool importEnabled, QList<BuildConfigurationInfo> importInfos) { - QList<BuildConfigurationInfo> infos = this->availableBuildConfigurations(id, proFilePath, number); + QList<BuildConfigurationInfo> infos = this->availableBuildConfigurations(id, proFilePath, minimumQtVersion, maximumQtVersion); if (infos.isEmpty()) return 0; const bool supportsShadowBuilds = targetFeatures(id).contains(Constants::SHADOWBUILD_TARGETFEATURE_ID); Qt4DefaultTargetSetupWidget *widget - = new Qt4DefaultTargetSetupWidget(this, id, proFilePath, infos, number, + = new Qt4DefaultTargetSetupWidget(this, id, proFilePath, infos, minimumQtVersion, maximumQtVersion, importEnabled && supportsShadowBuilds, importInfos, (supportsShadowBuilds ? Qt4DefaultTargetSetupWidget::ENABLE @@ -118,10 +119,13 @@ ProjectExplorer::Target *Qt4BaseTargetFactory::create(ProjectExplorer::Project * return create(parent, id, w->buildConfigurationInfos()); } -QList<BuildConfigurationInfo> Qt4BaseTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, const QtSupport::QtVersionNumber &minimumQtVersion) +QList<BuildConfigurationInfo> Qt4BaseTargetFactory::availableBuildConfigurations(const QString &id, const QString &proFilePath, + const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion) { QList<BuildConfigurationInfo> infoList; - QList<QtSupport::BaseQtVersion *> knownVersions = QtSupport::QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion); + QList<QtSupport::BaseQtVersion *> knownVersions + = QtSupport::QtVersionManager::instance()->versionsForTargetId(id, minimumQtVersion, maximumQtVersion); foreach (QtSupport::BaseQtVersion *version, knownVersions) { if (!version->isValid() || !version->toolChainAvailable(id)) @@ -422,6 +426,7 @@ Qt4DefaultTargetSetupWidget::Qt4DefaultTargetSetupWidget(Qt4BaseTargetFactory *f const QString &proFilePath, const QList<BuildConfigurationInfo> &infos, const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion, bool importEnabled, const QList<BuildConfigurationInfo> &importInfos, ShadowBuildOption shadowBuild) @@ -430,6 +435,7 @@ Qt4DefaultTargetSetupWidget::Qt4DefaultTargetSetupWidget(Qt4BaseTargetFactory *f m_factory(factory), m_proFilePath(proFilePath), m_minimumQtVersion(minimumQtVersion), + m_maximumQtVersion(maximumQtVersion), m_importInfos(importInfos), m_directoriesEnabled(true), m_hasInSourceBuild(false), @@ -652,7 +658,7 @@ void Qt4DefaultTargetSetupWidget::setProFilePath(const QString &proFilePath) { m_proFilePath = proFilePath; m_detailsWidget->setAdditionalSummaryText(issuesListToString(m_factory->reportIssues(m_proFilePath))); - setBuildConfigurationInfos(m_factory->availableBuildConfigurations(m_id, proFilePath, m_minimumQtVersion), false); + setBuildConfigurationInfos(m_factory->availableBuildConfigurations(m_id, proFilePath, m_minimumQtVersion, m_maximumQtVersion), false); } void Qt4DefaultTargetSetupWidget::setBuildConfiguraionComboBoxVisible(bool b) diff --git a/src/plugins/qt4projectmanager/qt4target.h b/src/plugins/qt4projectmanager/qt4target.h index f9325e2230a..f3053fbc472 100644 --- a/src/plugins/qt4projectmanager/qt4target.h +++ b/src/plugins/qt4projectmanager/qt4target.h @@ -116,6 +116,7 @@ public: const QString &proFilePath, const QList<BuildConfigurationInfo> &info, const QtSupport::QtVersionNumber &minimumQtVersion, + const QtSupport::QtVersionNumber &maximumQtVersion, bool importEnabled, const QList<BuildConfigurationInfo> &importInfos, ShadowBuildOption shadowBuild); @@ -158,6 +159,7 @@ private: Qt4BaseTargetFactory *m_factory; QString m_proFilePath; QtSupport::QtVersionNumber m_minimumQtVersion; + QtSupport::QtVersionNumber m_maximumQtVersion; Utils::DetailsWidget *m_detailsWidget; QGridLayout *m_importLayout; QGridLayout *m_newBuildsLayout; diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp index b1c6f121875..3e2913a9116 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.cpp @@ -49,7 +49,9 @@ namespace Qt4ProjectManager { -AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, const QtSupport::QtVersionNumber &minimumQtVersionNumber) +AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, + const QtSupport::QtVersionNumber &minimumQtVersionNumber, + const QtSupport::QtVersionNumber &maximumQtVersionNumber) : ProjectExplorer::BaseProjectWizardDialog(parent) , m_genericOptionsPageId(-1) , m_symbianOptionsPageId(-1) @@ -66,6 +68,7 @@ AbstractMobileAppWizardDialog::AbstractMobileAppWizardDialog(QWidget *parent, co m_targetsPage = new TargetSetupPage; m_targetsPage->setPreferredFeatures(QSet<QString>() << Constants::MOBILE_TARGETFEATURE_ID); m_targetsPage->setMinimumQtVersion(minimumQtVersionNumber); + m_targetsPage->setMaximumQtVersion(maximumQtVersionNumber); resize(900, 450); m_genericOptionsPage = new Internal::MobileAppWizardGenericOptionsPage; diff --git a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h index f4aff8058dd..2439cf39507 100644 --- a/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h +++ b/src/plugins/qt4projectmanager/wizards/abstractmobileappwizard.h @@ -57,7 +57,7 @@ class QT4PROJECTMANAGER_EXPORT AbstractMobileAppWizardDialog : public ProjectExp Q_OBJECT protected: - explicit AbstractMobileAppWizardDialog(QWidget *parent, const QtSupport::QtVersionNumber &minimumQtVersionNumber); + explicit AbstractMobileAppWizardDialog(QWidget *parent, const QtSupport::QtVersionNumber &minimumQtVersionNumber, const QtSupport::QtVersionNumber &maximumQtVersionNumber); void addMobilePages(); public: diff --git a/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp b/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp index 178dc934c1a..1b1100f40f2 100644 --- a/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/html5appwizard.cpp @@ -38,6 +38,7 @@ #include "targetsetuppage.h" #include "qt4projectmanagerconstants.h" +#include <limits> #include <QtCore/QCoreApplication> #include <QtGui/QIcon> @@ -58,7 +59,7 @@ private: }; Html5AppWizardDialog::Html5AppWizardDialog(QWidget *parent) - : AbstractMobileAppWizardDialog(parent, QtSupport::QtVersionNumber()) + : AbstractMobileAppWizardDialog(parent, QtSupport::QtVersionNumber(), QtSupport::QtVersionNumber(4, INT_MAX, INT_MAX)) , m_htmlOptionsPage(0) { setWindowTitle(tr("New HTML5 Application")); diff --git a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp index 533ba09e38a..78081df8a8e 100644 --- a/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/mobileappwizard.cpp @@ -60,7 +60,7 @@ class MobileAppWizardDialog : public AbstractMobileAppWizardDialog Q_OBJECT public: explicit MobileAppWizardDialog(QWidget *parent = 0) - : AbstractMobileAppWizardDialog(parent, QtSupport::QtVersionNumber()) + : AbstractMobileAppWizardDialog(parent, QtSupport::QtVersionNumber(), QtSupport::QtVersionNumber(4, INT_MAX, INT_MAX)) { setWindowTitle(DisplayName); setIntroDescription(Description); diff --git a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp index 8a7cc425394..86d98ebe56f 100644 --- a/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp +++ b/src/plugins/qt4projectmanager/wizards/qtquickappwizard.cpp @@ -66,7 +66,7 @@ private: }; QtQuickAppWizardDialog::QtQuickAppWizardDialog(QWidget *parent) - : AbstractMobileAppWizardDialog(parent, QtSupport::QtVersionNumber(4, 7, 0)) + : AbstractMobileAppWizardDialog(parent, QtSupport::QtVersionNumber(4, 7, 0), QtSupport::QtVersionNumber(4, INT_MAX, INT_MAX)) { setWindowTitle(tr("New Qt Quick Application")); setIntroDescription(tr("This wizard generates a Qt Quick application project.")); diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp index 9c15946f284..e692aa464bd 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.cpp @@ -55,7 +55,8 @@ TargetSetupPage::TargetSetupPage(QWidget *parent) : QWizardPage(parent), m_importSearch(false), m_spacer(new QSpacerItem(0, 0, QSizePolicy::Minimum, QSizePolicy::Expanding)), - m_ui(new Internal::Ui::TargetSetupPage) + m_ui(new Internal::Ui::TargetSetupPage), + m_maximumQtVersionNumber(INT_MAX, INT_MAX, INT_MAX) { m_ui->setupUi(this); QWidget *centralWidget = new QWidget(this); @@ -112,6 +113,11 @@ void TargetSetupPage::setMinimumQtVersion(const QtSupport::QtVersionNumber &numb m_minimumQtVersionNumber = number; } +void TargetSetupPage::setMaximumQtVersion(const QtSupport::QtVersionNumber &number) +{ + m_maximumQtVersionNumber = number; +} + void TargetSetupPage::setImportSearch(bool b) { m_importSearch = b; @@ -129,7 +135,9 @@ void TargetSetupPage::setupWidgets() QList<BuildConfigurationInfo> infos = BuildConfigurationInfo::filterBuildConfigurationInfos(m_importInfos, id); Qt4TargetSetupWidget *widget = - factory->createTargetSetupWidget(id, m_proFilePath, m_minimumQtVersionNumber, m_importSearch, infos); + factory->createTargetSetupWidget(id, m_proFilePath, + m_minimumQtVersionNumber, m_maximumQtVersionNumber, + m_importSearch, infos); if (widget) { bool selectTarget = false; if (!m_importInfos.isEmpty()) { diff --git a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h index 066f796a766..197c4911a9c 100644 --- a/src/plugins/qt4projectmanager/wizards/targetsetuppage.h +++ b/src/plugins/qt4projectmanager/wizards/targetsetuppage.h @@ -81,6 +81,9 @@ public: /// Sets the minimum qt version /// calls this before \sa initializePage() void setMinimumQtVersion(const QtSupport::QtVersionNumber &number); + /// Sets the maximum qt version + /// calls this before \sa initializePage() + void setMaximumQtVersion(const QtSupport::QtVersionNumber &number); /// Sets whether the TargetSetupPage looks on disk for builds of this project /// call this before \sa initializePage() void setImportSearch(bool b); @@ -102,6 +105,7 @@ private: QSet<QString> m_requiredFeatures; bool m_importSearch; QtSupport::QtVersionNumber m_minimumQtVersionNumber; + QtSupport::QtVersionNumber m_maximumQtVersionNumber; QString m_proFilePath; QString m_defaultShadowBuildLocation; QMap<QString, Qt4TargetSetupWidget *> m_widgets; diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index e4e49124e9b..0357f1a3599 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -463,11 +463,14 @@ bool QtVersionManager::supportsTargetId(const QString &id) const return false; } -QList<BaseQtVersion *> QtVersionManager::versionsForTargetId(const QString &id, const QtVersionNumber &minimumQtVersion) const +QList<BaseQtVersion *> QtVersionManager::versionsForTargetId(const QString &id, + const QtVersionNumber &minimumQtVersion, + const QtVersionNumber &maximumQtVersion) const { QList<BaseQtVersion *> targetVersions; foreach (BaseQtVersion *version, m_versions) { - if (version->supportsTargetId(id) && version->qtVersion() >= minimumQtVersion) + if (version->supportsTargetId(id) && version->qtVersion() >= minimumQtVersion + && version->qtVersion() <= maximumQtVersion) targetVersions.append(version); } qSort(targetVersions.begin(), targetVersions.end(), &qtVersionNumberCompare); diff --git a/src/plugins/qtsupport/qtversionmanager.h b/src/plugins/qtsupport/qtversionmanager.h index c9e3c480be6..b6ae925140f 100644 --- a/src/plugins/qtsupport/qtversionmanager.h +++ b/src/plugins/qtsupport/qtversionmanager.h @@ -95,7 +95,9 @@ public: // This returns a list of versions that support the target with the given id. // @return A list of QtVersions that supports a target. This list may be empty! - QList<BaseQtVersion *> versionsForTargetId(const QString &id, const QtVersionNumber &minimumQtVersion = QtVersionNumber()) const; + QList<BaseQtVersion *> versionsForTargetId(const QString &id, + const QtVersionNumber &minimumQtVersion = QtVersionNumber(), + const QtVersionNumber &maximumQtVersion = QtVersionNumber(INT_MAX, INT_MAX, INT_MAX)) const; QSet<QString> supportedTargetIds() const; // Static Methods -- GitLab