From 5ee880ce5e6998170823e6fc9afb6b6c36c6170a Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 16 Jun 2022 15:13:07 +0200 Subject: [PATCH] Utils: Add a few convenience functions to work with process output Change-Id: I45acea77ccfdc15b1be9693c1658890865383c16 Reviewed-by: Jarek Kobus --- src/libs/utils/qtcprocess.cpp | 42 ++++++++++++++++++++++++++++++----- src/libs/utils/qtcprocess.h | 12 +++++++--- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/libs/utils/qtcprocess.cpp b/src/libs/utils/qtcprocess.cpp index fdf013a5665..925038086f4 100644 --- a/src/libs/utils/qtcprocess.cpp +++ b/src/libs/utils/qtcprocess.cpp @@ -1361,7 +1361,7 @@ bool QtcProcess::readDataFromProcess(int timeoutS, QString QtcProcess::normalizeNewlines(const QString &text) { QString res = text; - const auto newEnd = std::unique(res.begin(), res.end(), [](const QChar &c1, const QChar &c2) { + const auto newEnd = std::unique(res.begin(), res.end(), [](const QChar c1, const QChar c2) { return c1 == '\r' && c2 == '\r'; // QTCREATORBUG-24556 }); res.chop(std::distance(newEnd, res.end())); @@ -1704,10 +1704,16 @@ QString QtcProcess::allOutput() const return !out.isEmpty() ? out : err; } +QByteArray QtcProcess::rawStdOut() const +{ + QTC_CHECK(d->m_stdOut.keepRawData); + return d->m_stdOut.rawData; +} + QString QtcProcess::stdOut() const { QTC_CHECK(d->m_stdOut.keepRawData); - return normalizeNewlines(d->m_codec->toUnicode(d->m_stdOut.rawData)); + return d->m_codec->toUnicode(d->m_stdOut.rawData); } QString QtcProcess::stdErr() const @@ -1717,13 +1723,37 @@ QString QtcProcess::stdErr() const // is not trivial. So weaken it a bit for now. //QTC_CHECK(d->m_stdErr.keepRawData); QTC_CHECK(d->m_stdErr.keepRawData || d->m_stdErr.rawData.isEmpty()); - return normalizeNewlines(d->m_codec->toUnicode(d->m_stdErr.rawData)); + return d->m_codec->toUnicode(d->m_stdErr.rawData); } -QByteArray QtcProcess::rawStdOut() const +QString QtcProcess::cleanedStdOut() const { - QTC_CHECK(d->m_stdOut.keepRawData); - return d->m_stdOut.rawData; + return normalizeNewlines(stdOut()); +} + +QString QtcProcess::cleanedStdErr() const +{ + return normalizeNewlines(stdErr()); +} + +static QStringList splitLines(const QString &text) +{ + QStringList result = text.split('\n'); + for (QString &line : result) { + if (line.endsWith('\r')) + line.chop(1); + } + return result; +} + +const QStringList QtcProcess::stdOutLines() const +{ + return splitLines(stdOut()); +} + +const QStringList QtcProcess::stdErrLines() const +{ + return splitLines(stdErr()); } QTCREATOR_UTILS_EXPORT QDebug operator<<(QDebug str, const QtcProcess &r) diff --git a/src/libs/utils/qtcprocess.h b/src/libs/utils/qtcprocess.h index 1c793451838..42c981a3431 100644 --- a/src/libs/utils/qtcprocess.h +++ b/src/libs/utils/qtcprocess.h @@ -184,11 +184,17 @@ public: QByteArray allRawOutput() const; QString allOutput() const; - QString stdOut() const; - QString stdErr() const; - QByteArray rawStdOut() const; + QString stdOut() const; // possibly with CR + QString stdErr() const; // possibly with CR + + QString cleanedStdOut() const; // with CR removed + QString cleanedStdErr() const; // with CR removed + + const QStringList stdOutLines() const; // split, CR removed + const QStringList stdErrLines() const; // split, CR removed + QString exitMessage() const; QString toStandaloneCommandLine() const;