aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2024-03-18 19:36:43 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2024-03-18 21:56:08 +0000
commitd5e8f70192494859b36b5539ab063e2cc0fdd896 (patch)
tree99f8fa28998e52b06e1437155d4b7f5a08123b11
parent62832ea9589504208824a81c723e485ec4893ce5 (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.cpp2
-rw-r--r--src/plugins/cvs/cvsplugin.cpp3
-rw-r--r--src/plugins/fossil/fossilplugin.cpp2
-rw-r--r--src/plugins/git/gitplugin.cpp2
-rw-r--r--src/plugins/mercurial/mercurialplugin.cpp5
-rw-r--r--src/plugins/subversion/subversionplugin.cpp5
-rw-r--r--src/plugins/vcsbase/vcsbaseclient.cpp12
-rw-r--r--src/plugins/vcsbase/vcsbaseclient.h3
-rw-r--r--src/plugins/vcsbase/vcscommand.h1
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;