diff options
Diffstat (limited to 'src/sdk/commandlineinterface.cpp')
-rw-r--r-- | src/sdk/commandlineinterface.cpp | 86 |
1 files changed, 69 insertions, 17 deletions
diff --git a/src/sdk/commandlineinterface.cpp b/src/sdk/commandlineinterface.cpp index 69aa36c43..44f028fd5 100644 --- a/src/sdk/commandlineinterface.cpp +++ b/src/sdk/commandlineinterface.cpp @@ -1,6 +1,6 @@ /************************************************************************** ** -** Copyright (C) 2021 The Qt Company Ltd. +** Copyright (C) 2024 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Installer Framework. @@ -63,6 +63,7 @@ bool CommandLineInterface::initialize() return false; } // Filter the arguments list by removing any key=value pair occurrences. + QString command; m_positionalArguments = m_parser.positionalArguments(); foreach (const QString &argument, m_positionalArguments) { if (argument.contains(QLatin1Char('='))) @@ -76,8 +77,16 @@ bool CommandLineInterface::initialize() } else { // Sanity and order of arguments already checked in main(), we should be // quite safe to assume that command is the first positional argument. + command = m_positionalArguments.first(); m_positionalArguments.removeFirst(); } + m_core->saveGivenArguments(QStringList() << command << m_parser.optionNames()); + QString ctrlScript = controlScript(); + if (!ctrlScript.isEmpty()) { + m_core->controlScriptEngine()->loadInContext( + QLatin1String("Controller"), ctrlScript); + qCDebug(QInstaller::lcInstallerInstallLog) << "Loaded control script" << ctrlScript; + } return true; } @@ -89,20 +98,15 @@ int CommandLineInterface::checkUpdates() qCWarning(QInstaller::lcInstallerInstallLog) << "Cannot check updates with installer."; return EXIT_FAILURE; } - m_core->setUpdater(); - if (!m_core->fetchRemotePackagesTree()) { - qCWarning(QInstaller::lcInstallerInstallLog) << m_core->error(); - return EXIT_FAILURE; - } - - const QList<QInstaller::Component *> components = - m_core->components(QInstaller::PackageManagerCore::ComponentType::Root); - if (components.isEmpty()) { - qCWarning(QInstaller::lcInstallerInstallLog) << "There are currently no updates available."; + try { + if (m_core->searchAvailableUpdates() != QInstaller::PackageManagerCore::Success) { + return EXIT_FAILURE; + } return EXIT_SUCCESS; + } catch (const QInstaller::Error &err) { + qCCritical(QInstaller::lcInstallerInstallLog) << err.message(); + return EXIT_FAILURE; } - QInstaller::LoggingHandler::instance().printComponentInfo(components); - return EXIT_SUCCESS; } int CommandLineInterface::listInstalledPackages() @@ -132,7 +136,19 @@ int CommandLineInterface::searchAvailablePackages() QString regexp; if (!m_positionalArguments.isEmpty()) regexp = m_positionalArguments.first(); - m_core->listAvailablePackages(regexp); + + if (m_parser.isSet(CommandLineOptions::scTypeLong)) { + // If type is specified, only list relevant contents + if (m_parser.value(CommandLineOptions::scTypeLong) == QLatin1String("package")) + m_core->listAvailablePackages(regexp, parsePackageFilters()); + else if (m_parser.value(CommandLineOptions::scTypeLong) == QLatin1String("alias")) + m_core->listAvailableAliases(regexp); + } else { + // No type - we can try again with packages search if there were no matching aliases + if (!m_core->listAvailableAliases(regexp)) + m_core->listAvailablePackages(regexp, parsePackageFilters()); + } + return EXIT_SUCCESS; } @@ -241,6 +257,18 @@ int CommandLineInterface::createOfflineInstaller() } } +int CommandLineInterface::clearLocalCache() +{ + if (!initialize()) + return EXIT_FAILURE; + + if (!m_core->clearLocalCache()) + return EXIT_FAILURE; + + qCDebug(QInstaller::lcInstallerInstallLog) << "Cache cleared successfully!"; + return EXIT_SUCCESS; +} + bool CommandLineInterface::checkLicense() { const ProductKeyCheck *const productKeyCheck = ProductKeyCheck::instance(); @@ -257,17 +285,41 @@ bool CommandLineInterface::setTargetDir() if (m_parser.isSet(CommandLineOptions::scRootLong)) { targetDir = m_parser.value(CommandLineOptions::scRootLong); } else { - targetDir = m_core->value(QLatin1String("TargetDir")); + targetDir = m_core->value(QInstaller::scTargetDir); qCDebug(QInstaller::lcInstallerInstallLog) << "No target directory specified, using default value:" << targetDir; } - if (m_core->checkTargetDir(targetDir)) { + if (m_core->installationAllowedToDirectory(targetDir)) { QString targetDirWarning = m_core->targetDirWarning(targetDir); if (!targetDirWarning.isEmpty()) { qCWarning(QInstaller::lcInstallerInstallLog) << m_core->targetDirWarning(targetDir); } else { - m_core->setValue(QLatin1String("TargetDir"), targetDir); + m_core->setValue(QInstaller::scTargetDir, targetDir); return true; } } return false; } + +QHash<QString, QString> CommandLineInterface::parsePackageFilters() +{ + QHash<QString, QString> filterHash; + if (m_parser.isSet(CommandLineOptions::scFilterPackagesLong)) { + const QStringList filterList = m_parser.value(CommandLineOptions::scFilterPackagesLong) + .split(QLatin1Char(',')); + + for (auto &filter : filterList) { + const int i = filter.indexOf(QLatin1Char('=')); + const QString element = filter.left(i).trimmed(); + const QString value = filter.mid(i + 1).trimmed(); + + if ((i == -1) || (filter.count(QLatin1Char('=')) > 1) + || element.isEmpty() || value.isEmpty()) { + qCWarning(QInstaller::lcInstallerInstallLog).nospace() << "Ignoring unknown entry " + << filter << "in package filter arguments. Please use syntax \"element=regex,...\"."; + continue; + } + filterHash.insert(element, value); + } + } + return filterHash; +} |