diff options
author | Katja Marttila <katja.marttila@qt.io> | 2021-03-02 11:36:40 +0200 |
---|---|---|
committer | Katja Marttila <katja.marttila@qt.io> | 2021-03-03 18:24:40 +0200 |
commit | 79bd9366980a9534e7e61e8e7c9e8c94efbd29d7 (patch) | |
tree | f534165fb5a30dabc33a6d59b435c58570a7a4ce /src/libs | |
parent | 92b00db08fa6b9fb8f818cdef55c7578998c8ecf (diff) |
Add alternative way to update components from repository
Components can be updated from online repository using version number.
Sometimes there is a need to update to an older version which is now
possible by using content sha. Content sha can be added to repository
with repogen --sha-update <component_id>. If there is a new content sha
available in the repository, component is updated although it version
number might be smaller. After the content sha is removed from online
repository, the normal update with version number is performed.
Task-number: QTIFW-1798
Change-Id: Id9e32b0345af5101cccaf6e30c81bd39691d9590
Reviewed-by: Arttu Tarkiainen <arttu.tarkiainen@qt.io>
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/ifwtools/repositorygen.cpp | 29 | ||||
-rw-r--r-- | src/libs/ifwtools/repositorygen.h | 7 | ||||
-rw-r--r-- | src/libs/installer/component.cpp | 2 | ||||
-rw-r--r-- | src/libs/installer/constants.h | 1 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore.cpp | 10 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.cpp | 18 | ||||
-rw-r--r-- | src/libs/installer/packagemanagercore_p.h | 1 | ||||
-rw-r--r-- | src/libs/kdtools/localpackagehub.cpp | 8 | ||||
-rw-r--r-- | src/libs/kdtools/localpackagehub.h | 4 |
9 files changed, 63 insertions, 17 deletions
diff --git a/src/libs/ifwtools/repositorygen.cpp b/src/libs/ifwtools/repositorygen.cpp index c269f4931..842d4f9cb 100644 --- a/src/libs/ifwtools/repositorygen.cpp +++ b/src/libs/ifwtools/repositorygen.cpp @@ -72,6 +72,8 @@ void QInstallerTools::printRepositoryGenOptions() std::cout << " --ignore-translations Do not use any translation" << std::endl; std::cout << " --ignore-invalid-packages Ignore all invalid packages instead of aborting." << std::endl; std::cout << " --ignore-invalid-repositories Ignore all invalid repositories instead of aborting." << std::endl; + std::cout << " -s|--sha-update p1,...,pn List of packages which are updated using" <<std::endl; + std::cout << " content sha1 instead of version number." << std::endl; } QString QInstallerTools::makePathAbsolute(const QString &path) @@ -292,6 +294,11 @@ void QInstallerTools::copyMetaData(const QString &_targetDir, const QString &met fileElement.setAttribute(QLatin1String("OS"), QLatin1String("Any")); update.appendChild(fileElement); + if (info.createContentSha1Node) { + QDomNode contentSha1Element = update.appendChild(doc.createElement(QLatin1String("ContentSha1"))); + contentSha1Element.appendChild(doc.createTextNode(info.contentSha1)); + } + root.appendChild(update); // copy script file @@ -417,7 +424,7 @@ void QInstallerTools::copyMetaData(const QString &_targetDir, const QString &met } PackageInfoVector QInstallerTools::createListOfPackages(const QStringList &packagesDirectories, - QStringList *packagesToFilter, FilterType filterType) + QStringList *packagesToFilter, FilterType filterType, QStringList packagesUpdatedWithSha) { qDebug() << "Collecting information about available packages..."; @@ -511,6 +518,13 @@ PackageInfoVector QInstallerTools::createListOfPackages(const QStringList &packa info.dependencies = packageElement.firstChildElement(QLatin1String("Dependencies")).text() .split(QInstaller::commaRegExp(), QString::SkipEmptyParts); info.directory = it->filePath(); + if (packagesUpdatedWithSha.contains(info.name)) { + info.createContentSha1Node = true; + packagesUpdatedWithSha.removeOne(info.name); + } else { + info.createContentSha1Node = false; + } + dict.push_back(info); qDebug() << "- it provides the package" << info.name << " - " << info.version; @@ -524,6 +538,11 @@ PackageInfoVector QInstallerTools::createListOfPackages(const QStringList &packa if (dict.isEmpty()) qDebug() << "No available packages found at the specified location."; + if (!packagesUpdatedWithSha.isEmpty()) { + throw QInstaller::Error(QString::fromLatin1("The following packages could not be found in " + "package directory: %1").arg(packagesUpdatedWithSha.join(QLatin1String(", ")))); + } + return dict; } @@ -905,6 +924,8 @@ void QInstallerTools::copyComponentData(const QStringList &packageDirs, const QS archiveHashFile.write(hashOfArchiveData); qDebug() << "Generated sha1 hash:" << hashOfArchiveData; (*infos)[i].copiedFiles.append(archiveHashFile.fileName()); + if ((*infos)[i].createContentSha1Node) + (*infos)[i].contentSha1 = QLatin1String(hashOfArchiveData); archiveHashFile.close(); } catch (const QInstaller::Error &/*e*/) { archiveFile.close(); @@ -991,7 +1012,7 @@ QString QInstallerTools::existingUniteMeta7z(const QString &repositoryDir) return uniteMeta7z; } -PackageInfoVector QInstallerTools::collectPackages(RepositoryInfo info, QStringList *filteredPackages, FilterType filterType, bool updateNewComponents) +PackageInfoVector QInstallerTools::collectPackages(RepositoryInfo info, QStringList *filteredPackages, FilterType filterType, bool updateNewComponents, QStringList packagesUpdatedWithSha) { PackageInfoVector packages; PackageInfoVector precompressedPackages = QInstallerTools::createListOfRepositoryPackages(info.repositoryPackages, @@ -999,18 +1020,16 @@ PackageInfoVector QInstallerTools::collectPackages(RepositoryInfo info, QStringL packages.append(precompressedPackages); PackageInfoVector preparedPackages = QInstallerTools::createListOfPackages(info.packages, - filteredPackages, filterType); + filteredPackages, filterType, packagesUpdatedWithSha); packages.append(preparedPackages); if (updateNewComponents) { filterNewComponents(info.repositoryDir, packages); } - foreach (const QInstallerTools::PackageInfo &package, packages) { const QFileInfo fi(info.repositoryDir, package.name); if (fi.exists()) removeDirectory(fi.absoluteFilePath()); } - return packages; } diff --git a/src/libs/ifwtools/repositorygen.h b/src/libs/ifwtools/repositorygen.h index 7204a0e13..0da81db67 100644 --- a/src/libs/ifwtools/repositorygen.h +++ b/src/libs/ifwtools/repositorygen.h @@ -48,6 +48,8 @@ struct IFWTOOLS_EXPORT PackageInfo QStringList copiedFiles; QString metaFile; QString metaNode; + QString contentSha1; + bool createContentSha1Node; }; typedef QVector<PackageInfo> PackageInfoVector; @@ -68,7 +70,7 @@ QString IFWTOOLS_EXPORT makePathAbsolute(const QString &path); void IFWTOOLS_EXPORT copyWithException(const QString &source, const QString &target, const QString &kind = QString()); PackageInfoVector IFWTOOLS_EXPORT createListOfPackages(const QStringList &packagesDirectories, QStringList *packagesToFilter, - FilterType ftype); + FilterType ftype, QStringList packagesUpdatedWithSha = QStringList()); PackageInfoVector IFWTOOLS_EXPORT createListOfRepositoryPackages(const QStringList &repositoryDirectories, QStringList *packagesToFilter, FilterType filterType); @@ -89,9 +91,8 @@ void IFWTOOLS_EXPORT copyComponentData(const QStringList &packageDir, const QStr void IFWTOOLS_EXPORT filterNewComponents(const QString &repositoryDir, QInstallerTools::PackageInfoVector &packages); QString IFWTOOLS_EXPORT existingUniteMeta7z(const QString &repositoryDir); -PackageInfoVector IFWTOOLS_EXPORT collectPackages(RepositoryInfo info, QStringList *filteredPackages, FilterType filterType, bool updateNewComponents); +PackageInfoVector IFWTOOLS_EXPORT collectPackages(RepositoryInfo info, QStringList *filteredPackages, FilterType filterType, bool updateNewComponents, QStringList packagesUpdatedWithSha); void IFWTOOLS_EXPORT createRepository(RepositoryInfo info, PackageInfoVector *packages, const QString &tmpMetaDir, bool createComponentMetadata, bool createUnifiedMetadata); - } // namespace QInstallerTools #endif // REPOSITORYGEN_H diff --git a/src/libs/installer/component.cpp b/src/libs/installer/component.cpp index 66f333377..c5d74cdfa 100644 --- a/src/libs/installer/component.cpp +++ b/src/libs/installer/component.cpp @@ -300,6 +300,7 @@ void Component::loadDataFromPackage(const KDUpdater::LocalPackage &package) setValue(scCurrentState, scInstalled); setValue(scCheckable, package.checkable ? scTrue : scFalse); setValue(scExpandedByDefault, package.expandedByDefault ? scTrue : scFalse); + setValue(scContentSha1, package.contentSha1); } /*! @@ -341,6 +342,7 @@ void Component::loadDataFromPackage(const Package &package) if (PackageManagerCore::noForceInstallation()) forced = scFalse; setValue(scForcedInstallation, forced); + setValue(scContentSha1, package.data(scContentSha1).toString()); setLocalTempPath(QInstaller::pathFromUrl(package.packageSource().url)); const QStringList uis = package.data(QLatin1String("UserInterfaces")).toString() diff --git a/src/libs/installer/constants.h b/src/libs/installer/constants.h index 42b14ce63..f1105941b 100644 --- a/src/libs/installer/constants.h +++ b/src/libs/installer/constants.h @@ -67,6 +67,7 @@ static const QLatin1String scUncompressedSizeSum("UncompressedSizeSum"); static const QLatin1String scRequiresAdminRights("RequiresAdminRights"); static const QLatin1String scOfflineBinaryName("OfflineBinaryName"); static const QLatin1String scSHA1("SHA1"); +static const QLatin1String scContentSha1("ContentSha1"); // constants used throughout the components class static const QLatin1String scVirtual("Virtual"); diff --git a/src/libs/installer/packagemanagercore.cpp b/src/libs/installer/packagemanagercore.cpp index 7528a3188..5bbccbe98 100644 --- a/src/libs/installer/packagemanagercore.cpp +++ b/src/libs/installer/packagemanagercore.cpp @@ -1549,9 +1549,8 @@ bool PackageManagerCore::fetchPackagesTree(const PackagesList &packages, const L continue; const LocalPackage localPackage = installedPackages.value(name); - const QString updateVersion = update->data(scVersion).toString(); - if (KDUpdater::compareVersion(updateVersion, localPackage.version) <= 0) - continue; // remote version equals or is less than the installed maintenance tool + if (!d->packageNeedsUpdate(localPackage, update)) + continue; const QDate updateDate = update->data(scReleaseDate).toDate(); if (localPackage.lastUpdateDate >= updateDate) @@ -2322,6 +2321,7 @@ PackageManagerCore::Status PackageManagerCore::updateComponentsSilently(const QS if (componentList.count() == 0) { qCDebug(QInstaller::lcInstallerInstallLog) << "No updates available."; + setCanceled(); } else { // Check if essential components are available (essential components are disabled). // If essential components are found, update first essential updates, @@ -3769,10 +3769,8 @@ bool PackageManagerCore::fetchUpdaterPackages(const PackagesList &remotes, const continue; // Update for not installed package found, skip it. const LocalPackage &localPackage = locals.value(name); - const QString updateVersion = update->data(scVersion).toString(); - if (KDUpdater::compareVersion(updateVersion, localPackage.version) <= 0) + if (!d->packageNeedsUpdate(localPackage, update)) continue; - // It is quite possible that we may have already installed the update. Lets check the last // update date of the package and the release date of the update. This way we can compare and // figure out if the update has been installed or not. diff --git a/src/libs/installer/packagemanagercore_p.cpp b/src/libs/installer/packagemanagercore_p.cpp index f4670c738..e6220ba35 100644 --- a/src/libs/installer/packagemanagercore_p.cpp +++ b/src/libs/installer/packagemanagercore_p.cpp @@ -2246,7 +2246,8 @@ void PackageManagerCorePrivate::installComponent(Component *component, double pr component->value(scUncompressedSize).toULongLong(), component->value(scInheritVersion), component->isCheckable(), - component->isExpandedByDefault()); + component->isExpandedByDefault(), + component->value(scContentSha1)); m_localPackageHub->writeToDisk(); component->setInstalled(); @@ -2898,4 +2899,19 @@ bool PackageManagerCorePrivate::askUserConfirmCommand() const } } +bool PackageManagerCorePrivate::packageNeedsUpdate(const LocalPackage &localPackage, const Package *update) const +{ + bool updateNeeded = true; + const QString contentSha1 = update->data(scContentSha1).toString(); + if (!contentSha1.isEmpty()) { + if (contentSha1 == localPackage.contentSha1) + updateNeeded = false; + } else { + const QString updateVersion = update->data(scVersion).toString(); + if (KDUpdater::compareVersion(updateVersion, localPackage.version) <= 0) + updateNeeded = false; + } + return updateNeeded; +} + } // namespace QInstaller diff --git a/src/libs/installer/packagemanagercore_p.h b/src/libs/installer/packagemanagercore_p.h index 858baf9eb..4d5021471 100644 --- a/src/libs/installer/packagemanagercore_p.h +++ b/src/libs/installer/packagemanagercore_p.h @@ -254,6 +254,7 @@ private: bool acceptLicenseAgreements() const; bool askUserAcceptLicense(const QString &name, const QString &content) const; bool askUserConfirmCommand() const; + bool packageNeedsUpdate(const LocalPackage &localPackage, const Package *update) const; private: PackageManagerCore *m_core; diff --git a/src/libs/kdtools/localpackagehub.cpp b/src/libs/kdtools/localpackagehub.cpp index 1a754d7d5..2ee880e04 100644 --- a/src/libs/kdtools/localpackagehub.cpp +++ b/src/libs/kdtools/localpackagehub.cpp @@ -327,7 +327,8 @@ void LocalPackageHub::addPackage(const QString &name, quint64 uncompressedSize, const QString &inheritVersionFrom, bool checkable, - bool expandedByDefault) + bool expandedByDefault, + const QString &contentSha1) { // TODO: This somewhat unexpected, remove? if (d->m_packageInfoMap.contains(name)) { @@ -350,6 +351,7 @@ void LocalPackageHub::addPackage(const QString &name, info.uncompressedSize = uncompressedSize; info.checkable = checkable; info.expandedByDefault = expandedByDefault; + info.contentSha1 = contentSha1; d->m_packageInfoMap.insert(name, info); } d->modified = true; @@ -426,6 +428,8 @@ void LocalPackageHub::writeToDisk() addTextChildHelper(&package, QLatin1String("Checkable"), QLatin1String("true")); if (info.expandedByDefault) addTextChildHelper(&package, QLatin1String("ExpandedByDefault"), QLatin1String("true")); + if (!info.contentSha1.isEmpty()) + addTextChildHelper(&package, scContentSha1, info.contentSha1); root.appendChild(package); } @@ -498,6 +502,8 @@ void LocalPackageHub::PackagesInfoData::addPackageFrom(const QDomElement &packag info.checkable = childNodeE.text().toLower() == QLatin1String("true") ? true : false; else if (childNodeE.tagName() == QLatin1String("ExpandedByDefault")) info.expandedByDefault = childNodeE.text().toLower() == QLatin1String("true") ? true : false; + else if (childNodeE.tagName() == QLatin1String("ContentSha1")) + info.contentSha1 = childNodeE.text(); } m_packageInfoMap.insert(info.name, info); } diff --git a/src/libs/kdtools/localpackagehub.h b/src/libs/kdtools/localpackagehub.h index d43c4a6a5..648d6cf6e 100644 --- a/src/libs/kdtools/localpackagehub.h +++ b/src/libs/kdtools/localpackagehub.h @@ -55,6 +55,7 @@ struct KDTOOLS_EXPORT LocalPackage quint64 uncompressedSize; bool checkable; bool expandedByDefault; + QString contentSha1; }; class KDTOOLS_EXPORT LocalPackageHub @@ -108,7 +109,8 @@ public: quint64 uncompressedSize, const QString &inheritVersionFrom, bool checkable, - bool expandedByDefault); + bool expandedByDefault, + const QString &contentSha1); bool removePackage(const QString &pkgName); void refresh(); |