From 817a292690ccdea7bae185319beb22ea653db946 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Mon, 26 Aug 2019 12:41:19 +0200 Subject: Process Command: Do not needlessly interpret output as text MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ... when redirecting process output. Only do that if there is an output filter function. Otherwise, we break redirection of binary data. Fixes: QBS-1488 Change-Id: Ic5a1d2653fa8fc9c4f0eb5d31b7315d7aba3e030 Reviewed-by: Jörg Bornemann --- .../corelib/buildgraph/processcommandexecutor.cpp | 4 ++- .../blackbox/testdata/output-redirection/input.bin | Bin 0 -> 1024 bytes .../blackbox/testdata/output-redirection/input.txt | 1 + .../output-redirection/output-redirection.qbs | 38 +++++++++++++++++++++ .../testdata/output-redirection/output.bin | Bin 0 -> 2048 bytes .../testdata/output-redirection/output.txt | 2 ++ tests/auto/blackbox/tst_blackbox.cpp | 8 +++++ tests/auto/blackbox/tst_blackbox.h | 1 + 8 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 tests/auto/blackbox/testdata/output-redirection/input.bin create mode 100644 tests/auto/blackbox/testdata/output-redirection/input.txt create mode 100644 tests/auto/blackbox/testdata/output-redirection/output-redirection.qbs create mode 100644 tests/auto/blackbox/testdata/output-redirection/output.bin create mode 100644 tests/auto/blackbox/testdata/output-redirection/output.txt diff --git a/src/lib/corelib/buildgraph/processcommandexecutor.cpp b/src/lib/corelib/buildgraph/processcommandexecutor.cpp index c34a734b4..c4e4a2be6 100644 --- a/src/lib/corelib/buildgraph/processcommandexecutor.cpp +++ b/src/lib/corelib/buildgraph/processcommandexecutor.cpp @@ -274,7 +274,9 @@ void ProcessCommandExecutor::getProcessOutput(bool stdOut, ProcessResult &result } QString contentString = filterProcessOutput(content, filterFunction); if (!redirectPath.isEmpty()) { - const QProcess::ProcessError error = saveToFile(redirectPath, contentString.toLocal8Bit()); + const QByteArray dataToWrite = filterFunction.isEmpty() ? content + : contentString.toLocal8Bit(); + const QProcess::ProcessError error = saveToFile(redirectPath, dataToWrite); if (result.error() == QProcess::UnknownError && error != QProcess::UnknownError) result.d->error = error; } else { diff --git a/tests/auto/blackbox/testdata/output-redirection/input.bin b/tests/auto/blackbox/testdata/output-redirection/input.bin new file mode 100644 index 000000000..2b231c7a8 Binary files /dev/null and b/tests/auto/blackbox/testdata/output-redirection/input.bin differ diff --git a/tests/auto/blackbox/testdata/output-redirection/input.txt b/tests/auto/blackbox/testdata/output-redirection/input.txt new file mode 100644 index 000000000..0ba7b6bf7 --- /dev/null +++ b/tests/auto/blackbox/testdata/output-redirection/input.txt @@ -0,0 +1 @@ +this is a plain text file diff --git a/tests/auto/blackbox/testdata/output-redirection/output-redirection.qbs b/tests/auto/blackbox/testdata/output-redirection/output-redirection.qbs new file mode 100644 index 000000000..3ee443438 --- /dev/null +++ b/tests/auto/blackbox/testdata/output-redirection/output-redirection.qbs @@ -0,0 +1,38 @@ +import qbs.FileInfo + +Product { + name: "the-product" + type: "output" + Group { + files: "input.bin" + fileTags: "binary" + } + Group { + files: "input.txt" + fileTags: "text" + } + + Rule { + inputs: ["text", "binary"] + Artifact { + filePath: "output." + FileInfo.completeSuffix(input.filePath) + fileTags: "output" + } + prepare: { + var binary; + var prefixArgs; + if (product.qbs.hostOS.contains("windows")) { + binary = product.qbs.windowsShellPath; + prefixArgs = ["/c", "type"]; + } else { + binary = "cat"; + prefixArgs = []; + } + var inputPath = FileInfo.toNativeSeparators(input.filePath); + var cmd = new Command(binary, prefixArgs.concat([inputPath, inputPath])); + cmd.stdoutFilePath = output.filePath; + cmd.highlight = "filegen"; + return cmd; + } + } +} diff --git a/tests/auto/blackbox/testdata/output-redirection/output.bin b/tests/auto/blackbox/testdata/output-redirection/output.bin new file mode 100644 index 000000000..efb4ec03b Binary files /dev/null and b/tests/auto/blackbox/testdata/output-redirection/output.bin differ diff --git a/tests/auto/blackbox/testdata/output-redirection/output.txt b/tests/auto/blackbox/testdata/output-redirection/output.txt new file mode 100644 index 000000000..e309ab1af --- /dev/null +++ b/tests/auto/blackbox/testdata/output-redirection/output.txt @@ -0,0 +1,2 @@ +this is a plain text file +this is a plain text file diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index f87889155..19676d050 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -6263,6 +6263,14 @@ void TestBlackbox::outputArtifactAutoTagging() QVERIFY(regularFileExists(relativeExecutableFilePath("output-artifact-auto-tagging"))); } +void TestBlackbox::outputRedirection() +{ + QDir::setCurrent(testDataDir + "/output-redirection"); + QCOMPARE(runQbs(), 0); + TEXT_FILE_COMPARE("output.txt", relativeProductBuildDir("the-product") + "/output.txt"); + TEXT_FILE_COMPARE("output.bin", relativeProductBuildDir("the-product") + "/output.bin"); +} + void TestBlackbox::wildCardsAndRules() { QDir::setCurrent(testDataDir + "/wildcards-and-rules"); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index 0a14c418c..959858321 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -206,6 +206,7 @@ private slots: void nsisDependencies(); void outOfDateMarking(); void outputArtifactAutoTagging(); + void outputRedirection(); void overrideProjectProperties(); void pathProbe_data(); void pathProbe(); -- cgit v1.2.3