List available packages from command line

Available packages can be listed from command line with
--listPackages <regexp>. All packages can be listed with --listPackages
. . By default package id, name and version are listed in output. In
case you want to see all the packet information use logging category
--logging-rules ifw.package.*=true. See --help for more detailed
information on how to use logging category.

Change-Id: Ic0815d2274643e3fb3f0670ed9036fe765805c0e
Reviewed-by: Iikka Eklund <iikka.eklund@qt.io>
This commit is contained in:
Katja Marttila 2019-05-29 14:04:57 +03:00
parent 3bd4e7d632
commit 48a43de0be
12 changed files with 175 additions and 13 deletions

View File

@ -34,6 +34,28 @@ const char IFW_RESOURCES[] = "ifw.resources";
const char IFW_TRANSLATIONS[] = "ifw.translations";
const char IFW_NETWORK[] = "ifw.network";
const char IFW_PACKAGE_DISPLAYNAME[] = "ifw.package.displayname";
const char IFW_PACKAGE_DESCRIPTION[] = "ifw.package.description";
const char IFW_PACKAGE_VERSION[] = "ifw.package.version";
const char IFW_PACKAGE_INSTALLEDVERSION[] = "ifw.package.installedversion";
const char IFW_PACKAGE_RELEASEDATE[] = "ifw.package.releasedate";
const char IFW_PACKAGE_NAME[] = "ifw.package.name";
const char IFW_PACKAGE_DEPENDENCIES[] = "ifw.package.dependencies";
const char IFW_PACKAGE_AUTODEPENDON[] = "ifw.package.autodependon";
const char IFW_PACKAGE_VIRTUAL[] = "ifw.package.virtual";
const char IFW_PACKAGE_SORTINGPRIORITY[] = "ifw.package.sortingpriority";
const char IFW_PACKAGE_SCRIPT[] = "ifw.package.script";
const char IFW_PACKAGE_DEFAULT[] = "ifw.package.default";
const char IFW_PACKAGE_ESSETIAL[] = "ifw.package.essential";
const char IFW_PACKAGE_FORCEDINSTALLATION[] = "ifw.package.forcedinstallation";
const char IFW_PACKAGE_REPLACES[] = "ifw.package.replaces";
const char IFW_PACKAGE_DOWNLOADABLEARCHIVES[] = "ifw.package.downloadablearchives";
const char IFW_PACKAGE_REQUIRESADMINRIGHTS[] = "ifw.package.requiresadminrights";
const char IFW_PACKAGE_CHECKABLE[] = "ifw.package.checkable";
const char IFW_PACKAGE_LICENSES[] = "ifw.package.licenses";
const char IFW_PACKAGE_COMPRESSEDSIZE[] = "ifw.package.compressedsize";
const char IFW_PACKAGE_UNCOMPRESSEDSIZE[] = "ifw.package.uncompressedsize";
namespace QInstaller
{
@ -42,14 +64,59 @@ Q_LOGGING_CATEGORY(lcResources, IFW_RESOURCES)
Q_LOGGING_CATEGORY(lcTranslations, IFW_TRANSLATIONS)
Q_LOGGING_CATEGORY(lcNetwork, IFW_NETWORK)
Q_LOGGING_CATEGORY(lcPackageDisplayname, IFW_PACKAGE_DISPLAYNAME);
Q_LOGGING_CATEGORY(lcPackageDescription, IFW_PACKAGE_DESCRIPTION)
Q_LOGGING_CATEGORY(lcPackageVersion, IFW_PACKAGE_VERSION)
Q_LOGGING_CATEGORY(lcPackageInstalledVersion, IFW_PACKAGE_INSTALLEDVERSION)
Q_LOGGING_CATEGORY(lcPackageReleasedate, IFW_PACKAGE_RELEASEDATE)
Q_LOGGING_CATEGORY(lcPackageName, IFW_PACKAGE_NAME)
Q_LOGGING_CATEGORY(lcPackageDependencies, IFW_PACKAGE_DEPENDENCIES)
Q_LOGGING_CATEGORY(lcPackageAutodependon, IFW_PACKAGE_AUTODEPENDON)
Q_LOGGING_CATEGORY(lcPackageVirtual, IFW_PACKAGE_VIRTUAL)
Q_LOGGING_CATEGORY(lcPackageSortingpriority, IFW_PACKAGE_SORTINGPRIORITY)
Q_LOGGING_CATEGORY(lcPackageScript, IFW_PACKAGE_SCRIPT)
Q_LOGGING_CATEGORY(lcPackageDefault, IFW_PACKAGE_DEFAULT)
Q_LOGGING_CATEGORY(lcPackageEssential, IFW_PACKAGE_ESSETIAL)
Q_LOGGING_CATEGORY(lcPackageForcedinstallation, IFW_PACKAGE_FORCEDINSTALLATION)
Q_LOGGING_CATEGORY(lcPackageReplaces, IFW_PACKAGE_REPLACES)
Q_LOGGING_CATEGORY(lcPackageDownloadableArchives, IFW_PACKAGE_DOWNLOADABLEARCHIVES)
Q_LOGGING_CATEGORY(lcPackageRequiresAdminRights, IFW_PACKAGE_REQUIRESADMINRIGHTS)
Q_LOGGING_CATEGORY(lcPackageCheckable, IFW_PACKAGE_CHECKABLE)
Q_LOGGING_CATEGORY(lcPackageLicenses, IFW_PACKAGE_LICENSES)
Q_LOGGING_CATEGORY(lcPackageUncompressedSize, IFW_PACKAGE_UNCOMPRESSEDSIZE)
Q_LOGGING_CATEGORY(lcPackageCompressedSize, IFW_PACKAGE_COMPRESSEDSIZE)
QStringList loggingCategories()
{
static QStringList categories = QStringList()
<< QLatin1String(IFW_COMPONENT_CHECKER)
<< QLatin1String(IFW_RESOURCES)
<< QLatin1String(IFW_TRANSLATIONS)
<< QLatin1String(IFW_NETWORK);
<< QLatin1String(IFW_NETWORK)
<< QLatin1String(IFW_PACKAGE_DISPLAYNAME)
<< QLatin1String(IFW_PACKAGE_DESCRIPTION)
<< QLatin1String(IFW_PACKAGE_VERSION)
<< QLatin1String(IFW_PACKAGE_INSTALLEDVERSION)
<< QLatin1String(IFW_PACKAGE_RELEASEDATE)
<< QLatin1String(IFW_PACKAGE_NAME)
<< QLatin1String(IFW_PACKAGE_DEPENDENCIES)
<< QLatin1String(IFW_PACKAGE_AUTODEPENDON)
<< QLatin1String(IFW_PACKAGE_VIRTUAL)
<< QLatin1String(IFW_PACKAGE_SORTINGPRIORITY)
<< QLatin1String(IFW_PACKAGE_SCRIPT)
<< QLatin1String(IFW_PACKAGE_DEFAULT)
<< QLatin1String(IFW_PACKAGE_ESSETIAL)
<< QLatin1String(IFW_PACKAGE_FORCEDINSTALLATION)
<< QLatin1String(IFW_PACKAGE_REPLACES)
<< QLatin1String(IFW_PACKAGE_DOWNLOADABLEARCHIVES)
<< QLatin1String(IFW_PACKAGE_REQUIRESADMINRIGHTS)
<< QLatin1String(IFW_PACKAGE_CHECKABLE)
<< QLatin1String(IFW_PACKAGE_LICENSES)
<< QLatin1String(IFW_PACKAGE_UNCOMPRESSEDSIZE)
<< QLatin1String(IFW_PACKAGE_COMPRESSEDSIZE);
return categories;
}
Q_GLOBAL_STATIC_WITH_ARGS(QRegExp, staticCommaRegExp, (QLatin1String("(, |,)")));

View File

@ -40,6 +40,29 @@ INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcResources)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcTranslations)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcNetwork)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageDisplayname)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageDescription)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageVersion)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageInstalledVersion)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageReleasedate)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageName)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageDependencies)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageAutodependon)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageVirtual)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageSortingpriority)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageScript)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageDefault)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageEssential)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageForcedinstallation)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageReplaces)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageDownloadableArchives)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageRequiresAdminRights)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageCheckable)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageLicenses)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageUncompressedSize)
INSTALLER_EXPORT Q_DECLARE_LOGGING_CATEGORY(lcPackageCompressedSize)
QStringList INSTALLER_EXPORT loggingCategories();
QRegExp INSTALLER_EXPORT commaRegExp();

