summaryrefslogtreecommitdiff
path: root/src/plugins/diffeditor/diffutils.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2017-06-30 16:06:36 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2017-07-05 14:20:16 +0000
commit6509753e8684c17f8e05e5e157cbd1f310086292 (patch)
tree4a6306d3df9fe6dfdf1089616d74c1b439ed6f0b /src/plugins/diffeditor/diffutils.cpp
parent4bea049c457470cf678cdf5ec6d36bc78145af84 (diff)
downloadqt-creator-6509753e8684c17f8e05e5e157cbd1f310086292.tar.gz
Make it possible to cancel async diff calculation
Change-Id: I38fe86159daab794d060860de6ee5ab30fb395eb Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
Diffstat (limited to 'src/plugins/diffeditor/diffutils.cpp')
-rw-r--r--src/plugins/diffeditor/diffutils.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp
index 8793132916..5b8ca9d674 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 <QFutureInterfaceBase>
#include <QRegularExpression>
#include <QStringList>
#include <QTextStream>
-#include "texteditor/fontsettings.h"
namespace DiffEditor {
@@ -808,7 +811,8 @@ static FileData readDiffHeaderAndChunks(QStringRef headerAndChunks,
}
static QList<FileData> 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<FileData> readDiffPatch(QStringRef patch,
readOk = true;
int lastPos = -1;
do {
+ if (jobController && jobController->isCanceled())
+ return QList<FileData>();
+
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<FileData> readGitPatch(QStringRef patch, bool *ok)
+static QList<FileData> readGitPatch(QStringRef patch, bool *ok,
+ QFutureInterfaceBase *jobController)
{
const QRegularExpression simpleGitRegExp(
@@ -1127,6 +1135,9 @@ static QList<FileData> readGitPatch(QStringRef patch, bool *ok)
};
do {
+ if (jobController && jobController->isCanceled())
+ return QList<FileData>();
+
collectFileData();
if (!readOk)
break;
@@ -1168,12 +1179,17 @@ static QList<FileData> readGitPatch(QStringRef patch, bool *ok)
return fileDataList;
}
-QList<FileData> DiffUtils::readPatch(const QString &patch, bool *ok)
+QList<FileData> DiffUtils::readPatch(const QString &patch, bool *ok,
+ QFutureInterfaceBase *jobController)
{
bool readOk = false;
QList<FileData> 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<FileData> 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;