From 6509753e8684c17f8e05e5e157cbd1f310086292 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Fri, 30 Jun 2017 16:06:36 +0200 Subject: [PATCH] Make it possible to cancel async diff calculation Change-Id: I38fe86159daab794d060860de6ee5ab30fb395eb Reviewed-by: Tobias Hunger --- src/plugins/diffeditor/diffutils.cpp | 28 +++++++++++++++---- src/plugins/diffeditor/diffutils.h | 7 ++++- .../vcsbase/vcsbasediffeditorcontroller.cpp | 8 ++++-- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp index 87931329160..5b8ca9d6743 100644 --- a/src/plugins/diffeditor/diffutils.cpp +++ b/src/plugins/diffeditor/diffutils.cpp @@ -25,10 +25,13 @@ #include "diffutils.h" #include "differ.h" + +#include "texteditor/fontsettings.h" + +#include #include #include #include -#include "texteditor/fontsettings.h" namespace DiffEditor { @@ -808,7 +811,8 @@ static FileData readDiffHeaderAndChunks(QStringRef headerAndChunks, } static QList readDiffPatch(QStringRef patch, - bool *ok) + bool *ok, + QFutureInterfaceBase *jobController) { const QRegularExpression diffRegExp("(?:\\n|^)" // new line of the beginning of a patch "(" // either @@ -835,6 +839,9 @@ static QList readDiffPatch(QStringRef patch, readOk = true; int lastPos = -1; do { + if (jobController && jobController->isCanceled()) + return QList(); + int pos = diffMatch.capturedStart(); if (lastPos >= 0) { QStringRef headerAndChunks = patch.mid(lastPos, @@ -1031,7 +1038,8 @@ static FileData readCopyRenameChunks(QStringRef copyRenameChunks, return fileData; } -static QList readGitPatch(QStringRef patch, bool *ok) +static QList readGitPatch(QStringRef patch, bool *ok, + QFutureInterfaceBase *jobController) { const QRegularExpression simpleGitRegExp( @@ -1127,6 +1135,9 @@ static QList readGitPatch(QStringRef patch, bool *ok) }; do { + if (jobController && jobController->isCanceled()) + return QList(); + collectFileData(); if (!readOk) break; @@ -1168,12 +1179,17 @@ static QList readGitPatch(QStringRef patch, bool *ok) return fileDataList; } -QList DiffUtils::readPatch(const QString &patch, bool *ok) +QList DiffUtils::readPatch(const QString &patch, bool *ok, + QFutureInterfaceBase *jobController) { bool readOk = false; QList fileDataList; + if (jobController) { + jobController->setProgressRange(0, 1); + jobController->setProgressValue(0); + } QStringRef croppedPatch(&patch); // Crop e.g. "-- \n2.10.2.windows.1\n\n" at end of file const QRegularExpression formatPatchEndingRegExp("(\\n-- \\n\\S*\\n\\n$)"); @@ -1181,9 +1197,9 @@ QList DiffUtils::readPatch(const QString &patch, bool *ok) if (match.hasMatch()) croppedPatch = croppedPatch.left(match.capturedStart() + 1); - fileDataList = readGitPatch(croppedPatch, &readOk); + fileDataList = readGitPatch(croppedPatch, &readOk, jobController); if (!readOk) - fileDataList = readDiffPatch(croppedPatch, &readOk); + fileDataList = readDiffPatch(croppedPatch, &readOk, jobController); if (ok) *ok = readOk; diff --git a/src/plugins/diffeditor/diffutils.h b/src/plugins/diffeditor/diffutils.h index d588a52ad8f..46a8bb40b0f 100644 --- a/src/plugins/diffeditor/diffutils.h +++ b/src/plugins/diffeditor/diffutils.h @@ -30,6 +30,10 @@ #include #include +QT_BEGIN_NAMESPACE +class QFutureInterfaceBase; +QT_END_NAMESPACE + namespace TextEditor { class FontSettings; } namespace DiffEditor { @@ -150,7 +154,8 @@ public: static QString makePatch(const QList &fileDataList, unsigned formatFlags = 0); static QList readPatch(const QString &patch, - bool *ok = 0); + bool *ok = 0, + QFutureInterfaceBase *jobController = nullptr); }; } // namespace DiffEditor diff --git a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp index edaeafb4651..b92a35f854f 100644 --- a/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp +++ b/src/plugins/vcsbase/vcsbasediffeditorcontroller.cpp @@ -44,7 +44,7 @@ static void readPatch(QFutureInterface> &futureInterface, const QString &patch) { bool ok; - const QList &fileDataList = DiffUtils::readPatch(patch, &ok); + const QList &fileDataList = DiffUtils::readPatch(patch, &ok, &futureInterface); futureInterface.reportResult(fileDataList); } @@ -88,10 +88,12 @@ VcsBaseDiffEditorControllerPrivate::~VcsBaseDiffEditorControllerPrivate() void VcsBaseDiffEditorControllerPrivate::processingFinished() { - const QList fileDataList = m_processWatcher.future().result(); + bool success = !m_processWatcher.future().isCanceled(); + const QList fileDataList = success + ? m_processWatcher.future().result() : QList(); q->setDiffFiles(fileDataList, q->workingDirectory(), q->startupFile()); - q->reloadFinished(true); + q->reloadFinished(success); } void VcsBaseDiffEditorControllerPrivate::processDiff(const QString &patch)