aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/plugins/bazaar/bazaarplugin.cpp3
-rw-r--r--src/plugins/clearcase/clearcaseplugin.cpp2
-rw-r--r--src/plugins/coreplugin/vcsmanager.cpp47
-rw-r--r--src/plugins/coreplugin/vcsmanager.h12
-rw-r--r--src/plugins/cvs/cvsplugin.cpp2
-rw-r--r--src/plugins/git/gitplugin.cpp4
-rw-r--r--src/plugins/mercurial/mercurialplugin.cpp7
-rw-r--r--src/plugins/perforce/perforceplugin.cpp2
-rw-r--r--src/plugins/subversion/subversionplugin.cpp2
-rw-r--r--src/plugins/vcsbase/vcsbaseplugin.cpp5
-rw-r--r--src/plugins/vcsbase/vcsbaseplugin.h13
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;
};