diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 00a7f65bbd7..22234556d9d 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -268,7 +268,7 @@ class GitDiffEditorController : public VcsBaseDiffEditorController Q_OBJECT public: - GitDiffEditorController(IDocument *document, const QString &workingDirectory); + explicit GitDiffEditorController(IDocument *document); protected: void runCommand(const QList &args, QTextCodec *codec = nullptr); @@ -283,8 +283,8 @@ private: DescriptionWidgetDecorator m_decorator; }; -GitDiffEditorController::GitDiffEditorController(IDocument *document, const QString &workingDirectory) : - VcsBaseDiffEditorController(document, GitPluginPrivate::client(), workingDirectory), +GitDiffEditorController::GitDiffEditorController(IDocument *document) : + VcsBaseDiffEditorController(document), m_watcher(this), m_decorator(&m_watcher) { @@ -385,8 +385,8 @@ class RepositoryDiffController : public GitDiffEditorController { Q_OBJECT public: - RepositoryDiffController(IDocument *document, const QString &dir) : - GitDiffEditorController(document, dir) + explicit RepositoryDiffController(IDocument *document) : + GitDiffEditorController(document) { } void reload() override; @@ -403,8 +403,8 @@ class FileDiffController : public GitDiffEditorController { Q_OBJECT public: - FileDiffController(IDocument *document, const QString &dir, const QString &fileName) : - GitDiffEditorController(document, dir), + FileDiffController(IDocument *document, const QString &fileName) : + GitDiffEditorController(document), m_fileName(fileName) { } @@ -427,9 +427,9 @@ class FileListDiffController : public GitDiffEditorController { Q_OBJECT public: - FileListDiffController(IDocument *document, const QString &dir, + FileListDiffController(IDocument *document, const QStringList &stagedFiles, const QStringList &unstagedFiles) : - GitDiffEditorController(document, dir), + GitDiffEditorController(document), m_stagedFiles(stagedFiles), m_unstagedFiles(unstagedFiles) { } @@ -464,9 +464,8 @@ class ProjectDiffController : public GitDiffEditorController { Q_OBJECT public: - ProjectDiffController(IDocument *document, const QString &dir, - const QStringList &projectPaths) : - GitDiffEditorController(document, dir), + ProjectDiffController(IDocument *document, const QStringList &projectPaths) : + GitDiffEditorController(document), m_projectPaths(projectPaths) { } @@ -487,9 +486,8 @@ class BranchDiffController : public GitDiffEditorController { Q_OBJECT public: - BranchDiffController(IDocument *document, const QString &dir, - const QString &branch) : - GitDiffEditorController(document, dir), + BranchDiffController(IDocument *document, const QString &branch) : + GitDiffEditorController(document), m_branch(branch) { } @@ -510,8 +508,8 @@ class ShowController : public GitDiffEditorController { Q_OBJECT public: - ShowController(IDocument *document, const QString &dir, const QString &id) : - GitDiffEditorController(document, dir), + ShowController(IDocument *document, const QString &id) : + GitDiffEditorController(document), m_id(id), m_state(Idle) { @@ -940,16 +938,20 @@ void GitClient::stage(DiffEditor::DiffEditorController *diffController, } void GitClient::requestReload(const QString &documentId, const QString &source, - const QString &title, - std::function factory) const + const QString &title, const QString &workingDirectory, + std::function factory) const { // Creating document might change the referenced source. Store a copy and use it. const QString sourceCopy = source; IDocument *document = DiffEditorController::findOrCreateDocument(documentId, title); QTC_ASSERT(document, return); - DiffEditorController *controller = factory(document); + VcsBaseDiffEditorController *controller = factory(document); QTC_ASSERT(controller, return); + controller->setVcsBinary(settings().binaryPath()); + controller->setVcsTimeoutS(settings().vcsTimeoutS()); + controller->setProcessEnvironment(processEnvironment()); + controller->setWorkingDirectory(workingDirectory); connect(controller, &DiffEditorController::chunkActionsRequested, this, &GitClient::chunkActionsRequested, Qt::DirectConnection); @@ -966,11 +968,9 @@ void GitClient::diffFiles(const QString &workingDirectory, const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffFiles.") + workingDirectory; requestReload(documentId, - workingDirectory, tr("Git Diff Files"), - [workingDirectory, stagedFileNames, unstagedFileNames] - (IDocument *doc) -> DiffEditorController* { - return new FileListDiffController(doc, workingDirectory, - stagedFileNames, unstagedFileNames); + workingDirectory, tr("Git Diff Files"), workingDirectory, + [stagedFileNames, unstagedFileNames](IDocument *doc) { + return new FileListDiffController(doc, stagedFileNames, unstagedFileNames); }); } @@ -979,10 +979,9 @@ void GitClient::diffProject(const QString &workingDirectory, const QString &proj const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffProject.") + workingDirectory; requestReload(documentId, - workingDirectory, tr("Git Diff Project"), - [workingDirectory, projectDirectory] - (IDocument *doc) -> DiffEditorController* { - return new ProjectDiffController(doc, workingDirectory, {projectDirectory}); + workingDirectory, tr("Git Diff Project"), workingDirectory, + [projectDirectory](IDocument *doc){ + return new ProjectDiffController(doc, {projectDirectory}); }); } @@ -991,10 +990,8 @@ void GitClient::diffRepository(const QString &workingDirectory) const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffRepository.") + workingDirectory; requestReload(documentId, - workingDirectory, tr("Git Diff Repository"), - [workingDirectory](IDocument *doc) -> DiffEditorController* { - return new RepositoryDiffController(doc, workingDirectory); - }); + workingDirectory, tr("Git Diff Repository"), workingDirectory, + [](IDocument *doc) { return new RepositoryDiffController(doc); }); } void GitClient::diffFile(const QString &workingDirectory, const QString &fileName) const @@ -1003,24 +1000,17 @@ void GitClient::diffFile(const QString &workingDirectory, const QString &fileNam const QString sourceFile = VcsBaseEditor::getSource(workingDirectory, fileName); const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DifFile.") + sourceFile; - requestReload(documentId, sourceFile, title, - [workingDirectory, fileName] - (IDocument *doc) -> DiffEditorController* { - return new FileDiffController(doc, workingDirectory, fileName); - }); + requestReload(documentId, sourceFile, title, workingDirectory, + [fileName](IDocument *doc) { return new FileDiffController(doc, fileName); }); } -void GitClient::diffBranch(const QString &workingDirectory, - const QString &branchName) const +void GitClient::diffBranch(const QString &workingDirectory, const QString &branchName) const { const QString title = tr("Git Diff Branch \"%1\"").arg(branchName); const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".DiffBranch.") + branchName; - requestReload(documentId, workingDirectory, title, - [workingDirectory, branchName] - (IDocument *doc) -> DiffEditorController* { - return new BranchDiffController(doc, workingDirectory, branchName); - }); + requestReload(documentId, workingDirectory, title, workingDirectory, + [branchName](IDocument *doc) { return new BranchDiffController(doc, branchName); }); } void GitClient::merge(const QString &workingDirectory, @@ -1123,11 +1113,8 @@ void GitClient::show(const QString &source, const QString &id, const QString &na workingDirectory = repoDirectory; const QString documentId = QLatin1String(Constants::GIT_PLUGIN) + QLatin1String(".Show.") + id; - requestReload(documentId, source, title, - [workingDirectory, id] - (IDocument *doc) -> DiffEditorController* { - return new ShowController(doc, workingDirectory, id); - }); + requestReload(documentId, source, title, workingDirectory, + [id](IDocument *doc) { return new ShowController(doc, id); }); } void GitClient::archive(const QString &workingDirectory, QString commit) diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index ef943745a9f..d923ec0fe6a 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -50,6 +50,7 @@ namespace Core { class ICore; } namespace VcsBase { class VcsCommand; class SubmitFileModel; + class VcsBaseDiffEditorController; class VcsBaseEditorWidget; } @@ -361,8 +362,8 @@ private: enum CodecType { CodecSource, CodecLogOutput, CodecNone }; QTextCodec *codecFor(CodecType codecType, const QString &source = QString()) const; - void requestReload(const QString &documentId, const QString &source, const QString &title, - std::function factory) const; + void requestReload(const QString &documentId, const QString &source, const QString &title, const QString &workingDirectory, + std::function factory) const; // determine version as '(major << 16) + (minor << 8) + patch' or 0. unsigned synchronousGitVersion(QString *errorMessage = nullptr) const; diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 67d9918729a..719064dca58 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -58,19 +58,17 @@ namespace Internal { class MercurialDiffEditorController : public VcsBaseDiffEditorController { public: - MercurialDiffEditorController(IDocument *document, VcsBaseClientImpl *client, const QString &workingDirectory); + MercurialDiffEditorController(IDocument *document) + : VcsBaseDiffEditorController(document) + { + setDisplayName("Hg Diff"); + } protected: void runCommand(const QList &args, QTextCodec *codec = nullptr); QStringList addConfigurationArguments(const QStringList &args) const; }; -MercurialDiffEditorController::MercurialDiffEditorController(IDocument *document, VcsBaseClientImpl *client, const QString &workingDirectory): - VcsBaseDiffEditorController(document, client, workingDirectory) -{ - setDisplayName("Hg Diff"); -} - void MercurialDiffEditorController::runCommand(const QList &args, QTextCodec *codec) { // at this moment, don't ignore any errors @@ -90,8 +88,8 @@ QStringList MercurialDiffEditorController::addConfigurationArguments(const QStri class FileDiffController : public MercurialDiffEditorController { public: - FileDiffController(IDocument *document, VcsBaseClient *client, const QString &dir, const QString &fileName) : - MercurialDiffEditorController(document, client, dir), + FileDiffController(IDocument *document, const QString &fileName) : + MercurialDiffEditorController(document), m_fileName(fileName) { } @@ -108,8 +106,8 @@ private: class FileListDiffController : public MercurialDiffEditorController { public: - FileListDiffController(IDocument *document, VcsBaseClient *client, const QString &dir, const QStringList &fileNames) : - MercurialDiffEditorController(document, client, dir), + FileListDiffController(IDocument *document, const QStringList &fileNames) : + MercurialDiffEditorController(document), m_fileNames(fileNames) { } @@ -128,8 +126,8 @@ private: class RepositoryDiffController : public MercurialDiffEditorController { public: - RepositoryDiffController(IDocument *document, VcsBaseClient *client, const QString &dir) : - MercurialDiffEditorController(document, client, dir) + RepositoryDiffController(IDocument *document) : + MercurialDiffEditorController(document) { } void reload() override @@ -400,29 +398,23 @@ void MercurialClient::diff(const QString &workingDir, const QStringList &files, const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) + ".DiffRepo." + sourceFile; - requestReload(documentId, sourceFile, title, - [this, workingDir](IDocument *doc) { - return new RepositoryDiffController(doc, this, workingDir); - }); + requestReload(documentId, sourceFile, title, workingDir, + [](IDocument *doc) { return new RepositoryDiffController(doc); }); } else if (files.size() == 1) { fileName = files.at(0); const QString title = tr("Mercurial Diff \"%1\"").arg(fileName); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) + ".DiffFile." + sourceFile; - requestReload(documentId, sourceFile, title, - [this, workingDir, fileName](IDocument *doc) { - return new FileDiffController(doc, this, workingDir, fileName); - }); + requestReload(documentId, sourceFile, title, workingDir, + [fileName](IDocument *doc) { return new FileDiffController(doc, fileName); }); } else { const QString title = tr("Mercurial Diff \"%1\"").arg(workingDir); const QString sourceFile = VcsBaseEditor::getSource(workingDir, fileName); const QString documentId = QString(Constants::MERCURIAL_PLUGIN) + ".DiffFile." + workingDir; - requestReload(documentId, sourceFile, title, - [this, workingDir, files](IDocument *doc) { - return new FileListDiffController(doc, this, workingDir, files); - }); + requestReload(documentId, sourceFile, title, workingDir, + [files](IDocument *doc) { return new FileListDiffController(doc, files); }); } } @@ -511,15 +503,20 @@ MercurialClient::StatusItem MercurialClient::parseStatusLine(const QString &line } void MercurialClient::requestReload(const QString &documentId, const QString &source, const QString &title, - std::function factory) const + const QString &workingDirectory, + std::function factory) { // Creating document might change the referenced source. Store a copy and use it. const QString sourceCopy = source; IDocument *document = DiffEditorController::findOrCreateDocument(documentId, title); QTC_ASSERT(document, return); - DiffEditorController *controller = factory(document); + VcsBaseDiffEditorController *controller = factory(document); QTC_ASSERT(controller, return); + controller->setVcsBinary(settings().binaryPath()); + controller->setVcsTimeoutS(settings().vcsTimeoutS()); + controller->setProcessEnvironment(processEnvironment()); + controller->setWorkingDirectory(workingDirectory); VcsBase::setSource(document, sourceCopy); EditorManager::activateEditorForDocument(document); diff --git a/src/plugins/mercurial/mercurialclient.h b/src/plugins/mercurial/mercurialclient.h index 4722a4f3b54..baa2ccfd649 100644 --- a/src/plugins/mercurial/mercurialclient.h +++ b/src/plugins/mercurial/mercurialclient.h @@ -29,9 +29,7 @@ #include #include -namespace DiffEditor { -class DiffEditorController; -} +namespace VcsBase { class VcsBaseDiffEditorController; } namespace Mercurial { namespace Internal { @@ -90,8 +88,8 @@ signals: void needMerge(); private: - void requestReload(const QString &documentId, const QString &source, const QString &title, - std::function factory) const; + void requestReload(const QString &documentId, const QString &source, const QString &title, const QString &workingDirectory, + std::function factory); void parsePullOutput(const QString &output); }; diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index 020ec0b7d30..8cde41b02ae 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -171,10 +171,8 @@ class SubversionDiffEditorController : public VcsBaseDiffEditorController { Q_OBJECT public: - SubversionDiffEditorController(IDocument *document, - VcsBaseClient *client, - const QString &workingDirectory) - : VcsBaseDiffEditorController(document, client, workingDirectory) + SubversionDiffEditorController(IDocument *document, const QStringList &authOptions) + : VcsBaseDiffEditorController(document), m_authenticationOptions(authOptions) { forceContextLineCount(3); // SVN cannot change that when using internal diff } @@ -194,6 +192,7 @@ private: State m_state = Idle; QStringList m_filesList; int m_changeNumber = 0; + QStringList m_authenticationOptions; }; @@ -218,7 +217,7 @@ void SubversionDiffEditorController::requestDescription() m_state = GettingDescription; QStringList args(QLatin1String("log")); - args << SubversionClient::addAuthenticationOptions(settings()); + args << m_authenticationOptions; args << QLatin1String("-r"); args << QString::number(m_changeNumber); runCommand(QList() << args, VcsCommand::SshPasswordPrompt); @@ -230,7 +229,7 @@ void SubversionDiffEditorController::requestDiff() QStringList args; args << QLatin1String("diff"); - args << SubversionClient::addAuthenticationOptions(settings()); + args << m_authenticationOptions; args << QLatin1String("--internal-diff"); if (ignoreWhitespace()) args << QLatin1String("-x") << QLatin1String("-uw"); @@ -273,8 +272,13 @@ SubversionDiffEditorController *SubversionClient::findOrCreateDiffEditor(const Q IDocument *document = DiffEditorController::findOrCreateDocument(documentId, title); auto controller = qobject_cast( DiffEditorController::controller(document)); - if (!controller) - controller = new SubversionDiffEditorController(document, this, workingDirectory); + if (!controller) { + controller = new SubversionDiffEditorController(document, addAuthenticationOptions(settings())); + controller->setVcsBinary(settings().binaryPath()); + controller->setVcsTimeoutS(settings().vcsTimeoutS()); + controller->setProcessEnvironment(processEnvironment()); + controller->setWorkingDirectory(workingDirectory); + } VcsBase::setSource(document, source); EditorManager::activateEditorForDocument(document); return controller; diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp index 56ed66132c0..93e75a6dd9c 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp @@ -24,7 +24,6 @@ ****************************************************************************/ #include "vcsbasediffeditorcontroller.h" -#include "vcsbaseclient.h" #include "vcscommand.h" #include "vcsbaseclientsettings.h" @@ -83,9 +82,7 @@ private: class VcsBaseDiffEditorControllerPrivate { public: - VcsBaseDiffEditorControllerPrivate(VcsBaseDiffEditorController *controller, - VcsBaseClientImpl *client, - const QString &workingDirectory); + VcsBaseDiffEditorControllerPrivate(VcsBaseDiffEditorController *q) : q(q) {} ~VcsBaseDiffEditorControllerPrivate(); void processingFinished(); @@ -95,8 +92,10 @@ public: void commandFinished(bool success); VcsBaseDiffEditorController *q; - VcsBaseClientImpl *m_client; - const QString m_directory; + QString m_directory; + QProcessEnvironment m_processEnvironment; + Utils::FilePath m_vcsBinary; + int m_vscTimeoutS; QString m_startupFile; QString m_output; QString m_displayName; @@ -130,16 +129,6 @@ void VcsCommandResultProxy::commandFinished(bool success) m_target->commandFinished(success); } -VcsBaseDiffEditorControllerPrivate::VcsBaseDiffEditorControllerPrivate( - VcsBaseDiffEditorController *controller, - VcsBaseClientImpl *client, - const QString &workingDirectory) - : q(controller) - , m_client(client) - , m_directory(workingDirectory) -{ -} - VcsBaseDiffEditorControllerPrivate::~VcsBaseDiffEditorControllerPrivate() { cancelReload(); @@ -231,14 +220,10 @@ void VcsBaseDiffEditorControllerPrivate::commandFinished(bool success) ///////////////////// -VcsBaseDiffEditorController::VcsBaseDiffEditorController(IDocument *document, - VcsBaseClientImpl *client, - const QString &workingDirectory) +VcsBaseDiffEditorController::VcsBaseDiffEditorController(Core::IDocument *document) : DiffEditorController(document) - , d(new VcsBaseDiffEditorControllerPrivate(this, client, workingDirectory)) -{ - setBaseDirectory(workingDirectory); -} + , d(new VcsBaseDiffEditorControllerPrivate(this)) +{} VcsBaseDiffEditorController::~VcsBaseDiffEditorController() { @@ -253,7 +238,7 @@ void VcsBaseDiffEditorController::runCommand(const QList &args, uns // and "Waiting for data..." will be shown. d->cancelReload(); - d->m_command = new VcsCommand(workingDirectory(), d->m_client->processEnvironment()); + d->m_command = new VcsCommand(workingDirectory(), d->m_processEnvironment); d->m_command->setDisplayName(d->m_displayName); d->m_command->setCodec(codec ? codec : EditorManager::defaultTextCodec()); d->m_commandResultProxy = new VcsCommandResultProxy(d->m_command.data(), d); @@ -262,7 +247,7 @@ void VcsBaseDiffEditorController::runCommand(const QList &args, uns for (const QStringList &arg : args) { QTC_ASSERT(!arg.isEmpty(), continue); - d->m_command->addJob({d->m_client->vcsBinary(), arg}, d->m_client->vcsTimeoutS()); + d->m_command->addJob({d->m_vcsBinary, arg}, d->m_vscTimeoutS); } d->m_command->execute(); @@ -273,11 +258,6 @@ void VcsBaseDiffEditorController::processCommandOutput(const QString &output) d->processDiff(output); } -const VcsBaseClientSettings &VcsBaseDiffEditorController::settings() const -{ - return d->m_client->settings(); -} - QString VcsBaseDiffEditorController::workingDirectory() const { return d->m_directory; @@ -298,6 +278,27 @@ void VcsBaseDiffEditorController::setDisplayName(const QString &displayName) d->m_displayName = displayName; } +void VcsBase::VcsBaseDiffEditorController::setWorkingDirectory(const QString &workingDir) +{ + d->m_directory = workingDir; + setBaseDirectory(workingDir); +} + +void VcsBaseDiffEditorController::setVcsTimeoutS(int value) +{ + d->m_vscTimeoutS = value; +} + +void VcsBaseDiffEditorController::setVcsBinary(const Utils::FilePath &path) +{ + d->m_vcsBinary = path; +} + +void VcsBaseDiffEditorController::setProcessEnvironment(const QProcessEnvironment &value) +{ + d->m_processEnvironment = value; +} + } // namespace VcsBase #include "vcsbasediffeditorcontroller.moc" diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h index c0bd12173e2..d5f3def6512 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.h +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.h @@ -26,14 +26,16 @@ #pragma once #include "vcsbase_global.h" + #include +#include + namespace Core { class IDocument; } +namespace Utils { class FilePath; } namespace VcsBase { -class VcsBaseClientImpl; -class VcsBaseClientSettings; class VcsBaseDiffEditorControllerPrivate; class VCSBASE_EXPORT VcsBaseDiffEditorController : public DiffEditor::DiffEditorController @@ -41,16 +43,18 @@ class VCSBASE_EXPORT VcsBaseDiffEditorController : public DiffEditor::DiffEditor Q_OBJECT public: - VcsBaseDiffEditorController(Core::IDocument *document, - VcsBaseClientImpl *client, - const QString &workingDirectory); + explicit VcsBaseDiffEditorController(Core::IDocument *document); ~VcsBaseDiffEditorController() override; + void setProcessEnvironment(const QProcessEnvironment &value); + void setVcsBinary(const Utils::FilePath &path); + void setVcsTimeoutS(int value); + void setWorkingDirectory(const QString &workingDir); + protected: void runCommand(const QList &args, unsigned flags, QTextCodec *codec = nullptr); virtual void processCommandOutput(const QString &output); - const VcsBaseClientSettings &settings() const; QString workingDirectory() const; void setStartupFile(const QString &startupFile); QString startupFile() const;