diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp index bb11ce335c2..8822b1e4d44 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.cpp +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp @@ -1,8 +1,9 @@ // Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 -#include "diffeditorconstants.h" #include "diffeditorcontroller.h" + +#include "diffeditorconstants.h" #include "diffeditordocument.h" #include @@ -12,14 +13,12 @@ #include -#include - using namespace Core; using namespace Utils; namespace DiffEditor { -DiffEditorController::DiffEditorController(Core::IDocument *document) +DiffEditorController::DiffEditorController(IDocument *document) : QObject(document) , m_document(qobject_cast(document)) , m_reloadRecipe{} @@ -62,16 +61,16 @@ QString DiffEditorController::makePatch(int fileIndex, int chunkIndex, options & AddPrefix); } -Core::IDocument *DiffEditorController::findOrCreateDocument(const QString &vcsId, - const QString &displayName) +IDocument *DiffEditorController::findOrCreateDocument(const QString &vcsId, + const QString &displayName) { QString preferredDisplayName = displayName; - Core::IEditor *editor = Core::EditorManager::openEditorWithContents( - Constants::DIFF_EDITOR_ID, &preferredDisplayName, {}, vcsId); + IEditor *editor = EditorManager::openEditorWithContents(Constants::DIFF_EDITOR_ID, + &preferredDisplayName, {}, vcsId); return editor ? editor->document() : nullptr; } -DiffEditorController *DiffEditorController::controller(Core::IDocument *document) +DiffEditorController *DiffEditorController::controller(IDocument *document) { auto doc = qobject_cast(document); return doc ? doc->controller() : nullptr; @@ -110,7 +109,7 @@ void DiffEditorController::setReloader(const std::function &reloader) m_reloader = reloader; } -Core::IDocument *DiffEditorController::document() const +IDocument *DiffEditorController::document() const { return m_document; } diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h index abca38c02b8..2efb45ead42 100644 --- a/src/plugins/diffeditor/diffeditorcontroller.h +++ b/src/plugins/diffeditor/diffeditorcontroller.h @@ -6,14 +6,16 @@ #include "diffeditor_global.h" #include "diffutils.h" -#include #include #include -QT_FORWARD_DECLARE_CLASS(QMenu) +QT_BEGIN_NAMESPACE +class QMenu; +QT_END_NAMESPACE namespace Core { class IDocument; } +namespace Utils { class FilePath; } namespace DiffEditor { diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index fe09cad124b..b4b9da46cf0 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -938,7 +938,6 @@ void GitClient::requestReload(const QString &documentId, const QString &source, GitBaseDiffEditorController *controller = factory(document); QTC_ASSERT(controller, return); controller->setVcsBinary(settings().gitExecutable()); - controller->setVcsTimeoutS(settings().timeout.value()); controller->setProcessEnvironment(processEnvironment()); controller->setWorkingDirectory(workingDirectory); diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 2b387739808..9be0fc61dfd 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -427,7 +427,6 @@ void MercurialClient::requestReload(const QString &documentId, const QString &so QTC_ASSERT(document, return); auto controller = new MercurialDiffEditorController(document, args); controller->setVcsBinary(settings().binaryPath.filePath()); - controller->setVcsTimeoutS(settings().timeout.value()); controller->setProcessEnvironment(processEnvironment()); controller->setWorkingDirectory(workingDirectory); diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index ca4a50b3465..7978f746e45 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -246,7 +246,6 @@ SubversionDiffEditorController *SubversionClient::findOrCreateDiffEditor(const Q if (!controller) { controller = new SubversionDiffEditorController(document, addAuthenticationOptions(settings)); controller->setVcsBinary(settings.binaryPath.filePath()); - controller->setVcsTimeoutS(settings.timeout.value()); controller->setProcessEnvironment(processEnvironment()); controller->setWorkingDirectory(workingDirectory); } diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp index a1bfa494a4b..27de8785692 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp @@ -2,25 +2,15 @@ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 #include "vcsbasediffeditorcontroller.h" -#include "vcsbaseclient.h" -#include "vcscommand.h" #include "vcsplugin.h" -#include -#include - #include -#include #include #include #include #include -#include - -#include using namespace DiffEditor; -using namespace Core; using namespace Utils; namespace VcsBase { @@ -38,92 +28,13 @@ class VcsBaseDiffEditorControllerPrivate { public: VcsBaseDiffEditorControllerPrivate(VcsBaseDiffEditorController *q) : q(q) {} - ~VcsBaseDiffEditorControllerPrivate(); - - void processingFinished(); - void processDiff(const QString &patch); - void cancelReload(); - void commandFinished(bool success); VcsBaseDiffEditorController *q; Environment m_processEnvironment; FilePath m_vcsBinary; - int m_vscTimeoutS; - QPointer m_command; - QFutureWatcher> *m_processWatcher = nullptr; - const Tasking::TreeStorage m_inputStorage; }; -VcsBaseDiffEditorControllerPrivate::~VcsBaseDiffEditorControllerPrivate() -{ - delete m_command; - cancelReload(); -} - -void VcsBaseDiffEditorControllerPrivate::processingFinished() -{ - QTC_ASSERT(m_processWatcher, return); - - // success is false when the user clicked the cancel micro button - // inside the progress indicator - const bool success = !m_processWatcher->future().isCanceled(); - const QList fileDataList = success - ? m_processWatcher->future().result() : QList(); - - // Prevent direct deletion of m_processWatcher since - // processingFinished() is called directly by the m_processWatcher. - m_processWatcher->deleteLater(); - m_processWatcher = nullptr; - - q->setDiffFiles(fileDataList); - q->reloadFinished(success); -} - -void VcsBaseDiffEditorControllerPrivate::processDiff(const QString &patch) -{ - cancelReload(); - - m_processWatcher = new QFutureWatcher>(); - - QObject::connect(m_processWatcher, &QFutureWatcherBase::finished, - q, [this] { processingFinished(); }); - - m_processWatcher->setFuture(Utils::runAsync(&readPatch, patch)); - - ProgressManager::addTask(m_processWatcher->future(), - VcsBaseDiffEditorController::tr("Processing diff"), "DiffEditor"); -} - -void VcsBaseDiffEditorControllerPrivate::cancelReload() -{ - m_command.clear(); - - if (m_processWatcher) { - // Cancel the running process without the further processingFinished() - // notification for this process. - m_processWatcher->future().cancel(); - delete m_processWatcher; - m_processWatcher = nullptr; - } -} - -void VcsBaseDiffEditorControllerPrivate::commandFinished(bool success) -{ - const QString output = m_command->cleanedStdOut(); - // Don't delete here, as it is called from command finished signal. - // Clear it only, as we may call runCommand() again from inside processCommandOutput overload. - m_command.clear(); - - if (!success) { - cancelReload(); - q->reloadFinished(success); - return; - } - - q->processCommandOutput(output); -} - ///////////////////// VcsBaseDiffEditorController::VcsBaseDiffEditorController(Core::IDocument *document) @@ -169,42 +80,6 @@ void VcsBaseDiffEditorController::setupCommand(QtcProcess &process, const QStrin process.setCommand({d->m_vcsBinary, args}); } -void VcsBaseDiffEditorController::runCommand(const QList &args, RunFlags flags, QTextCodec *codec) -{ - // Cancel the possible ongoing reload without the commandFinished() nor - // processingFinished() notifications, as right after that - // we re-reload it from scratch. So no intermediate "Retrieving data failed." - // and "Waiting for data..." will be shown. - delete d->m_command; - d->cancelReload(); - - d->m_command = VcsBaseClient::createVcsCommand(workingDirectory(), d->m_processEnvironment); - d->m_command->setDisplayName(displayName()); - d->m_command->setCodec(codec ? codec : EditorManager::defaultTextCodec()); - connect(d->m_command.data(), &VcsCommand::done, this, [this] { - d->commandFinished(d->m_command->result() == ProcessResult::FinishedWithSuccess); - }); - d->m_command->addFlags(flags); - - for (const QStringList &arg : args) { - QTC_ASSERT(!arg.isEmpty(), continue); - - d->m_command->addJob({d->m_vcsBinary, arg}, d->m_vscTimeoutS); - } - - d->m_command->start(); -} - -void VcsBaseDiffEditorController::processCommandOutput(const QString &output) -{ - d->processDiff(output); -} - -void VcsBaseDiffEditorController::setVcsTimeoutS(int value) -{ - d->m_vscTimeoutS = value; -} - void VcsBaseDiffEditorController::setVcsBinary(const FilePath &path) { d->m_vcsBinary = path; diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h index 1b78ba56395..735e70af344 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h @@ -4,20 +4,11 @@ #pragma once #include "vcsbase_global.h" -#include "vcsenums.h" #include -QT_BEGIN_NAMESPACE -class QTextCodec; -QT_END_NAMESPACE - -namespace Core { class IDocument; } - namespace Utils { -template class AsyncTask; class Environment; -class FilePath; class QtcProcess; } // Utils @@ -35,15 +26,12 @@ public: void setProcessEnvironment(const Utils::Environment &value); void setVcsBinary(const Utils::FilePath &path); - void setVcsTimeoutS(int value); protected: Utils::Tasking::TreeStorage inputStorage() const; Utils::Tasking::TaskItem postProcessTask(); void setupCommand(Utils::QtcProcess &process, const QStringList &args) const; - void runCommand(const QList &args, RunFlags flags, QTextCodec *codec = nullptr); - virtual void processCommandOutput(const QString &output); private: friend class VcsBaseDiffEditorControllerPrivate;