diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2024-03-18 19:36:43 +0100 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2024-03-18 21:56:08 +0000 |
commit | d5e8f70192494859b36b5539ab063e2cc0fdd896 (patch) | |
tree | 99f8fa28998e52b06e1437155d4b7f5a08123b11 | |
parent | 62832ea9589504208824a81c723e485ec4893ce5 (diff) |
VcsBaseClientImpl: Don't leak VcsCommand instances
The running VcsCommand may leak on shutdown. Make them always
a child of a guard object.
Change-Id: Ie2d07d15cd13f1c08636bb1e9c5face09c6a782d
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
-rw-r--r-- | src/plugins/bazaar/bazaarplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/cvs/cvsplugin.cpp | 3 | ||||
-rw-r--r-- | src/plugins/fossil/fossilplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/git/gitplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/mercurial/mercurialplugin.cpp | 5 | ||||
-rw-r--r-- | src/plugins/subversion/subversionplugin.cpp | 5 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbaseclient.cpp | 12 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcsbaseclient.h | 3 | ||||
-rw-r--r-- | src/plugins/vcsbase/vcscommand.h | 1 |
9 files changed, 23 insertions, 12 deletions
diff --git a/src/plugins/bazaar/bazaarplugin.cpp b/src/plugins/bazaar/bazaarplugin.cpp index 9a75fbf3b3..590cfd2327 100644 --- a/src/plugins/bazaar/bazaarplugin.cpp +++ b/src/plugins/bazaar/bazaarplugin.cpp @@ -953,7 +953,7 @@ VcsCommand *BazaarPluginPrivate::createInitialCheckoutCommand(const QString &url Environment env = m_client.processEnvironment(baseDirectory); env.set("BZR_PROGRESS_BAR", "text"); - auto command = VcsBaseClient::createVcsCommand(baseDirectory, env); + auto command = VcsBaseClient::createVcsCommand(this, baseDirectory, env); command->addJob({m_client.vcsBinary(baseDirectory), args}, -1); return command; } diff --git a/src/plugins/cvs/cvsplugin.cpp b/src/plugins/cvs/cvsplugin.cpp index 2688def71e..01c47b1646 100644 --- a/src/plugins/cvs/cvsplugin.cpp +++ b/src/plugins/cvs/cvsplugin.cpp @@ -410,7 +410,8 @@ VcsCommand *CvsPluginPrivate::createInitialCheckoutCommand(const QString &url, QStringList args; args << QLatin1String("checkout") << url << extraArgs; - auto command = VcsBaseClient::createVcsCommand(baseDirectory, Environment::systemEnvironment()); + auto command = VcsBaseClient::createVcsCommand(this, baseDirectory, + Environment::systemEnvironment()); command->setDisplayName(Tr::tr("CVS Checkout")); command->addJob({settings().binaryPath(), settings().addOptions(args)}, -1); return command; diff --git a/src/plugins/fossil/fossilplugin.cpp b/src/plugins/fossil/fossilplugin.cpp index c4ea13b446..ff6fa0fa3f 100644 --- a/src/plugins/fossil/fossilplugin.cpp +++ b/src/plugins/fossil/fossilplugin.cpp @@ -927,7 +927,7 @@ VcsCommand *FossilPluginPrivate::createInitialCheckoutCommand(const QString &sou checkoutPath.createDir(); // Setup the wizard page command job - auto command = VcsBaseClient::createVcsCommand(checkoutPath, + auto command = VcsBaseClient::createVcsCommand(this, checkoutPath, fossilClient().processEnvironment(checkoutPath)); if (!isLocalRepository diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 966abc40b8..af5b267101 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -1769,7 +1769,7 @@ VcsCommand *GitPluginPrivate::createInitialCheckoutCommand(const QString &url, QStringList args = {"clone", "--progress"}; args << extraArgs << url << localName; - auto command = VcsBaseClient::createVcsCommand(baseDirectory, + auto command = VcsBaseClient::createVcsCommand(this, baseDirectory, gitClient().processEnvironment(baseDirectory)); command->addFlags(RunFlags::SuppressStdErr); command->addJob({gitClient().vcsBinary(baseDirectory), args}, -1); diff --git a/src/plugins/mercurial/mercurialplugin.cpp b/src/plugins/mercurial/mercurialplugin.cpp index a9ab891c02..f87d181da4 100644 --- a/src/plugins/mercurial/mercurialplugin.cpp +++ b/src/plugins/mercurial/mercurialplugin.cpp @@ -736,9 +736,8 @@ VcsCommand *MercurialPluginPrivate::createInitialCheckoutCommand(const QString & { QStringList args; args << QLatin1String("clone") << extraArgs << url << localName; - auto command = VcsBaseClient::createVcsCommand(baseDirectory, - mercurialClient().processEnvironment( - baseDirectory)); + auto command = VcsBaseClient::createVcsCommand(this, baseDirectory, + mercurialClient().processEnvironment(baseDirectory)); command->addJob({settings().binaryPath(), args}, -1); return command; } diff --git a/src/plugins/subversion/subversionplugin.cpp b/src/plugins/subversion/subversionplugin.cpp index 64f32a11ff..b28224a866 100644 --- a/src/plugins/subversion/subversionplugin.cpp +++ b/src/plugins/subversion/subversionplugin.cpp @@ -1135,9 +1135,8 @@ VcsCommand *SubversionPluginPrivate::createInitialCheckoutCommand(const QString args << SubversionClient::AddAuthOptions(); args << Subversion::Constants::NON_INTERACTIVE_OPTION << extraArgs << url << localName; - auto command = VcsBaseClient::createVcsCommand(baseDirectory, - subversionClient().processEnvironment( - baseDirectory)); + auto command = VcsBaseClient::createVcsCommand(this, baseDirectory, + subversionClient().processEnvironment(baseDirectory)); command->addJob(args, -1); return command; } diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 81a816c009..cd937ea345 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -6,7 +6,6 @@ #include "vcsbaseclientsettings.h" #include "vcsbaseeditor.h" #include "vcsbaseeditorconfig.h" -#include "vcsbaseplugin.h" #include "vcsbasetr.h" #include "vcscommand.h" #include "vcsoutputwindow.h" @@ -72,7 +71,8 @@ FilePath VcsBaseClientImpl::vcsBinary(const Utils::FilePath &forDirectory) const VcsCommand *VcsBaseClientImpl::createCommand(const FilePath &workingDirectory, VcsBaseEditorWidget *editor) const { - auto cmd = createVcsCommand(workingDirectory, processEnvironment(workingDirectory)); + auto cmd = createVcsCommand(const_cast<VcsBaseClientImpl *>(this), + workingDirectory, processEnvironment(workingDirectory)); if (editor) { editor->setCommand(cmd); connect(cmd, &VcsCommand::done, editor, [editor, cmd] { @@ -214,6 +214,14 @@ VcsCommand *VcsBaseClientImpl::createVcsCommand(const FilePath &defaultWorkingDi return new VcsCommand(defaultWorkingDir, environment); } +VcsCommand *VcsBaseClientImpl::createVcsCommand(QObject *parent, const FilePath &defaultWorkingDir, + const Environment &environment) +{ + auto command = new VcsCommand(defaultWorkingDir, environment); + command->setParent(parent); + return command; +} + VcsBaseEditorWidget *VcsBaseClientImpl::createVcsEditor(Id kind, QString title, const FilePath &source, QTextCodec *codec, const char *registerDynamicProperty, diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index 99b818b59b..6c07f74486 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -44,8 +44,11 @@ public: virtual Utils::FilePath vcsBinary(const Utils::FilePath &forDirectory) const; int vcsTimeoutS() const; + // TODO: For master: remove this overload. static VcsCommand *createVcsCommand(const Utils::FilePath &defaultWorkingDir, const Utils::Environment &environment); + static VcsCommand *createVcsCommand(QObject *parent, const Utils::FilePath &defaultWorkingDir, + const Utils::Environment &environment); VcsBaseEditorWidget *createVcsEditor(Utils::Id kind, QString title, const Utils::FilePath &source, QTextCodec *codec, diff --git a/src/plugins/vcsbase/vcscommand.h b/src/plugins/vcsbase/vcscommand.h index 6271139544..0556f25511 100644 --- a/src/plugins/vcsbase/vcscommand.h +++ b/src/plugins/vcsbase/vcscommand.h @@ -65,6 +65,7 @@ class VCSBASE_EXPORT VcsCommand final : public QObject Q_OBJECT public: + // TODO: For master, make c'tor private and make it a friend to VcsBaseClientImpl. VcsCommand(const Utils::FilePath &workingDirectory, const Utils::Environment &environment); ~VcsCommand() override; |