From f2ab63396c1f101216b2c6ade37528492e464785 Mon Sep 17 00:00:00 2001 From: Arttu Tarkiainen Date: Tue, 9 Jun 2020 10:52:51 +0300 Subject: CLI: Ask user confirmation before performing installer actions Also add new option --confirm-command to skip the interactive query. Task-number: QTIFW-1834 Change-Id: I1c63fd990431c792a523da7047637f54b193bee6 Reviewed-by: Katja Marttila --- src/libs/installer/commandlineparser.cpp | 2 ++ src/libs/installer/constants.h | 1 + src/libs/installer/packagemanagercore.cpp | 13 ++++++++++++ src/libs/installer/packagemanagercore.h | 2 ++ src/libs/installer/packagemanagercore_p.cpp | 31 +++++++++++++++++++++++------ src/libs/installer/packagemanagercore_p.h | 2 ++ 6 files changed, 45 insertions(+), 6 deletions(-) (limited to 'src/libs') diff --git a/src/libs/installer/commandlineparser.cpp b/src/libs/installer/commandlineparser.cpp index 051de2c1f..08aa1b3a9 100644 --- a/src/libs/installer/commandlineparser.cpp +++ b/src/libs/installer/commandlineparser.cpp @@ -172,6 +172,8 @@ CommandLineParser::CommandLineParser() "Several identifier=value pairs can be given separated with comma, " "for example --file-query filedialog.id=C:\Temp,filedialog.id2=C:\Temp2"), QLatin1String("identifier=value"))); + m_parser.addOption(QCommandLineOption(QStringList() << CommandLineOptions::scConfirmCommand, + QLatin1String("[CLI] Confirms starting of installation, update or removal of components without user input."))); // Developer options m_parser.addOption(QCommandLineOption(QStringList() diff --git a/src/libs/installer/constants.h b/src/libs/installer/constants.h index c5d018bf4..27b9c08ee 100644 --- a/src/libs/installer/constants.h +++ b/src/libs/installer/constants.h @@ -160,6 +160,7 @@ static const QLatin1String scMessageAutomaticAnswer("auto-answer"); static const QLatin1String scMessageDefaultAnswer("default-answer"); static const QLatin1String scAcceptLicenses("accept-licenses"); static const QLatin1String scFileDialogAutomaticAnswer("file-query"); +static const QLatin1String scConfirmCommand("confirm-command"); // Misc installation options static const QLatin1String scRootShort("t"); diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 137627ae1..89b9b782c 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -684,6 +684,14 @@ QHash PackageManagerCore::fileDialogAutomaticAnswers() const return m_fileDialogAutomaticAnswers; } +/*! + Set to automatically confirm install, update or remove without asking user. +*/ +void PackageManagerCore::setAutoConfirmCommand() +{ + d->m_autoConfirmCommand = true; +} + /*! Returns the size of the component \a component as \a value. */ @@ -2370,6 +2378,11 @@ bool PackageManagerCore::removeInstallationSilently() if (d->runningProcessesFound()) throw Error(tr("Running processes found.")); + qCDebug(QInstaller::lcInstallerUninstallLog) << "Complete uninstallation was chosen."; + if (!(d->m_autoConfirmCommand || d->askUserConfirmCommand())) { + qCDebug(QInstaller::lcInstallerUninstallLog) << "Uninstallation aborted."; + return false; + } setCompleteUninstallation(true); return run(); } diff --git a/src/libs/installer/packagemanagercore.h b/src/libs/installer/packagemanagercore.h index 5b8f8cc1a..fe044fa27 100644 --- a/src/libs/installer/packagemanagercore.h +++ b/src/libs/installer/packagemanagercore.h @@ -194,6 +194,8 @@ public: Q_INVOKABLE bool containsFileDialogAutomaticAnswer(const QString &identifier) const; QHash fileDialogAutomaticAnswers() const; + void setAutoConfirmCommand(); + quint64 size(QInstaller::Component *component, const QString &value) const; Q_INVOKABLE bool isFileExtensionRegistered(const QString &extension) const; diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index 89be5d907..6b5c4683f 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -222,6 +222,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core) , m_checkAvailableSpace(true) , m_autoAcceptLicenses(false) , m_disableWriteMaintenanceTool(false) + , m_autoConfirmCommand(false) { } @@ -259,6 +260,7 @@ PackageManagerCorePrivate::PackageManagerCorePrivate(PackageManagerCore *core, q , m_checkAvailableSpace(true) , m_autoAcceptLicenses(false) , m_disableWriteMaintenanceTool(false) + , m_autoConfirmCommand(false) { foreach (const OperationBlob &operation, performedOperations) { QScopedPointer op(KDUpdater::UpdateOperationFactory::instance() @@ -2548,7 +2550,9 @@ bool PackageManagerCorePrivate::calculateComponentsAndRun() qCDebug(QInstaller::lcInstallerInstallLog) << "Installation canceled."; } else if (componentsOk && acceptLicenseAgreements()) { qCDebug(QInstaller::lcInstallerInstallLog).noquote() << htmlToString(htmlOutput); - if (m_core->run()) { + if (!(m_autoConfirmCommand || askUserConfirmCommand())) { + qCDebug(QInstaller::lcInstallerInstallLog) << "Installation aborted."; + } else if (m_core->run()) { // Write maintenance tool if required m_core->writeMaintenanceTool(); return true; @@ -2592,11 +2596,7 @@ bool PackageManagerCorePrivate::askUserAcceptLicense(const QString &name, const "before continuing with the installation:" << name; forever { - qCDebug(QInstaller::lcInstallerInstallLog) << "Accept|Reject|Show"; - - QTextStream stream(stdin); - QString input; - stream.readLineInto(&input); + const QString input = m_core->readConsoleLine(QLatin1String("Accept|Reject|Show")); if (QString::compare(input, QLatin1String("Accept"), Qt::CaseInsensitive) == 0 || QString::compare(input, QLatin1String("A"), Qt::CaseInsensitive) == 0) { @@ -2658,4 +2658,23 @@ void PackageManagerCorePrivate::printLocalPackageInformation(const KDUpdater::Lo qCDebug(QInstaller::lcPackageUpdateDate).noquote() << "\tLast updated:" << package.lastUpdateDate; } +bool PackageManagerCorePrivate::askUserConfirmCommand() const +{ + qCDebug(QInstaller::lcInstallerInstallLog) << "Do you want to continue?"; + + forever { + const QString input = m_core->readConsoleLine(QLatin1String("Yes|No")); + + if (QString::compare(input, QLatin1String("Yes"), Qt::CaseInsensitive) == 0 + || QString::compare(input, QLatin1String("Y"), Qt::CaseInsensitive) == 0) { + return true; + } else if (QString::compare(input, QLatin1String("No"), Qt::CaseInsensitive) == 0 + || QString::compare(input, QLatin1String("N"), Qt::CaseInsensitive) == 0) { + return false; + } else { + qCDebug(QInstaller::lcInstallerInstallLog) << "Unknown answer:" << input; + } + } +} + } // namespace QInstaller diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h index f78b52083..df7a887f2 100644 --- a/src/libs/installer/packagemanagercore_p.h +++ b/src/libs/installer/packagemanagercore_p.h @@ -210,6 +210,7 @@ public: QStringList m_allowedRunningProcesses; bool m_autoAcceptLicenses; bool m_disableWriteMaintenanceTool; + bool m_autoConfirmCommand; private slots: void infoMessage(Job *, const QString &message) { @@ -249,6 +250,7 @@ private: bool calculateComponentsAndRun(); bool acceptLicenseAgreements() const; bool askUserAcceptLicense(const QString &name, const QString &content) const; + bool askUserConfirmCommand() const; void printPackageInformation(const QString &name, const Package *update); void printLocalPackageInformation(const KDUpdater::LocalPackage package) const; -- cgit v1.2.3