diff --git a/src/plugins/bazaar/bazaarclient.cpp b/src/plugins/bazaar/bazaarclient.cpp index 48dc0e7c5db..9cf40be7f79 100644 --- a/src/plugins/bazaar/bazaarclient.cpp +++ b/src/plugins/bazaar/bazaarclient.cpp @@ -118,8 +118,7 @@ public: } }; -BazaarClient::BazaarClient() : - VcsBaseClient(new BazaarSettings) +BazaarClient::BazaarClient() : VcsBaseClient(new BazaarSettings) { setDiffParameterWidgetCreator([this] { return new BazaarDiffParameterWidget(settings()); }); setLogParameterWidgetCreator([this] { return new BazaarLogParameterWidget(settings()); }); diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 927baf8e113..b81c316db79 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -603,7 +603,7 @@ static inline void msgCannotRun(const QStringList &args, const QString &workingD const char *GitClient::stashNamePrefix = "stash@{"; -GitClient::GitClient() : VcsBase::VcsBaseClientImpl(new GitSettings), +GitClient::GitClient() : VcsBase::VcsBaseClientImpl(this, new GitSettings), m_cachedGitVersion(0), m_disableEditor(false) { @@ -1967,36 +1967,6 @@ bool GitClient::synchronousApplyPatch(const QString &workingDirectory, return true; } -// Factory function to create an asynchronous command -VcsCommand *GitClient::createCommand(const QString &workingDirectory, VcsBaseEditorWidget *editor, - JobOutputBindMode mode) -{ - GitEditorWidget *gitEditor = qobject_cast(editor); - auto command = new VcsCommand(vcsBinary(), workingDirectory, processEnvironment()); - command->setCodec(getSourceCodec(currentDocumentPath())); - if (gitEditor) { - gitEditor->setCommand(command); - connect(command, &VcsCommand::finished, - gitEditor, &GitEditorWidget::commandFinishedGotoLine); - } - if (mode & VcsWindowOutputBind) { - command->addFlags(VcsBasePlugin::ShowStdOutInLogWindow); - command->addFlags(VcsBasePlugin::ShowSuccessMessage); - if (editor) // assume that the commands output is the important thing - command->addFlags(VcsBasePlugin::SilentOutput); - } else if (gitEditor) { - connect(command, &VcsCommand::output, gitEditor, &GitEditorWidget::setPlainTextFiltered); - } - - return command; -} - -void GitClient::enqueueJob(VcsCommand *cmd, const QStringList &args, ExitCodeInterpreter *interpreter) -{ - cmd->addJob(args, vcsTimeout(), interpreter); - cmd->execute(); -} - // Execute a single command VcsCommand *GitClient::executeGit(const QString &workingDirectory, const QStringList &arguments, @@ -2016,7 +1986,7 @@ VcsCommand *GitClient::executeGit(const QString &workingDirectory, QProcessEnvironment GitClient::processEnvironment() const { - QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); + QProcessEnvironment environment = VcsBaseClientImpl::processEnvironment(); QString gitPath = settings().stringValue(GitSettings::pathKey); if (!gitPath.isEmpty()) { gitPath += HostOsInfo::pathListSeparator(); @@ -2028,8 +1998,6 @@ QProcessEnvironment GitClient::processEnvironment() const environment.insert(QLatin1String("HOME"), QDir::toNativeSeparators(QDir::homePath())); } environment.insert(QLatin1String("GIT_EDITOR"), m_disableEditor ? QLatin1String("true") : m_gitQtcEditor); - // Set up SSH and C locale (required by git using perl). - VcsBasePlugin::setProcessEnvironment(&environment, false); return environment; } diff --git a/src/plugins/git/gitclient.h b/src/plugins/git/gitclient.h index 4222db9526a..06eb460404b 100644 --- a/src/plugins/git/gitclient.h +++ b/src/plugins/git/gitclient.h @@ -376,17 +376,6 @@ private: void requestReload(const QString &documentId, const QString &source, const QString &title, std::function factory) const; - enum JobOutputBindMode { - NoOutputBind, - VcsWindowOutputBind - }; - - VcsBase::VcsCommand *createCommand(const QString &workingDirectory, - VcsBase::VcsBaseEditorWidget *editor = 0, - JobOutputBindMode mode = NoOutputBind); - void enqueueJob(VcsBase::VcsCommand *cmd, const QStringList &args, - Utils::ExitCodeInterpreter *interpreter = 0); - VcsBase::VcsCommand *executeGit(const QString &workingDirectory, const QStringList &arguments, VcsBase::VcsBaseEditorWidget* editor = 0, diff --git a/src/plugins/git/giteditor.cpp b/src/plugins/git/giteditor.cpp index 08bc31bd253..b75c8ccfe6b 100644 --- a/src/plugins/git/giteditor.cpp +++ b/src/plugins/git/giteditor.cpp @@ -197,16 +197,6 @@ void GitEditorWidget::setPlainTextFiltered(const QString &text) textDocument()->setPlainText(modText); } -void GitEditorWidget::commandFinishedGotoLine(bool ok, int exitCode, const QVariant &v) -{ - reportCommandFinished(ok, exitCode, v); - if (ok && v.type() == QVariant::Int) { - const int line = v.toInt(); - if (line >= 0) - gotoLine(line); - } -} - void GitEditorWidget::checkoutChange() { GitPlugin::instance()->client()->stashAndCheckout( diff --git a/src/plugins/git/giteditor.h b/src/plugins/git/giteditor.h index 8d2803c1a46..d033bf8b172 100644 --- a/src/plugins/git/giteditor.h +++ b/src/plugins/git/giteditor.h @@ -51,8 +51,6 @@ public: public slots: void setPlainTextFiltered(const QString &text); - // Matches the signature of the finished signal of GitCommand - void commandFinishedGotoLine(bool ok, int exitCode, const QVariant &v); private slots: void checkoutChange(); diff --git a/src/plugins/mercurial/mercurialclient.cpp b/src/plugins/mercurial/mercurialclient.cpp index 31c50f0f326..a736d8f622c 100644 --- a/src/plugins/mercurial/mercurialclient.cpp +++ b/src/plugins/mercurial/mercurialclient.cpp @@ -68,8 +68,7 @@ public: } }; -MercurialClient::MercurialClient() : - VcsBaseClient(new MercurialSettings) +MercurialClient::MercurialClient() : VcsBaseClient(new MercurialSettings) { setDiffParameterWidgetCreator([this] { return new MercurialDiffParameterWidget(settings()); }); } diff --git a/src/plugins/vcsbase/vcsbaseclient.cpp b/src/plugins/vcsbase/vcsbaseclient.cpp index 00a493ead87..64db7df7a63 100644 --- a/src/plugins/vcsbase/vcsbaseclient.cpp +++ b/src/plugins/vcsbase/vcsbaseclient.cpp @@ -82,15 +82,27 @@ namespace VcsBase { class VcsBaseClientImplPrivate { public: - VcsBaseClientImplPrivate(VcsBaseClientSettings *settings); + VcsBaseClientImplPrivate(VcsBaseClientImpl *client, VcsBaseClientSettings *settings); ~VcsBaseClientImplPrivate(); + void bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor); + VcsBaseClientSettings *m_clientSettings; + QSignalMapper *m_cmdFinishedMapper; }; +void VcsBaseClientImplPrivate::bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor) +{ + editor->setCommand(cmd); + QObject::connect(cmd, &VcsCommand::finished, + m_cmdFinishedMapper, static_cast(&QSignalMapper::map)); + m_cmdFinishedMapper->setMapping(cmd, editor); +} -VcsBaseClientImplPrivate::VcsBaseClientImplPrivate(VcsBaseClientSettings *settings) : - m_clientSettings(settings) +VcsBaseClientImplPrivate::VcsBaseClientImplPrivate(VcsBaseClientImpl *client, + VcsBaseClientSettings *settings) : + m_clientSettings(settings), + m_cmdFinishedMapper(new QSignalMapper(client)) { m_clientSettings->readSettings(Core::ICore::settings()); } @@ -100,11 +112,14 @@ VcsBaseClientImplPrivate::~VcsBaseClientImplPrivate() delete m_clientSettings; } -VcsBaseClientImpl::VcsBaseClientImpl(VcsBaseClientSettings *settings) : - d(new VcsBaseClientImplPrivate(settings)) +VcsBaseClientImpl::VcsBaseClientImpl(VcsBaseClientImpl *client, VcsBaseClientSettings *settings) : + d(new VcsBaseClientImplPrivate(client, settings)) { connect(Core::ICore::instance(), &Core::ICore::saveSettingsRequested, this, &VcsBaseClientImpl::saveSettings); + + connect(d->m_cmdFinishedMapper, static_cast(&QSignalMapper::mapped), + this, &VcsBaseClientImpl::commandFinishedGotoLine); } VcsBaseClientImpl::~VcsBaseClientImpl() @@ -122,6 +137,40 @@ Utils::FileName VcsBaseClientImpl::vcsBinary() const return settings().binaryPath(); } +VcsCommand *VcsBaseClientImpl::createCommand(const QString &workingDirectory, + VcsBaseEditorWidget *editor, + JobOutputBindMode mode) const +{ + auto cmd = new VcsCommand(vcsBinary(), workingDirectory, + processEnvironment()); + cmd->setDefaultTimeout(vcsTimeout()); + if (editor) + d->bindCommandToEditor(cmd, editor); + if (mode == VcsWindowOutputBind) { + cmd->addFlags(VcsBasePlugin::ShowStdOutInLogWindow); + if (editor) // assume that the commands output is the important thing + cmd->addFlags(VcsBasePlugin::SilentOutput); + } else if (editor) { + connect(cmd, &VcsCommand::output, editor, &VcsBaseEditorWidget::setPlainText); + } + + return cmd; +} + +void VcsBaseClientImpl::enqueueJob(VcsCommand *cmd, const QStringList &args, + Utils::ExitCodeInterpreter *interpreter) +{ + cmd->addJob(args, vcsTimeout(), interpreter); + cmd->execute(); +} + +QProcessEnvironment VcsBaseClientImpl::processEnvironment() const +{ + QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); + VcsBasePlugin::setProcessEnvironment(&environment, false); + return environment; +} + int VcsBaseClientImpl::vcsTimeout() const { return settings().intValue(VcsBaseClientSettings::timeoutKey); @@ -132,34 +181,32 @@ void VcsBaseClientImpl::saveSettings() settings().writeSettings(Core::ICore::settings()); } +void VcsBaseClientImpl::commandFinishedGotoLine(QWidget *editorObject) +{ + VcsBaseEditorWidget *editor = qobject_cast(editorObject); + VcsCommand *cmd = qobject_cast(d->m_cmdFinishedMapper->mapping(editor)); + if (editor && cmd) { + if (!cmd->lastExecutionSuccess()) { + editor->reportCommandFinished(false, cmd->lastExecutionExitCode(), cmd->cookie()); + } else if (cmd->cookie().type() == QVariant::Int) { + const int line = cmd->cookie().toInt(); + if (line >= 0) + editor->gotoLine(line); + } + d->m_cmdFinishedMapper->removeMappings(cmd); + } +} + class VcsBaseClientPrivate { public: - VcsBaseClientPrivate(VcsBaseClient *client); - - void bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor); - VcsBaseEditorParameterWidget *createDiffEditor(); VcsBaseEditorParameterWidget *createLogEditor(); - QSignalMapper *m_cmdFinishedMapper; - VcsBaseClient::ParameterWidgetCreator m_diffParamWidgetCreator; VcsBaseClient::ParameterWidgetCreator m_logParamWidgetCreator; }; -VcsBaseClientPrivate::VcsBaseClientPrivate(VcsBaseClient *client) : - m_cmdFinishedMapper(new QSignalMapper(client)) -{ } - -void VcsBaseClientPrivate::bindCommandToEditor(VcsCommand *cmd, VcsBaseEditorWidget *editor) -{ - editor->setCommand(cmd); - QObject::connect(cmd, &VcsCommand::finished, - m_cmdFinishedMapper, static_cast(&QSignalMapper::map)); - m_cmdFinishedMapper->setMapping(cmd, editor); -} - VcsBaseEditorParameterWidget *VcsBaseClientPrivate::createDiffEditor() { return m_diffParamWidgetCreator ? m_diffParamWidgetCreator() : 0; @@ -175,12 +222,10 @@ VcsBaseClient::StatusItem::StatusItem(const QString &s, const QString &f) : { } VcsBaseClient::VcsBaseClient(VcsBaseClientSettings *settings) : - VcsBaseClientImpl(settings), - d(new VcsBaseClientPrivate(this)) + VcsBaseClientImpl(this, settings), + d(new VcsBaseClientPrivate) { qRegisterMetaType(); - connect(d->m_cmdFinishedMapper, static_cast(&QSignalMapper::mapped), - this, &VcsBaseClient::commandFinishedGotoLine); } VcsBaseClient::~VcsBaseClient() @@ -582,39 +627,6 @@ VcsBaseEditorWidget *VcsBaseClient::createVcsEditor(Core::Id kind, QString title return baseEditor; } -QProcessEnvironment VcsBaseClient::processEnvironment() const -{ - QProcessEnvironment environment = QProcessEnvironment::systemEnvironment(); - VcsBasePlugin::setProcessEnvironment(&environment, false); - return environment; -} - -VcsCommand *VcsBaseClient::createCommand(const QString &workingDirectory, - VcsBaseEditorWidget *editor, - JobOutputBindMode mode) const -{ - auto cmd = new VcsCommand(vcsBinary(), workingDirectory, - processEnvironment()); - cmd->setDefaultTimeout(vcsTimeout()); - if (editor) - d->bindCommandToEditor(cmd, editor); - if (mode == VcsWindowOutputBind) { - cmd->addFlags(VcsBasePlugin::ShowStdOutInLogWindow); - if (editor) // assume that the commands output is the important thing - cmd->addFlags(VcsBasePlugin::SilentOutput); - } else if (editor) { - connect(cmd, &VcsCommand::output, editor, &VcsBaseEditorWidget::setPlainText); - } - - return cmd; -} - -void VcsBaseClient::enqueueJob(VcsCommand *cmd, const QStringList &args, Utils::ExitCodeInterpreter *interpreter) -{ - cmd->addJob(args, vcsTimeout(), interpreter); - cmd->execute(); -} - void VcsBaseClient::resetCachedVcsInfo(const QString &workingDir) { Core::VcsManager::resetVersionControlForDirectory(workingDir); @@ -647,22 +659,6 @@ void VcsBaseClient::annotateRevision(const QString &workingDirectory, const QSt annotate(workingDirectory, file, changeCopy, lineNumber); } -void VcsBaseClient::commandFinishedGotoLine(QWidget *editorObject) -{ - VcsBaseEditorWidget *editor = qobject_cast(editorObject); - VcsCommand *cmd = qobject_cast(d->m_cmdFinishedMapper->mapping(editor)); - if (editor && cmd) { - if (!cmd->lastExecutionSuccess()) { - editor->reportCommandFinished(false, cmd->lastExecutionExitCode(), cmd->cookie()); - } else if (cmd->cookie().type() == QVariant::Int) { - const int line = cmd->cookie().toInt(); - if (line >= 0) - editor->gotoLine(line); - } - d->m_cmdFinishedMapper->removeMappings(cmd); - } -} - } // namespace VcsBase #include "moc_vcsbaseclient.cpp" diff --git a/src/plugins/vcsbase/vcsbaseclient.h b/src/plugins/vcsbase/vcsbaseclient.h index 1c69dd4c827..f344bad3b9f 100644 --- a/src/plugins/vcsbase/vcsbaseclient.h +++ b/src/plugins/vcsbase/vcsbaseclient.h @@ -68,7 +68,7 @@ class VCSBASE_EXPORT VcsBaseClientImpl : public QObject Q_OBJECT public: - explicit VcsBaseClientImpl(VcsBaseClientSettings *settings); + explicit VcsBaseClientImpl(VcsBaseClientImpl *client, VcsBaseClientSettings *settings); ~VcsBaseClientImpl(); VcsBaseClientSettings &settings() const; @@ -76,8 +76,23 @@ public: virtual Utils::FileName vcsBinary() const; int vcsTimeout() const; + enum JobOutputBindMode { + NoOutputBind, + VcsWindowOutputBind + }; + + VcsCommand *createCommand(const QString &workingDirectory, + VcsBaseEditorWidget *editor = 0, + JobOutputBindMode mode = NoOutputBind) const; + + void enqueueJob(VcsCommand *cmd, const QStringList &args, + Utils::ExitCodeInterpreter *interpreter = 0); + + virtual QProcessEnvironment processEnvironment() const; + private: void saveSettings(); + void commandFinishedGotoLine(QWidget*); VcsBaseClientImplPrivate *d; }; @@ -144,8 +159,6 @@ public: virtual QString findTopLevelForFile(const QFileInfo &file) const = 0; - virtual QProcessEnvironment processEnvironment() const; - signals: void parsedStatus(const QList &statusList); // Passes on changed signals from VcsJob to Control @@ -201,22 +214,11 @@ protected: const char *registerDynamicProperty, const QString &dynamicPropertyValue) const; - enum JobOutputBindMode { - NoOutputBind, - VcsWindowOutputBind - }; - - VcsCommand *createCommand(const QString &workingDirectory, - VcsBaseEditorWidget *editor = 0, - JobOutputBindMode mode = NoOutputBind) const; - void enqueueJob(VcsCommand *cmd, const QStringList &args, Utils::ExitCodeInterpreter *interpreter = 0); - void resetCachedVcsInfo(const QString &workingDir); private: void statusParser(const QString&); void annotateRevision(const QString&, const QString&, const QString&, int); - void commandFinishedGotoLine(QWidget*); friend class VcsBaseClientPrivate; VcsBaseClientPrivate *d;