diff options
author | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2021-01-28 18:00:20 +0200 |
---|---|---|
committer | Arttu Tarkiainen <arttu.tarkiainen@qt.io> | 2021-02-04 14:27:15 +0200 |
commit | a7b0eead83379d9343429a37efa8e39f924e8525 (patch) | |
tree | 1ede0a98dec8dbd9c3503872990e36c850a4380c | |
parent | 8dcc1bb8ceabcd30dd3c73c2f9fa23393f6602a8 (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.cpp | 5 | ||||
-rw-r--r-- | src/libs/installer/messageboxhandler.cpp | 4 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 6 | ||||
-rw-r--r-- | src/libs/installer/scriptengine.cpp | 9 |
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; |