summaryrefslogtreecommitdiff
path: root/src/plugins/diffeditor/diffutils.cpp
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2023-02-11 23:21:58 +0100
committerJarek Kobus <jaroslaw.kobus@qt.io>2023-03-09 11:53:18 +0000
commit5ff073df19b872b8db601f31e1124c6048a89a3c (patch)
treeb3f1dec556a5e99a266b8829d559955bad8995e5 /src/plugins/diffeditor/diffutils.cpp
parenta8214665fe45f61668df380f045150258487a55a (diff)
downloadqt-creator-5ff073df19b872b8db601f31e1124c6048a89a3c.tar.gz
DiffEditor: Use QtConcurrent invocation for async tasks
Change-Id: I06640837ffee830e60e8dd2a566f9388f8444010 Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Diffstat (limited to 'src/plugins/diffeditor/diffutils.cpp')
-rw-r--r--src/plugins/diffeditor/diffutils.cpp99
1 files changed, 35 insertions, 64 deletions
diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp
index f9d7d6b264..efea3530a4 100644
--- a/src/plugins/diffeditor/diffutils.cpp
+++ b/src/plugins/diffeditor/diffutils.cpp
@@ -6,7 +6,8 @@
#include <utils/algorithm.h>
#include <utils/differ.h>
-#include <QFutureInterfaceBase>
+#include <QFuture>
+#include <QPromise>
#include <QRegularExpression>
#include <QStringList>
#include <QTextStream>
@@ -892,7 +893,7 @@ static FileData readDiffHeaderAndChunks(QStringView headerAndChunks, bool *ok)
}
-static QList<FileData> readDiffPatch(QStringView patch, bool *ok, QFutureInterfaceBase *jobController)
+static void readDiffPatch(QPromise<QList<FileData>> &promise, QStringView patch)
{
const QRegularExpression diffRegExp("(?:\\n|^)" // new line of the beginning of a patch
"(" // either
@@ -911,23 +912,20 @@ static QList<FileData> readDiffPatch(QStringView patch, bool *ok, QFutureInterfa
")"); // end of or
bool readOk = false;
-
QList<FileData> fileDataList;
-
QRegularExpressionMatch diffMatch = diffRegExp.match(patch);
if (diffMatch.hasMatch()) {
readOk = true;
int lastPos = -1;
do {
- if (jobController && jobController->isCanceled())
- return {};
+ if (promise.isCanceled())
+ return;
int pos = diffMatch.capturedStart();
if (lastPos >= 0) {
QStringView headerAndChunks = patch.mid(lastPos, pos - lastPos);
- const FileData fileData = readDiffHeaderAndChunks(headerAndChunks,
- &readOk);
+ const FileData fileData = readDiffHeaderAndChunks(headerAndChunks, &readOk);
if (!readOk)
break;
@@ -942,21 +940,15 @@ static QList<FileData> readDiffPatch(QStringView patch, bool *ok, QFutureInterfa
if (readOk) {
QStringView headerAndChunks = patch.mid(lastPos, patch.size() - lastPos - 1);
- const FileData fileData = readDiffHeaderAndChunks(headerAndChunks,
- &readOk);
+ const FileData fileData = readDiffHeaderAndChunks(headerAndChunks, &readOk);
if (readOk)
fileDataList.append(fileData);
}
}
-
- if (ok)
- *ok = readOk;
-
if (!readOk)
- return {};
-
- return fileDataList;
+ return;
+ promise.addResult(fileDataList);
}
// The git diff patch format (ChangeFile, NewFile, DeleteFile)
@@ -1203,7 +1195,7 @@ static bool detectFileData(QStringView patch, FileData *fileData, QStringView *r
return detectIndexAndBinary(*remainingPatch, fileData, remainingPatch);
}
-static QList<FileData> readGitPatch(QStringView patch, bool *ok, QFutureInterfaceBase *jobController)
+static void readGitPatch(QPromise<QList<FileData>> &promise, QStringView patch)
{
int position = -1;
@@ -1221,13 +1213,12 @@ static QList<FileData> readGitPatch(QStringView patch, bool *ok, QFutureInterfac
};
const QChar newLine('\n');
- bool readOk = true;
QVector<PatchInfo> patches;
const int count = startingPositions.size();
for (int i = 0; i < count; i++) {
- if (jobController && jobController->isCanceled())
- return {};
+ if (promise.isCanceled())
+ return;
const int diffStart = startingPositions.at(i);
const int diffEnd = (i < count - 1)
@@ -1242,32 +1233,21 @@ static QList<FileData> readGitPatch(QStringView patch, bool *ok, QFutureInterfac
FileData fileData;
QStringView remainingFileDiff;
- readOk = detectFileData(fileDiff, &fileData, &remainingFileDiff);
-
- if (!readOk)
- break;
+ if (!detectFileData(fileDiff, &fileData, &remainingFileDiff))
+ return;
patches.append(PatchInfo { remainingFileDiff, fileData });
}
- if (!readOk) {
- if (ok)
- *ok = readOk;
- return {};
- }
-
- if (jobController)
- jobController->setProgressRange(0, patches.size());
+ promise.setProgressRange(0, patches.size());
QList<FileData> fileDataList;
- readOk = false;
+ bool readOk = false;
int i = 0;
for (const auto &patchInfo : std::as_const(patches)) {
- if (jobController) {
- if (jobController->isCanceled())
- return {};
- jobController->setProgressValue(i++);
- }
+ if (promise.isCanceled())
+ return;
+ promise.setProgressValue(i++);
FileData fileData = patchInfo.fileData;
if (!patchInfo.patch.isEmpty() || fileData.fileOperation == FileData::ChangeFile)
@@ -1276,31 +1256,27 @@ static QList<FileData> readGitPatch(QStringView patch, bool *ok, QFutureInterfac
readOk = true;
if (!readOk)
- break;
+ return;
fileDataList.append(fileData);
}
+ promise.addResult(fileDataList);
+}
- if (ok)
- *ok = readOk;
-
- if (!readOk)
+std::optional<QList<FileData>> DiffUtils::readPatch(const QString &patch)
+{
+ QPromise<QList<FileData>> promise;
+ promise.start();
+ readPatchWithPromise(promise, patch);
+ if (promise.future().resultCount() == 0)
return {};
-
- return fileDataList;
+ return promise.future().result();
}
-QList<FileData> DiffUtils::readPatch(const QString &patch, bool *ok,
- QFutureInterfaceBase *jobController)
+void DiffUtils::readPatchWithPromise(QPromise<QList<FileData>> &promise, const QString &patch)
{
- bool readOk = false;
-
- QList<FileData> fileDataList;
-
- if (jobController) {
- jobController->setProgressRange(0, 1);
- jobController->setProgressValue(0);
- }
+ promise.setProgressRange(0, 1);
+ promise.setProgressValue(0);
QStringView croppedPatch = QStringView(patch);
// Crop e.g. "-- \n2.10.2.windows.1\n\n" at end of file
const QRegularExpression formatPatchEndingRegExp("(\\n-- \\n\\S*\\n\\n$)");
@@ -1308,14 +1284,9 @@ QList<FileData> DiffUtils::readPatch(const QString &patch, bool *ok,
if (match.hasMatch())
croppedPatch = croppedPatch.left(match.capturedStart() + 1);
- fileDataList = readGitPatch(croppedPatch, &readOk, jobController);
- if (!readOk)
- fileDataList = readDiffPatch(croppedPatch, &readOk, jobController);
-
- if (ok)
- *ok = readOk;
-
- return fileDataList;
+ readGitPatch(promise, croppedPatch);
+ if (promise.future().resultCount() == 0)
+ readDiffPatch(promise, croppedPatch);
}
} // namespace DiffEditor