summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArttu Tarkiainen <arttu.tarkiainen@qt.io>2021-01-28 18:00:20 +0200
committerArttu Tarkiainen <arttu.tarkiainen@qt.io>2021-02-04 14:27:15 +0200
commita7b0eead83379d9343429a37efa8e39f924e8525 (patch)
tree1ede0a98dec8dbd9c3503872990e36c850a4380c
parent8dcc1bb8ceabcd30dd3c73c2f9fa23393f6602a8 (diff)
CLI: Exit when expecting user input and the output device is not a TTY
- For arbitrary text input queries, fail and exit. - For file/directory queries, fail and exit. - For message boxes, default to negative option and exit if necessary. Task-number: QTIFW-1949 Change-Id: Iaf8a07247a0e358d4544a856788e48447c6720d9 Reviewed-by: Katja Marttila <katja.marttila@qt.io>
-rw-r--r--src/libs/installer/loggingutils.cpp5
-rw-r--r--src/libs/installer/messageboxhandler.cpp4
-rw-r--r--src/libs/installer/packagemanagercore.cpp6
-rw-r--r--src/libs/installer/scriptengine.cpp9
4 files changed, 21 insertions, 3 deletions
diff --git a/src/libs/installer/loggingutils.cpp b/src/libs/installer/loggingutils.cpp
index bd3bdbc3d..0ebba10db 100644
--- a/src/libs/installer/loggingutils.cpp
+++ b/src/libs/installer/loggingutils.cpp
@@ -42,7 +42,8 @@
#if defined(Q_OS_UNIX)
#include <unistd.h>
#elif defined(Q_OS_WIN)
-#include <fileapi.h>
+#include <stdio.h>
+#include <io.h>
#endif
namespace QInstaller {
@@ -114,7 +115,7 @@ LoggingHandler::LoggingHandler()
#if defined(Q_OS_UNIX)
m_outputRedirected = !isatty(fileno(stdout));
#elif defined(Q_OS_WIN)
- m_outputRedirected = (GetFileType(GetStdHandle(STD_OUTPUT_HANDLE)) == FILE_TYPE_DISK);
+ m_outputRedirected = !_isatty(_fileno(stdout));
#endif
}
diff --git a/src/libs/installer/messageboxhandler.cpp b/src/libs/installer/messageboxhandler.cpp
index 79630a54a..e2d461ba8 100644
--- a/src/libs/installer/messageboxhandler.cpp
+++ b/src/libs/installer/messageboxhandler.cpp
@@ -29,6 +29,7 @@
#include "messageboxhandler.h"
#include "globals.h"
+#include "loggingutils.h"
#include <QtCore/QDebug>
@@ -420,6 +421,9 @@ QMessageBox::StandardButton MessageBoxHandler::showMessageBox(MessageType messag
if (qobject_cast<QApplication*> (qApp) == nullptr) {
QMessageBox::StandardButton button = defaultButton;
bool showAnswerInLog = true;
+ if (LoggingHandler::instance().outputRedirected() && (m_defaultAction == AskUser))
+ setDefaultAction(Reject);
+
if (m_defaultAction == AskUser) {
if (!availableAnswers.isEmpty()) {
while (!askAnswerFromUser(button, buttons)) {
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp
index 4a0d2c191..ed513fb69 100644
--- a/src/libs/installer/packagemanagercore.cpp
+++ b/src/libs/installer/packagemanagercore.cpp
@@ -971,6 +971,8 @@ QString PackageManagerCore::readFile(const QString &filePath, const QString &cod
* characters. If \a maxlen is 0, the line can be of any length.
*
* \note Can be only called when installing from command line instance without GUI.
+ * If the output device is not a TTY, i.e. when forwarding to a file, the function
+ * will throw an error.
*
* \sa {installer::readConsoleLine}{installer.readConsoleLine}
*/
@@ -978,6 +980,10 @@ QString PackageManagerCore::readConsoleLine(const QString &title, qint64 maxlen)
{
if (!isCommandLineInstance())
return QString();
+ if (LoggingHandler::instance().outputRedirected()) {
+ throw Error(tr("User input is required but the output "
+ "device is not associated with a terminal."));
+ }
if (!title.isEmpty())
qDebug() << title;
QTextStream stream(stdin);
diff --git a/src/libs/installer/scriptengine.cpp b/src/libs/installer/scriptengine.cpp
index ae5bed72c..5dd56939c 100644
--- a/src/libs/installer/scriptengine.cpp
+++ b/src/libs/installer/scriptengine.cpp
@@ -31,6 +31,7 @@
#include "errors.h"
#include "scriptengine_p.h"
#include "systeminfo.h"
+#include "loggingutils.h"
#include <QMetaEnum>
#include <QQmlEngine>
@@ -344,7 +345,7 @@ QString QFileDialogProxy::getExistingFileOrDirectory(const QString &caption,
.arg(identifier, selectedDirectoryOrFile);
selectedDirectoryOrFile = QString();
}
- } else {
+ } else if (!LoggingHandler::instance().outputRedirected()) {
qDebug().nospace().noquote() << identifier << ": " << caption << ": ";
QTextStream stream(stdin);
stream.readLineInto(&selectedDirectoryOrFile);
@@ -358,6 +359,12 @@ QString QFileDialogProxy::getExistingFileOrDirectory(const QString &caption,
.arg(selectedDirectoryOrFile);
selectedDirectoryOrFile = QString();
}
+ } else {
+ qCDebug(QInstaller::lcInstallerInstallLog).nospace()
+ << "No answer available for "<< identifier << ": " << caption;
+
+ throw Error(tr("User input is required but the output "
+ "device is not associated with a terminal."));
}
if (!errorString.isEmpty())
qCWarning(QInstaller::lcInstallerInstallLog).nospace() << errorString;