diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2017-06-30 14:50:28 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2017-07-05 14:20:07 +0000 |
commit | 4bea049c457470cf678cdf5ec6d36bc78145af84 (patch) | |
tree | 4d5eaf62dc2254737f87257933c138ffe9d24592 /src/plugins/subversion | |
parent | 0a2590e7beca3749bb6541475c745a41f615757c (diff) |
VcsBase: Create common base diff editor controller
Reuse it in subversion and git plugins.
It makes subversion diff more asynchronous than before.
Make VcsBase plugin dependand on DiffEditor plugin.
Change-Id: Iafea2941b890a95a269362e022af2dc03cdea550
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/plugins/subversion')
-rw-r--r-- | src/plugins/subversion/subversionclient.cpp | 105 | ||||
-rw-r--r-- | src/plugins/subversion/subversionclient.h | 4 |
2 files changed, 49 insertions, 60 deletions
diff --git a/src/plugins/subversion/subversionclient.cpp b/src/plugins/subversion/subversionclient.cpp index d6b4c89e51..185a76c1a5 100644 --- a/src/plugins/subversion/subversionclient.cpp +++ b/src/plugins/subversion/subversionclient.cpp @@ -30,6 +30,7 @@ #include <vcsbase/vcscommand.h> #include <vcsbase/vcsbaseconstants.h> +#include <vcsbase/vcsbasediffeditorcontroller.h> #include <vcsbase/vcsbaseeditor.h> #include <vcsbase/vcsbaseeditorconfig.h> #include <vcsbase/vcsbaseplugin.h> @@ -167,46 +168,40 @@ QStringList SubversionClient::escapeFiles(const QStringList &files) return Utils::transform(files, &SubversionClient::escapeFile); } -class DiffController : public DiffEditorController +class SubversionDiffEditorController : public VcsBaseDiffEditorController { Q_OBJECT public: - DiffController(IDocument *document, const SubversionClient *client, const QString &directory); + SubversionDiffEditorController(IDocument *document, + const QString &workingDirectory); void setFilesList(const QStringList &filesList); void setChangeNumber(int changeNumber); protected: void reload() override; - -private slots: - void slotTextualDiffOutputReceived(const QString &contents); + void processCommandOutput(const QString &output) override; private: - QString getDescription() const; - void postCollectTextualDiffOutput(); - QProcessEnvironment processEnvironment() const; + void requestDescription(); + void requestDiff(); - const SubversionClient *m_client; - QString m_workingDirectory; + enum State { Idle, GettingDescription, GettingDiff }; + State m_state; QStringList m_filesList; int m_changeNumber = 0; }; -DiffController::DiffController(IDocument *document, const SubversionClient *client, const QString &directory) : - DiffEditorController(document), - m_client(client), - m_workingDirectory(directory) +SubversionDiffEditorController::SubversionDiffEditorController( + IDocument *document, + const QString &workingDirectory) + : VcsBaseDiffEditorController(document, SubversionPlugin::instance()->client(), workingDirectory) + , m_state(Idle) { forceContextLineCount(3); // SVN can not change that when using internal diff } -QProcessEnvironment DiffController::processEnvironment() const -{ - return m_client->processEnvironment(); -} - -void DiffController::setFilesList(const QStringList &filesList) +void SubversionDiffEditorController::setFilesList(const QStringList &filesList) { if (isReloading()) return; @@ -214,7 +209,7 @@ void DiffController::setFilesList(const QStringList &filesList) m_filesList = SubversionClient::escapeFiles(filesList); } -void DiffController::setChangeNumber(int changeNumber) +void SubversionDiffEditorController::setChangeNumber(int changeNumber) { if (isReloading()) return; @@ -222,33 +217,24 @@ void DiffController::setChangeNumber(int changeNumber) m_changeNumber = qMax(changeNumber, 0); } -QString DiffController::getDescription() const +void SubversionDiffEditorController::requestDescription() { + m_state = GettingDescription; + QStringList args(QLatin1String("log")); - args << SubversionClient::addAuthenticationOptions(m_client->settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); args << QLatin1String("-r"); args << QString::number(m_changeNumber); - const SubversionResponse logResponse = - SubversionPlugin::instance()->runSvn(m_workingDirectory, args, - m_client->vcsTimeoutS(), - VcsCommand::SshPasswordPrompt); - - if (logResponse.error) - return QString(); - - return logResponse.stdOut; + runCommand(QList<QStringList>() << args, VcsCommand::SshPasswordPrompt); } -void DiffController::postCollectTextualDiffOutput() +void SubversionDiffEditorController::requestDiff() { - auto command = new VcsCommand(m_workingDirectory, processEnvironment()); - command->setCodec(EditorManager::defaultTextCodec()); - connect(command, &VcsCommand::stdOutText, this, &DiffController::slotTextualDiffOutputReceived); -// command->addFlags(diffExecutionFlags()); + m_state = GettingDiff; QStringList args; args << QLatin1String("diff"); - args << m_client->addAuthenticationOptions(m_client->settings()); + args << SubversionClient::addAuthenticationOptions(client()->settings()); args << QLatin1String("--internal-diff"); if (ignoreWhitespace()) args << QLatin1String("-x") << QLatin1String("-uw"); @@ -258,40 +244,43 @@ void DiffController::postCollectTextualDiffOutput() } else { args << m_filesList; } - - command->addJob(m_client->vcsBinary(), args, m_client->vcsTimeoutS()); - command->execute(); + runCommand(QList<QStringList>() << args, 0); } -void DiffController::slotTextualDiffOutputReceived(const QString &contents) +void SubversionDiffEditorController::reload() { - bool ok; - QList<FileData> fileDataList - = DiffUtils::readPatch(contents, &ok); - setDiffFiles(fileDataList, m_workingDirectory); - - reloadFinished(true); + if (m_changeNumber) { + requestDescription(); + } else { + requestDiff(); + } } -void DiffController::reload() +void SubversionDiffEditorController::processCommandOutput(const QString &output) { - const QString description = m_changeNumber - ? getDescription() : QString(); - postCollectTextualDiffOutput(); - setDescription(description); + QTC_ASSERT(m_state != Idle, return); + if (m_state == GettingDescription) { + setDescription(output); + + requestDiff(); + } else if (m_state == GettingDiff) { + m_state = Idle; + VcsBaseDiffEditorController::processCommandOutput(output); + } } -DiffController *SubversionClient::findOrCreateDiffEditor(const QString &documentId, +SubversionDiffEditorController *SubversionClient::findOrCreateDiffEditor(const QString &documentId, const QString &source, const QString &title, const QString &workingDirectory) const { IDocument *document = DiffEditorController::findOrCreateDocument(documentId, title); - DiffController *controller = qobject_cast<DiffController *>( + SubversionDiffEditorController *controller = qobject_cast<SubversionDiffEditorController *>( DiffEditorController::controller(document)); if (!controller) - controller = new DiffController(document, this, workingDirectory); + controller = new SubversionDiffEditorController(document, workingDirectory); VcsBasePlugin::setSource(document, source); + EditorManager::activateEditorForDocument(document); return controller; } @@ -304,7 +293,7 @@ void SubversionClient::diff(const QString &workingDirectory, const QStringList & + QLatin1String(".Diff.") + VcsBaseEditor::getTitleId(workingDirectory, files); const QString title = vcsEditorTitle(vcsCmdString, documentId); - DiffController *controller = findOrCreateDiffEditor(documentId, workingDirectory, title, + SubversionDiffEditorController *controller = findOrCreateDiffEditor(documentId, workingDirectory, title, workingDirectory); controller->setFilesList(files); controller->requestReload(); @@ -335,7 +324,7 @@ void SubversionClient::describe(const QString &workingDirectory, int changeNumbe QStringList(), QString::number(changeNumber)); - DiffController *controller = findOrCreateDiffEditor(documentId, workingDirectory, title, workingDirectory); + SubversionDiffEditorController *controller = findOrCreateDiffEditor(documentId, workingDirectory, title, workingDirectory); controller->setChangeNumber(changeNumber); controller->requestReload(); } diff --git a/src/plugins/subversion/subversionclient.h b/src/plugins/subversion/subversionclient.h index 7cc287f210..b3ed32c2c2 100644 --- a/src/plugins/subversion/subversionclient.h +++ b/src/plugins/subversion/subversionclient.h @@ -35,7 +35,7 @@ namespace Subversion { namespace Internal { class SubversionSettings; -class DiffController; +class SubversionDiffEditorController; class SubversionClient : public VcsBase::VcsBaseClient { @@ -78,7 +78,7 @@ protected: Core::Id vcsEditorKind(VcsCommandTag cmd) const override; private: - DiffController *findOrCreateDiffEditor(const QString &documentId, const QString &source, + SubversionDiffEditorController *findOrCreateDiffEditor(const QString &documentId, const QString &source, const QString &title, const QString &workingDirectory) const; mutable Utils::FileName m_svnVersionBinary; |