diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2017-06-15 13:37:33 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2017-07-10 08:44:47 +0000 |
commit | 19c9194b117bf4d5a4d5ef19e6f9d84d92c67620 (patch) | |
tree | 4e1f80e3b1aeeb78db3848b76151ed6d080c6edc /src/plugins | |
parent | 9a4394fa2d280b5e44636e18db77440b37d7b5c4 (diff) | |
download | qt-creator-19c9194b117bf4d5a4d5ef19e6f9d84d92c67620.tar.gz |
VcsManager: Register IVersionControls with VcsManager
Get some more objects out of the pool.
Change-Id: Id93021b712307c4777dc39b9d15aa18a46318885
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/bazaar/bazaarplugin.cpp | 3 | ||||
-rw-r--r-- | src/plugins/clearcase/clearcaseplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/coreplugin/vcsmanager.cpp | 47 | ||||
-rw-r--r-- | src/plugins/coreplugin/vcsmanager.h | 12 | ||||
-rw-r--r-- | src/plugins/cvs/cvsplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/git/gitplugin.cpp | 4 | ||||
-rw-r--r-- | src/plugins/mercurial/mercurialplugin.cpp | 7 | ||||
-rw-r--r-- | src/plugins/perforce/perforceplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/subversion/subversionplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbaseplugin.cpp | 5 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbaseplugin.h | 13 |
11 files changed, 50 insertions, 49 deletions
diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp index 49b0d9f4af..a441b5e78f 100644 --- a/src/plugins/bazaar/bazaarplugin.cpp +++ b/src/plugins/bazaar/bazaarplugin.cpp @@ -154,8 +154,7 @@ bool BazaarPlugin::initialize(const QStringList &arguments, QString *errorMessag Context context(Constants::BAZAAR_CONTEXT); m_client = new BazaarClient; - auto vcsCtrl = new BazaarControl(m_client); - initializeVcs(vcsCtrl, context); + auto vcsCtrl = initializeVcs<BazaarControl>(context, m_client); connect(m_client, &VcsBaseClient::changed, vcsCtrl, &BazaarControl::changed); addAutoReleasedObject(new OptionsPage(vcsCtrl)); diff --git a/src/plugins/clearcase/clearcaseplugin.cpp b/src/plugins/clearcase/clearcaseplugin.cpp index a1f4d3f5ca..8f215be159 100644 --- a/src/plugins/clearcase/clearcaseplugin.cpp +++ b/src/plugins/clearcase/clearcaseplugin.cpp @@ -410,7 +410,7 @@ bool ClearCasePlugin::initialize(const QStringList & /*arguments */, QString *er Context context(CLEARCASE_CONTEXT); - initializeVcs(new ClearCaseControl(this), context); + initializeVcs<ClearCaseControl>(context, this); m_clearcasePluginInstance = this; connect(ICore::instance(), &ICore::coreAboutToClose, this, &ClearCasePlugin::closing); diff --git a/src/plugins/coreplugin/vcsmanager.cpp b/src/plugins/coreplugin/vcsmanager.cpp index dbe5b8fd8f..e83f110ea5 100644 --- a/src/plugins/coreplugin/vcsmanager.cpp +++ b/src/plugins/coreplugin/vcsmanager.cpp @@ -50,8 +50,6 @@ namespace Core { -typedef QList<IVersionControl *> VersionControlList; - #if defined(WITH_TESTS) const char TEST_PREFIX[] = "/8E3A9BA0-0B97-40DF-AEC1-2BDF9FC9EDBE/"; #endif @@ -158,6 +156,12 @@ VcsManager::~VcsManager() delete d; } +void VcsManager::addVersionControl(IVersionControl *vc) +{ + QTC_ASSERT(!d->m_versionControlList.contains(vc), return); + d->m_versionControlList.append(vc); +} + VcsManager *VcsManager::instance() { return m_instance; @@ -176,9 +180,9 @@ void VcsManager::extensionsInitialized() } } -QList<IVersionControl *> VcsManager::versionControls() +const QList<IVersionControl *> VcsManager::versionControls() { - return ExtensionSystem::PluginManager::getObjects<IVersionControl>(); + return d->m_versionControlList; } IVersionControl *VcsManager::versionControl(Id id) @@ -460,31 +464,6 @@ const char ID_VCS_B[] = "B"; typedef QHash<QString, QString> FileHash; -template<class T> -class ObjectPoolGuard -{ -public: - ObjectPoolGuard(T *watch) : m_watched(watch) - { - ExtensionSystem::PluginManager::addObject(watch); - } - - explicit operator bool() { return m_watched; } - bool operator !() { return !m_watched; } - T &operator*() { return *m_watched; } - T *operator->() { return m_watched; } - T *value() { return m_watched; } - - ~ObjectPoolGuard() - { - ExtensionSystem::PluginManager::removeObject(m_watched); - delete m_watched; - } - -private: - T *m_watched; -}; - static FileHash makeHash(const QStringList &list) { FileHash result; @@ -559,8 +538,11 @@ void CorePlugin::testVcsManager_data() void CorePlugin::testVcsManager() { // setup: - ObjectPoolGuard<TestVersionControl> vcsA(new TestVersionControl(ID_VCS_A, QLatin1String("A"))); - ObjectPoolGuard<TestVersionControl> vcsB(new TestVersionControl(ID_VCS_B, QLatin1String("B"))); + QList<IVersionControl *> orig = Core::d->m_versionControlList; + TestVersionControl *vcsA(new TestVersionControl(ID_VCS_A, QLatin1String("A"))); + TestVersionControl *vcsB(new TestVersionControl(ID_VCS_B, QLatin1String("B"))); + + Core::d->m_versionControlList = {vcsA, vcsB}; // test: QFETCH(QStringList, dirsVcsA); @@ -604,7 +586,8 @@ void CorePlugin::testVcsManager() } // teardown: - // handled by guards + qDeleteAll(Core::d->m_versionControlList); + Core::d->m_versionControlList = orig; } } // namespace Internal diff --git a/src/plugins/coreplugin/vcsmanager.h b/src/plugins/coreplugin/vcsmanager.h index e830f23508..147d7a4aee 100644 --- a/src/plugins/coreplugin/vcsmanager.h +++ b/src/plugins/coreplugin/vcsmanager.h @@ -56,9 +56,17 @@ class CORE_EXPORT VcsManager : public QObject public: static VcsManager *instance(); + template <typename T, typename... Args> + static T *registerVersionControl(Args&&... args) + { + T *vc = new T(std::forward<Args>(args)...); + addVersionControl(vc); + return vc; + } + static void extensionsInitialized(); - static QList<IVersionControl *> versionControls(); + static const QList<IVersionControl *> versionControls(); static IVersionControl *versionControl(Id id); static void resetVersionControlForDirectory(const QString &inputDirectory); @@ -102,6 +110,8 @@ private: explicit VcsManager(QObject *parent = 0); ~VcsManager(); + static void addVersionControl(IVersionControl *vc); + void handleConfigurationChanges(); friend class Core::Internal::MainWindow; diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 9360051f2b..16a0fa211d 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -198,7 +198,7 @@ bool CvsPlugin::initialize(const QStringList &arguments, QString *errorMessage) Context context(CVS_CONTEXT); - initializeVcs(new CvsControl(this), context); + initializeVcs<CvsControl>(context, this); m_cvsPluginInstance = this; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 1fa2bcb37c..df286c0fee 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -296,10 +296,10 @@ bool GitPlugin::initialize(const QStringList &arguments, QString *errorMessage) m_gitClient = new GitClient; - initializeVcs(new GitVersionControl(m_gitClient), context); + auto vc = initializeVcs<GitVersionControl>(context, m_gitClient); // Create the settings Page - auto settingsPage = new SettingsPage(versionControl()); + auto settingsPage = new SettingsPage(vc); addAutoReleasedObject(settingsPage); connect(settingsPage, &SettingsPage::settingsChanged, this, &GitPlugin::updateRepositoryBrowserAction); diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp index 8254f91d67..e982b51cdf 100644 --- a/src/plugins/mercurial/mercurialplugin.cpp +++ b/src/plugins/mercurial/mercurialplugin.cpp @@ -122,12 +122,11 @@ bool MercurialPlugin::initialize(const QStringList & /* arguments */, QString * Core::Context context(Constants::MERCURIAL_CONTEXT); m_client = new MercurialClient; - initializeVcs(new MercurialControl(m_client), context); + auto vc = initializeVcs<MercurialControl>(context, m_client); - addAutoReleasedObject(new OptionsPage(versionControl())); + addAutoReleasedObject(new OptionsPage(vc)); - connect(m_client, &VcsBaseClient::changed, - static_cast<MercurialControl *>(versionControl()), &MercurialControl::changed); + connect(m_client, &VcsBaseClient::changed, vc, &MercurialControl::changed); connect(m_client, &MercurialClient::needUpdate, this, &MercurialPlugin::update); const auto describeFunc = [this](const QString &source, const QString &id) { diff --git a/src/plugins/perforce/perforceplugin.cpp b/src/plugins/perforce/perforceplugin.cpp index ba5ed219c7..c4a1e50ac4 100644 --- a/src/plugins/perforce/perforceplugin.cpp +++ b/src/plugins/perforce/perforceplugin.cpp @@ -183,7 +183,7 @@ bool PerforcePlugin::initialize(const QStringList & /* arguments */, QString *er Q_UNUSED(errorMessage) Context context(PERFORCE_CONTEXT); - initializeVcs(new PerforceVersionControl(this), context); + initializeVcs<PerforceVersionControl>(context, this); m_instance = this; diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index aaf43d9195..c72dbf703d 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -210,7 +210,7 @@ bool SubversionPlugin::initialize(const QStringList & /*arguments */, QString *e Context context(SUBVERSION_CONTEXT); - initializeVcs(new SubversionControl(this), context); + initializeVcs<SubversionControl>(context, this); m_subversionPluginInstance = this; diff --git a/src/plugins/vcsbase/vcsbaseplugin.cpp b/src/plugins/vcsbase/vcsbaseplugin.cpp index 0a62647a05..edc68b2a0c 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.cpp +++ b/src/plugins/vcsbase/vcsbaseplugin.cpp @@ -34,9 +34,7 @@ #include <coreplugin/icore.h> #include <coreplugin/id.h> #include <coreplugin/idocument.h> -#include <coreplugin/iversioncontrol.h> #include <coreplugin/editormanager/editormanager.h> -#include <coreplugin/vcsmanager.h> #include <projectexplorer/projecttree.h> #include <projectexplorer/project.h> #include <projectexplorer/session.h> @@ -552,9 +550,10 @@ VcsBasePlugin::~VcsBasePlugin() void VcsBasePlugin::initializeVcs(IVersionControl *vc, const Context &context) { + QTC_ASSERT(vc, return); + d->m_versionControl = vc; d->m_context = context; - addAutoReleasedObject(vc); Internal::VcsPlugin *plugin = Internal::VcsPlugin::instance(); connect(plugin, &Internal::VcsPlugin::submitEditorAboutToClose, diff --git a/src/plugins/vcsbase/vcsbaseplugin.h b/src/plugins/vcsbase/vcsbaseplugin.h index dc719111b2..0312d63724 100644 --- a/src/plugins/vcsbase/vcsbaseplugin.h +++ b/src/plugins/vcsbase/vcsbaseplugin.h @@ -27,6 +27,8 @@ #include "vcsbase_global.h" +#include <coreplugin/iversioncontrol.h> +#include <coreplugin/vcsmanager.h> #include <extensionsystem/iplugin.h> #include <QList> @@ -128,7 +130,14 @@ class VCSBASE_EXPORT VcsBasePlugin : public ExtensionSystem::IPlugin protected: explicit VcsBasePlugin(); - void initializeVcs(Core::IVersionControl *vc, const Core::Context &context); + template<class T, typename... Args> + T *initializeVcs(const Core::Context &context, Args&&... args) + { + T *vc = Core::VcsManager::registerVersionControl<T>(std::forward<Args>(args)...); + initializeVcs(vc, context); + return vc; + } + void extensionsInitialized() override; public: @@ -204,6 +213,8 @@ private: void slotSubmitEditorAboutToClose(VcsBaseSubmitEditor *submitEditor, bool *result); void slotStateChanged(const VcsBase::Internal::State &s, Core::IVersionControl *vc); + void initializeVcs(Core::IVersionControl *vc, const Core::Context &context); + VcsBasePluginPrivate *d; }; |