diff options
Diffstat (limited to 'src/libs/installer/packagemanagercore.cpp')
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 135 |
1 files changed, 67 insertions, 68 deletions
diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 85beeb727..b7d7d2a26 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -54,7 +54,6 @@ #include <QtConcurrentRun> #include <QtCore/QMutex> -#include <QtCore/QRegExp> #include <QtCore/QSettings> #include <QtCore/QTemporaryFile> #include <QtCore/QTextCodec> @@ -601,6 +600,18 @@ bool PackageManagerCore::clearLocalCache(QString *error) } /*! + \internal + */ +template <typename T> +bool PackageManagerCore::loadComponentScripts(const T &components, const bool postScript) +{ + return d->loadComponentScripts(components, postScript); +} + +template bool PackageManagerCore::loadComponentScripts<QList<Component *>>(const QList<Component *> &, const bool); +template bool PackageManagerCore::loadComponentScripts<QHash<QString, Component *>>(const QHash<QString, Component *> &, const bool); + +/*! \deprecated [4.5] Use recalculateAllComponents() instead. \sa {installer::componentsToInstallNeedsRecalculation}{installer.componentsToInstallNeedsRecalculation} @@ -799,16 +810,19 @@ int PackageManagerCore::downloadNeededArchives(double partProgressSize) { Q_ASSERT(partProgressSize >= 0 && partProgressSize <= 1); - QList<QPair<QString, QString> > archivesToDownload; + QList<DownloadItem> archivesToDownload; quint64 archivesToDownloadTotalSize = 0; QList<Component*> neededComponents = orderedComponentsToInstall(); foreach (Component *component, neededComponents) { // collect all archives to be downloaded const QStringList toDownload = component->downloadableArchives(); + bool checkSha1CheckSum = (component->value(scCheckSha1CheckSum).toLower() == scTrue); foreach (const QString &versionFreeString, toDownload) { - archivesToDownload.push_back(qMakePair(QString::fromLatin1("installer://%1/%2") - .arg(component->name(), versionFreeString), QString::fromLatin1("%1/%2/%3") - .arg(component->repositoryUrl().toString(), component->name(), versionFreeString))); + DownloadItem item; + item.checkSha1CheckSum = checkSha1CheckSum; + item.fileName = scInstallerPrefixWithTwoArgs.arg(component->name(), versionFreeString); + item.sourceUrl = scThreeArgs.arg(component->repositoryUrl().toString(), component->name(), versionFreeString); + archivesToDownload.push_back(item); } archivesToDownloadTotalSize += component->value(scCompressedSize).toULongLong(); } @@ -987,7 +1001,7 @@ bool PackageManagerCore::isFileExtensionRegistered(const QString &extension) con */ bool PackageManagerCore::fileExists(const QString &filePath) const { - return QFileInfo(filePath).exists(); + return QFileInfo::exists(filePath); } /*! @@ -1254,6 +1268,10 @@ PackageManagerCore::PackageManagerCore() Creates and initializes a remote client. Requests administrator's rights for QFile, QSettings, and QProcess operations. Calls \c init() with \a socketName, \a key, and \a mode to set the server side authorization key. + + The \a datFileName contains the corresponding .dat file name for the running + \c maintenance tool binary. \a datFileName can be empty if \c maintenance tool + fails to find it or if \c installer is run instead of \c maintenance tool. */ PackageManagerCore::PackageManagerCore(qint64 magicmaker, const QList<OperationBlob> &operations, const QString &datFileName, @@ -1290,8 +1308,8 @@ PackageManagerCore::PackageManagerCore(qint64 magicmaker, const QList<OperationB QSet<QString> packagesWithoutOperation = installedPackages - operationPackages; QSet<QString> orphanedOperations = operationPackages - installedPackages; if (!packagesWithoutOperation.isEmpty() || !orphanedOperations.isEmpty()) { - qCritical() << "Operations missing for installed packages" << packagesWithoutOperation.toList(); - qCritical() << "Orphaned operations" << orphanedOperations.toList(); + qCritical() << "Operations missing for installed packages" << packagesWithoutOperation.values(); + qCritical() << "Orphaned operations" << orphanedOperations.values(); qCritical() << "Your installation seems to be corrupted. Please consider re-installing from scratch, " "remove the packages from components.xml which operations are missing, " "or reinstall the packages."; @@ -1634,7 +1652,7 @@ bool PackageManagerCore::fetchCompressedPackagesTree() if (!d->fetchMetaInformationFromRepositories(DownloadType::CompressedPackage)) return false; - if (!d->addUpdateResourcesFromRepositories(true, true)) { + if (!d->addUpdateResourcesFromRepositories(true)) { return false; } @@ -1673,7 +1691,7 @@ bool PackageManagerCore::fetchRemotePackagesTree() if (!d->fetchMetaInformationFromRepositories(DownloadType::CompressedPackage)) return false; - if (!d->addUpdateResourcesFromRepositories(true)) + if (!d->addUpdateResourcesFromRepositories()) return false; const PackagesList &packages = d->remotePackages(); @@ -1928,24 +1946,6 @@ void PackageManagerCore::setTemporaryRepositories(const QStringList &repositorie } /*! - Checks whether the downloader should try to download SHA-1 checksums for - archives and returns the checksums. -*/ -bool PackageManagerCore::testChecksum() const -{ - return d->m_testChecksum; -} - -/*! - The \a test argument determines whether the downloader should try to - download SHA-1 checksums for archives. -*/ -void PackageManagerCore::setTestChecksum(bool test) -{ - d->m_testChecksum = test; -} - -/*! Returns the script engine that prepares and runs the component scripts. \sa {Component Scripting} @@ -2042,7 +2042,7 @@ QList<Component *> PackageManagerCore::components(ComponentTypes mask, const QSt QRegularExpression re(regexp); QList<Component*>::iterator iter = components.begin(); while (iter != components.end()) { - if (!re.match(iter.i->t()->name()).hasMatch()) + if (!re.match((*iter)->name()).hasMatch()) iter = components.erase(iter); else iter++; @@ -2182,7 +2182,7 @@ bool PackageManagerCore::calculateComponentsToInstall() const const QList<Component*> selectedComponentsToInstall = componentsMarkedForInstallation(); const bool componentsToInstallCalculated = - d->installerCalculator()->appendComponentsToInstall(selectedComponentsToInstall); + d->installerCalculator()->solve(selectedComponentsToInstall); d->updateComponentInstallActions(); @@ -2195,7 +2195,7 @@ bool PackageManagerCore::calculateComponentsToInstall() const */ QList<Component*> PackageManagerCore::orderedComponentsToInstall() const { - return d->installerCalculator()->orderedComponentsToInstall(); + return d->installerCalculator()->resolvedComponents(); } /*! @@ -2272,15 +2272,15 @@ bool PackageManagerCore::calculateComponentsToUninstall() const emit aboutCalculateComponentsToUninstall(); d->clearUninstallerCalculator(); - const QList<Component *> componentsToInstallList = d->installerCalculator()->orderedComponentsToInstall(); + const QList<Component *> componentsToInstallList = d->installerCalculator()->resolvedComponents(); QList<Component *> selectedComponentsToUninstall; foreach (Component* component, components(PackageManagerCore::ComponentType::Replacements)) { // Uninstall the component if replacement is selected for install or update QPair<Component*, Component*> comp = d->componentsToReplace().value(component->name()); - if (comp.first && d->m_installerCalculator->orderedComponentsToInstall().contains(comp.first)) { - d->uninstallerCalculator()->insertUninstallReason(component, - UninstallerCalculator::Replaced, comp.first->name()); + if (comp.first && d->m_installerCalculator->resolvedComponents().contains(comp.first)) { + d->uninstallerCalculator()->insertResolution(component, + CalculatorBase::Resolution::Replaced, comp.first->name()); selectedComponentsToUninstall.append(comp.second); } } @@ -2289,7 +2289,7 @@ bool PackageManagerCore::calculateComponentsToUninstall() const selectedComponentsToUninstall.append(component); } const bool componentsToUninstallCalculated = - d->uninstallerCalculator()->appendComponentsToUninstall(selectedComponentsToUninstall); + d->uninstallerCalculator()->solve(selectedComponentsToUninstall); d->updateComponentInstallActions(); @@ -2306,7 +2306,7 @@ bool PackageManagerCore::calculateComponentsToUninstall() const */ QList<Component *> PackageManagerCore::componentsToUninstall() const { - return d->uninstallerCalculator()->componentsToUninstall().toList(); + return d->uninstallerCalculator()->resolvedComponents(); } /*! @@ -2314,7 +2314,7 @@ QList<Component *> PackageManagerCore::componentsToUninstall() const */ QString PackageManagerCore::componentsToInstallError() const { - return d->installerCalculator()->componentsToInstallError(); + return d->installerCalculator()->error(); } /*! @@ -2322,7 +2322,7 @@ QString PackageManagerCore::componentsToInstallError() const */ QString PackageManagerCore::componentsToUninstallError() const { - return d->uninstallerCalculator()->componentsToUninstallError(); + return d->uninstallerCalculator()->error(); } /*! @@ -2336,7 +2336,7 @@ QString PackageManagerCore::componentsToUninstallError() const */ QString PackageManagerCore::installReason(Component *component) const { - return d->installerCalculator()->installReason(component); + return d->installerCalculator()->resolutionText(component); } /*! @@ -2352,7 +2352,7 @@ QString PackageManagerCore::installReason(Component *component) const */ QString PackageManagerCore::uninstallReason(Component *component) const { - return d->uninstallerCalculator()->uninstallReason(component); + return d->uninstallerCalculator()->resolutionText(component); } /*! @@ -2499,7 +2499,7 @@ void PackageManagerCore::listAvailablePackages(const QString ®exp, const QHas ComponentModel *model = defaultComponentModel(); d->fetchMetaInformationFromRepositories(); - d->addUpdateResourcesFromRepositories(true); + d->addUpdateResourcesFromRepositories(); QRegularExpression re(regexp); re.setPatternOptions(QRegularExpression::CaseInsensitiveOption); const PackagesList &packages = d->remotePackages(); @@ -3378,9 +3378,10 @@ bool PackageManagerCore::performOperation(const QString &name, const QStringList */ bool PackageManagerCore::versionMatches(const QString &version, const QString &requirement) { - QRegExp compEx(QLatin1String("([<=>]+)(.*)")); - const QString comparator = compEx.exactMatch(requirement) ? compEx.cap(1) : QLatin1String("="); - const QString ver = compEx.exactMatch(requirement) ? compEx.cap(2) : requirement; + static const QRegularExpression compEx(QLatin1String("^([<=>]+)(.*)$")); + const QRegularExpressionMatch match = compEx.match(requirement); + const QString comparator = match.hasMatch() ? match.captured(1) : QLatin1String("="); + const QString ver = match.hasMatch() ? match.captured(2) : requirement; const bool allowEqual = comparator.contains(QLatin1Char('=')); const bool allowLess = comparator.contains(QLatin1Char('<')); @@ -3980,9 +3981,9 @@ bool PackageManagerCore::updateComponentData(struct Data &data, Component *compo if (settings().allowUnstableComponents()) { // Check if there are sha checksum mismatch. Component will still show in install tree // but is unselectable. - foreach (const QString packageName, d->m_metadataJob.shaMismatchPackages()) { - if (packageName == component->name()) { - const QString errorString = QLatin1String("SHA mismatch detected for component ") + packageName; + foreach (const QString pkgName, d->m_metadataJob.shaMismatchPackages()) { + if (pkgName == component->name()) { + const QString errorString = QLatin1String("SHA mismatch detected for component ") + pkgName; d->m_pendingUnstableComponents.insert(component->name(), QPair<Component::UnstableError, QString>(Component::ShaMismatch, errorString)); } @@ -4006,18 +4007,10 @@ bool PackageManagerCore::updateComponentData(struct Data &data, Component *compo component->setValue(QLatin1String("password"), repo.password()); } - // add downloadable archive from xml - const QStringList downloadableArchives = data.package->data(scDownloadableArchives).toString() - .split(QInstaller::commaRegExp(), Qt::SkipEmptyParts); - - if (component->isFromOnlineRepository()) { - foreach (const QString downloadableArchive, downloadableArchives) - component->addDownloadableArchive(downloadableArchive); - } - - const QStringList componentsToReplace = data.package->data(scReplaces).toString() - .split(QInstaller::commaRegExp(), Qt::SkipEmptyParts); + if (component->isFromOnlineRepository()) + component->addDownloadableArchives(data.package->data(scDownloadableArchives).toString()); + const QStringList componentsToReplace = QInstaller::splitStringWithComma(data.package->data(scReplaces).toString()); if (!componentsToReplace.isEmpty()) { // Store the component (this is a component that replaces others) and all components that // this one will replace. @@ -4354,7 +4347,8 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const } // store all components that got a replacement, but do not modify the components list - storeReplacedComponents(localReplaceMes.unite(components), data); + localReplaceMes.insert(components); + storeReplacedComponents(localReplaceMes, data); if (!components.isEmpty()) { // append all components w/o parent to the direct list @@ -4443,14 +4437,19 @@ void PackageManagerCore::createAutoTreeNames(QHash<QString, Component *> &compon if (treeNameComponents.isEmpty()) return; - QHash<QString, Component *> componentsTemp = components; - for (auto *component : qAsConst(components)) { + QHash<QString, Component *> componentsTemp; + QMutableHashIterator<QString, Component* > i(components); + while (i.hasNext()) { + i.next(); + Component *component = i.value(); if (component->treeName() != component->name()) // already handled continue; QString newName; // Check treename candidates, keep the name closest to a leaf component - for (auto &name : treeNameComponents.keys()) { + QMap<QString, QString>::const_iterator j; + for (j = treeNameComponents.begin(); j != treeNameComponents.end(); ++j) { + const QString name = j.key(); if (!component->name().startsWith(name)) continue; @@ -4458,8 +4457,8 @@ void PackageManagerCore::createAutoTreeNames(QHash<QString, Component *> &compon if (!(parent && parent->treeNameMoveChildren())) continue; // TreeName only applied to parent - if (newName.split(QLatin1Char('.'), QString::SkipEmptyParts).count() - > name.split(QLatin1Char('.'), QString::SkipEmptyParts).count()) { + if (newName.split(QLatin1Char('.'), Qt::SkipEmptyParts).count() + > name.split(QLatin1Char('.'), Qt::SkipEmptyParts).count()) { continue; } newName = name; @@ -4485,16 +4484,16 @@ void PackageManagerCore::createAutoTreeNames(QHash<QString, Component *> &compon d->m_pendingUnstableComponents.insert(component->name(), QPair<Component::UnstableError, QString>(Component::InvalidTreeName, errorString)); } else { - componentsTemp.remove(componentsTemp.key(component)); + i.remove(); } continue; } component->setValue(scAutoTreeName, treeName); - componentsTemp.remove(componentsTemp.key(component)); + i.remove(); componentsTemp.insert(treeName, component); } - components = componentsTemp; + components.insert(componentsTemp); } void PackageManagerCore::restoreCheckState() |