View File

@ -54,7 +54,7 @@ static QUrl resolveUrl(const FileTaskResult &result, const QString &url)
MetadataJob::MetadataJob(QObject *parent)
: Job(parent)
, m_core(nullptr)
, m_addCompressedPackages(false)
, m_downloadType(DownloadType::All)
, m_downloadableChunkSize(1000)
, m_taskNumber(0)
{
@ -109,7 +109,7 @@ void MetadataJob::doStart()
return; // We can't do anything here without core, so avoid tons of !m_core checks.
}
const ProductKeyCheck *const productKeyCheck = ProductKeyCheck::instance();
if (!m_addCompressedPackages) {
if (m_downloadType == DownloadType::All || m_downloadType == DownloadType::UpdatesXML) {
emit infoMessage(this, tr("Preparing meta information download..."));
const bool onlineInstaller = m_core->isInstaller() && !m_core->isOfflineOnly();
if (onlineInstaller || m_core->isMaintainer()) {
@ -364,7 +364,10 @@ void MetadataJob::xmlTaskFinished()
return;
if (status == XmlDownloadSuccess) {
if (!fetchMetaDataPackages()) {
if (m_downloadType != DownloadType::UpdatesXML) {
if (!fetchMetaDataPackages())
emitFinished();
} else {
emitFinished();
}
} else if (status == XmlDownloadRetry) {

View File

@ -52,6 +52,13 @@ struct ArchiveMetadata
Metadata metaData;
};
enum DownloadType
{
All,
CompressedPackage,
UpdatesXML
};
class INSTALLER_EXPORT MetadataJob : public Job
{
Q_OBJECT
@ -70,7 +77,7 @@ public:
QList<Metadata> metadata() const;
Repository repositoryForDirectory(const QString &directory) const;
void setPackageManagerCore(PackageManagerCore *core) { m_core = core; }
void addCompressedPackages(bool addCompressPackage) { m_addCompressedPackages = addCompressPackage;}
void addDownloadType(DownloadType downloadType) { m_downloadType = downloadType;}
QStringList shaMismatchPackages() const { return m_shaMissmatchPackages; }
private slots:
@ -102,7 +109,7 @@ private:
QFutureWatcher<FileTaskResult> m_metadataTask;
QHash<QFutureWatcher<void> *, QObject*> m_unzipTasks;
QHash<QFutureWatcher<void> *, QObject*> m_unzipRepositoryTasks;
bool m_addCompressedPackages;
DownloadType m_downloadType;
QList<FileTaskItem> m_unzipRepositoryitems;
QList<FileTaskResult> m_metadataResult;
int m_downloadableChunkSize;

View File

@ -64,6 +64,7 @@
#include <QDesktopServices>
#include <QFileDialog>
#include <QRegularExpression>
#include "sysinfo.h"
#include "updateoperationfactory.h"
@ -1824,6 +1825,50 @@ ComponentModel *PackageManagerCore::updaterComponentModel() const
return d->m_updaterModel;
}
void PackageManagerCore::listAvailablePackages(const QString &regexp)
{
d->fetchMetaInformationFromRepositories(DownloadType::UpdatesXML);
d->addUpdateResourcesFromRepositories(true);
QRegularExpression re(regexp);
const PackagesList &packages = d->remotePackages();
foreach (const Package *update, packages) {
const QString name = update->data(scName).toString();
if (re.match(name).hasMatch()) {
printPackageInformation(name, update);
}
}
}
void PackageManagerCore::printPackageInformation(const QString &name, const Package *update)
{
qCDebug(QInstaller::lcPackageName) << "Id:" << name;
qCDebug(QInstaller::lcPackageDisplayname) << "\tDisplay name:" << update->data(scDisplayName).toString();
qCDebug(QInstaller::lcPackageVersion) << "\tVersion:" << update->data(scVersion).toString();
qCDebug(QInstaller::lcPackageDescription) << "\tDescription: " << update->data(scDescription).toString();
qCDebug(QInstaller::lcPackageReleasedate) << "\tRelease date: " << update->data(scReleaseDate).toString();
qCDebug(QInstaller::lcPackageDependencies) << "\tDependencies: " << update->data(scDependencies).toString();
qCDebug(QInstaller::lcPackageAutodependon) << "\tAutodependon: " << update->data(scAutoDependOn).toString();
qCDebug(QInstaller::lcPackageVirtual) << "\tVirtual: " << update->data(scVirtual, false).toString();
qCDebug(QInstaller::lcPackageSortingpriority) << "\tSorting priority: " << update->data(scSortingPriority).toString();
qCDebug(QInstaller::lcPackageScript) << "\tScript: " << update->data(scScript).toString();
qCDebug(QInstaller::lcPackageDefault) << "\tDefault: "<< update->data(scDefault, false).toString();
qCDebug(QInstaller::lcPackageEssential) << "\tEssential: " << update->data(scEssential, false).toString();
qCDebug(QInstaller::lcPackageForcedinstallation) << "\tForced installation: " << update->data(QLatin1String("ForcedInstallation"), false).toString();
qCDebug(QInstaller::lcPackageReplaces) << "\tReplaces: " << update->data(scReplaces).toString();
qCDebug(QInstaller::lcPackageDownloadableArchives) << "\tDownloadable archives: " << update->data(scDownloadableArchives).toString();
qCDebug(QInstaller::lcPackageRequiresAdminRights) << "\tRequires admin rights: " << update->data(scRequiresAdminRights).toString();
qCDebug(QInstaller::lcPackageCheckable) << "\tCheckable: " << update->data(scCheckable).toString();
qCDebug(QInstaller::lcPackageLicenses) << "\tLicenses: " << update->data(QLatin1String("Licenses")).toString();
qCDebug(QInstaller::lcPackageCompressedSize) << "\tCompressed size: " << update->data(QLatin1String("CompressedSize")).toString();
qCDebug(QInstaller::lcPackageUncompressedSize) << "\tUncompressed size: " << update->data(QLatin1String("UncompressedSize")).toString();
//Check if package already installed
LocalPackagesHash installedPackages = this->localInstalledPackages();
if (installedPackages.contains(name))
qCDebug(QInstaller::lcPackageInstalledVersion) << "\tInstalled version: " << installedPackages.value(name).version;
}
void PackageManagerCore::listInstalledPackages()
{
LocalPackagesHash installedPackages = this->localInstalledPackages();

View File

@ -227,6 +227,7 @@ public:
ComponentModel *defaultComponentModel() const;
ComponentModel *updaterComponentModel() const;
void listInstalledPackages();
void listAvailablePackages(const QString &regexp);
void updateComponentsSilently();
// convenience
@ -361,6 +362,7 @@ private:
QList<Component *> componentsMarkedForInstallation() const;
bool fetchPackagesTree(const PackagesList &packages, const LocalPackagesHash installedPackages);
void printPackageInformation(const QString &name, const Package *update);
private:
PackageManagerCorePrivate *const d;

View File

@ -2255,14 +2255,14 @@ LocalPackagesHash PackageManagerCorePrivate::localInstalledPackages()
return installedPackages;
}
bool PackageManagerCorePrivate::fetchMetaInformationFromRepositories()
bool PackageManagerCorePrivate::fetchMetaInformationFromRepositories(DownloadType type)
{
m_updates = false;
m_repoFetched = false;
m_updateSourcesAdded = false;
try {
m_metadataJob.addCompressedPackages(false);
m_metadataJob.addDownloadType(type);
m_metadataJob.start();
m_metadataJob.waitForFinished();
} catch (Error &error) {
@ -2296,10 +2296,9 @@ bool PackageManagerCorePrivate::fetchMetaInformationFromCompressedRepositories()
//Tell MetadataJob that only compressed packages needed to be fetched and not all.
//We cannot do this in general fetch meta method as the compressed packages might be
//installed after components tree is generated
m_metadataJob.addCompressedPackages(true);
m_metadataJob.addDownloadType(DownloadType::CompressedPackage);
m_metadataJob.start();
m_metadataJob.waitForFinished();
m_metadataJob.addCompressedPackages(false);
} catch (Error &error) {
setStatus(PackageManagerCore::Failure, tr("Cannot retrieve meta information: %1")
.arg(error.message()));

View File

@ -235,7 +235,7 @@ private:
PackagesList remotePackages();
PackagesList compressedPackages();
LocalPackagesHash localInstalledPackages();
bool fetchMetaInformationFromRepositories();
bool fetchMetaInformationFromRepositories(DownloadType type = DownloadType::All);
bool fetchMetaInformationFromCompressedRepositories();
bool addUpdateResourcesFromRepositories(bool parseChecksum, bool compressedRepository = false);
void processFilesForDelayedDeletion();

View File

@ -120,6 +120,8 @@ CommandLineParser::CommandLineParser()
QLatin1String("Updates all packages silently.")));
m_parser.addOption(QCommandLineOption(QLatin1String(CommandLineOptions::ListInstalledPackages),
QLatin1String("Lists installed packages.")));
m_parser.addOption(QCommandLineOption(QLatin1String(CommandLineOptions::ListPackages),
QLatin1String("Lists available packages."), QLatin1String("regexp")));
m_parser.addOption(QCommandLineOption(QLatin1String(CommandLineOptions::Platform),
QLatin1String("Use the specified platform plugin."), QLatin1String("plugin")));
m_parser.addPositionalArgument(QLatin1String(CommandLineOptions::KeyValue),

View File

@ -55,6 +55,7 @@ const char StartClient[] = "startclient";
const char InstallCompressedRepository[] = "installCompressedRepository";
const char SilentUpdate[] = "silentUpdate";
const char ListInstalledPackages[] = "listInstalledPackages";
const char ListPackages[] = "listPackages";
const char Platform[] = "platform";
const char SquishPort[] = "squish-port";

View File

@ -122,11 +122,17 @@ int InstallerBase::run()
QString loggingRules(QLatin1String("ifw.* = false")); // disable all by default
if (QInstaller::isVerbose()) {
loggingRules = QString(); // enable all in verbose mode
if (parser.isSet(QLatin1String(CommandLineOptions::LoggingRules))) {
loggingRules = parser.value(QLatin1String(CommandLineOptions::LoggingRules))
.split(QLatin1Char(','), QString::SkipEmptyParts)
.join(QLatin1Char('\n')); // take rules from command line
} else {
// enable all in verbose mode except detailed package information
loggingRules = QLatin1String("ifw.* = true\n"
"ifw.package.* = false\n"
"ifw.package.name = true\n"
"ifw.package.version = true\n"
"ifw.package.displayname = true\n");
}
}
QLoggingCategory::setFilterRules(loggingRules);
@ -305,6 +311,12 @@ int InstallerBase::run()
checkLicense();
m_core->setPackageManager();
m_core->listInstalledPackages();
} else if (parser.isSet(QLatin1String(CommandLineOptions::ListPackages))){
if (!m_core->isInstaller())
m_core->setPackageManager();
checkLicense();
QString regexp = parser.value(QLatin1String(CommandLineOptions::ListPackages));
m_core->listAvailablePackages(regexp);
} else {
//create the wizard GUI
TabController controller(nullptr);

View File

@ -186,7 +186,8 @@ int main(int argc, char *argv[])
try {
QScopedPointer<Console> console;
if (parser.isSet(QLatin1String(CommandLineOptions::VerboseShort))
|| parser.isSet(QLatin1String(CommandLineOptions::VerboseLong))) {
|| parser.isSet(QLatin1String(CommandLineOptions::VerboseLong))
|| parser.isSet(QLatin1String(CommandLineOptions::ListPackages))) {
console.reset(new Console);
QInstaller::setVerbose(true);
}