Allow considering the regular package when checking for updates

This commit is contained in:
Martchus 2021-01-31 19:56:40 +01:00
parent 3894d911d7
commit b06a1dfcd2
7 changed files with 77 additions and 13 deletions

View File

@ -306,14 +306,20 @@ std::unordered_map<std::shared_ptr<Package>, UnresolvedDependencies> Database::d
return unresolvedPackages; return unresolvedPackages;
} }
LibPkg::PackageUpdates LibPkg::Database::checkForUpdates(const std::vector<LibPkg::Database *> &updateSources) LibPkg::PackageUpdates LibPkg::Database::checkForUpdates(const std::vector<LibPkg::Database *> &updateSources, UpdateCheckOptions options)
{ {
PackageUpdates results; PackageUpdates results;
for (const auto &myPackageIterator : packages) { for (const auto &[myPackageName, myPackage] : packages) {
const auto &myPackage = myPackageIterator.second; auto regularName = std::string();
if (options & UpdateCheckOptions::ConsiderRegularPackage) {
const auto decomposedName = myPackage->decomposeName();
if ((!decomposedName.targetPrefix.empty() || !decomposedName.vcsSuffix.empty()) && !decomposedName.isVcsPackage()) {
regularName = decomposedName.actualName;
}
}
auto foundPackage = false; auto foundPackage = false;
for (auto *updateSource : updateSources) { for (auto *const updateSource : updateSources) {
const auto updatePackageIterator = updateSource->packages.find(myPackageIterator.first); const auto updatePackageIterator = updateSource->packages.find(myPackageName);
if (updatePackageIterator == updateSource->packages.cend()) { if (updatePackageIterator == updateSource->packages.cend()) {
continue; continue;
} }
@ -340,6 +346,33 @@ LibPkg::PackageUpdates LibPkg::Database::checkForUpdates(const std::vector<LibPk
if (!foundPackage) { if (!foundPackage) {
results.orphans.emplace_back(PackageSearchResult(*this, myPackage)); results.orphans.emplace_back(PackageSearchResult(*this, myPackage));
} }
if (regularName.empty()) {
continue;
}
for (auto *const updateSource : updateSources) {
const auto updatePackageIterator = updateSource->packages.find(regularName);
if (updatePackageIterator == updateSource->packages.cend()) {
continue;
}
const auto &updatePackage = updatePackageIterator->second;
const auto versionDiff = myPackage->compareVersion(*updatePackage);
std::vector<PackageUpdate> *list = nullptr;
switch (versionDiff) {
case PackageVersionComparison::SoftwareUpgrade:
list = &results.versionUpdates;
break;
case PackageVersionComparison::PackageUpgradeOnly:
list = &results.packageUpdates;
break;
case PackageVersionComparison::NewerThanSyncVersion:
list = &results.downgrades;
break;
default:;
}
if (list) {
list->emplace_back(PackageSearchResult(*this, myPackage), PackageSearchResult(*updateSource, updatePackage));
}
}
} }
return results; return results;
} }

View File

@ -42,16 +42,22 @@ struct LIBPKG_EXPORT PackageSearchResult {
*/ */
enum class DatabaseUsage { enum class DatabaseUsage {
None = 0, None = 0,
Sync = 1, /*! The database is used when synchronizing. */ Sync = (1 << 0), /*! The database is used when synchronizing. */
Search = (1 << 1), /*! The database is used when searching. */ Search = (1 << 1), /*! The database is used when searching. */
Install = (1 << 2), /*! The database is used to install packages. */ Install = (1 << 2), /*! The database is used to install packages. */
Upgrade = (1 << 3), /*! The database is used to upgrade packages. */ Upgrade = (1 << 3), /*! The database is used to upgrade packages. */
All = (1 << 4) - 1, /*! The database is used for everything. */ All = (1 << 4) - 1, /*! The database is used for everything. */
}; };
enum class UpdateCheckOptions {
None = 0,
ConsiderRegularPackage = (1 << 0),
};
} // namespace LibPkg } // namespace LibPkg
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibPkg, LibPkg::DatabaseUsage) CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibPkg, LibPkg::DatabaseUsage)
CPP_UTILITIES_MARK_FLAG_ENUM_CLASS(LibPkg, LibPkg::UpdateCheckOptions)
namespace LibPkg { namespace LibPkg {
@ -109,7 +115,7 @@ struct LIBPKG_EXPORT Database : public ReflectiveRapidJSON::JsonSerializable<Dat
void replacePackages(const std::vector<std::shared_ptr<Package>> &newPackages, CppUtilities::DateTime lastModified); void replacePackages(const std::vector<std::shared_ptr<Package>> &newPackages, CppUtilities::DateTime lastModified);
std::unordered_map<std::shared_ptr<Package>, UnresolvedDependencies> detectUnresolvedPackages( std::unordered_map<std::shared_ptr<Package>, UnresolvedDependencies> detectUnresolvedPackages(
Config &config, const std::vector<std::shared_ptr<Package>> &newPackages, const DependencySet &removedPackages); Config &config, const std::vector<std::shared_ptr<Package>> &newPackages, const DependencySet &removedPackages);
PackageUpdates checkForUpdates(const std::vector<Database *> &updateSources); PackageUpdates checkForUpdates(const std::vector<Database *> &updateSources, UpdateCheckOptions options = UpdateCheckOptions::None);
PackageLocation locatePackage(const std::string &packageName) const; PackageLocation locatePackage(const std::string &packageName) const;
std::string filesPathFromRegularPath() const; std::string filesPathFromRegularPath() const;

View File

@ -59,7 +59,14 @@ BuildActionMetaInfo::BuildActionMetaInfo()
.category = "Repo management", .category = "Repo management",
.name = "Check for updates", .name = "Check for updates",
.type = "check-updates", .type = "check-updates",
.flags = {}, .flags = {
BuildActionFlagMetaInfo{
.id = static_cast<BuildActionFlagType>(CheckForUpdatesFlags::ConsiderRegularPackage),
.name = "Consider regular package",
.desc = "When processing a variant package like mingw-w64-qt6-base compare with the regular qt6-base package as well",
.param = "consider-regular-package",
},
},
.settings = {}, .settings = {},
.directory = false, .directory = false,
.sourceDb = true, .sourceDb = true,

View File

@ -51,6 +51,10 @@ enum class BuildActionType : std::uint64_t {
using BuildActionFlagType = std::uint64_t; using BuildActionFlagType = std::uint64_t;
static constexpr BuildActionFlagType noBuildActionFlags = 0; static constexpr BuildActionFlagType noBuildActionFlags = 0;
enum class CheckForUpdatesFlags : BuildActionFlagType {
None,
ConsiderRegularPackage = (1 << 0), // be consistent with LibPkg::UpdateCheckOptions here
};
enum class ReloadLibraryDependenciesFlags : BuildActionFlagType { enum class ReloadLibraryDependenciesFlags : BuildActionFlagType {
None, None,
ForceReload = (1 << 0), ForceReload = (1 << 0),

View File

@ -371,6 +371,7 @@ struct LIBREPOMGR_EXPORT UpdateCheck : public InternalBuildAction {
private: private:
LibPkg::PackageUpdates checkForUpdates(); LibPkg::PackageUpdates checkForUpdates();
LibPkg::UpdateCheckOptions m_options = LibPkg::UpdateCheckOptions::None;
bool m_packageLookupDone = false; bool m_packageLookupDone = false;
}; };

View File

@ -16,6 +16,9 @@ UpdateCheck::UpdateCheck(ServiceSetup &setup, const std::shared_ptr<BuildAction>
void UpdateCheck::run() void UpdateCheck::run()
{ {
const auto flags = static_cast<CheckForUpdatesFlags>(m_buildAction->flags);
m_options = static_cast<LibPkg::UpdateCheckOptions>(flags);
auto configReadLock = init(BuildActionAccess::ReadConfig, auto configReadLock = init(BuildActionAccess::ReadConfig,
RequiredDatabases::OneOrMoreSources | RequiredDatabases::OneDestination | RequiredDatabases::AllowFromAur, RequiredParameters::None); RequiredDatabases::OneOrMoreSources | RequiredDatabases::OneDestination | RequiredDatabases::AllowFromAur, RequiredParameters::None);
if (holds_alternative<monostate>(configReadLock)) { if (holds_alternative<monostate>(configReadLock)) {
@ -47,7 +50,7 @@ LibPkg::PackageUpdates UpdateCheck::checkForUpdates()
if (m_fromAur) { if (m_fromAur) {
sourceDbs.emplace_back(&m_setup.config.aur); sourceDbs.emplace_back(&m_setup.config.aur);
} }
return (**m_destinationDbs.begin()).checkForUpdates(sourceDbs); return (**m_destinationDbs.begin()).checkForUpdates(sourceDbs, m_options);
} }
} // namespace LibRepoMgr } // namespace LibRepoMgr

View File

@ -722,7 +722,7 @@ function isBuildActionSourceAur(buildActionInfo)
return Array.isArray(sourceDbs) && sourceDbs.length === 1 && sourceDbs[0] == 'aur'; return Array.isArray(sourceDbs) && sourceDbs.length === 1 && sourceDbs[0] == 'aur';
} }
function renderUpdateInfoWithCheckbox(id, packageName, versionInfo, sourceFromAur) function renderUpdateInfoWithCheckbox(id, packageName, newPackageName, versionInfo, sourceFromAur)
{ {
const inputElement = document.createElement('input'); const inputElement = document.createElement('input');
inputElement.type = 'checkbox'; inputElement.type = 'checkbox';
@ -730,13 +730,21 @@ function renderUpdateInfoWithCheckbox(id, packageName, versionInfo, sourceFromAu
inputElement.value = packageName; inputElement.value = packageName;
const labelElement = document.createElement('label'); const labelElement = document.createElement('label');
labelElement.htmlFor = id; labelElement.htmlFor = id;
if (sourceFromAur) { if (sourceFromAur && newPackageName) {
const packageNameLink = document.createElement('a'); const packageNameLink = document.createElement('a');
packageNameLink.href = 'https://aur.archlinux.org/packages/' + packageName; packageNameLink.href = 'https://aur.archlinux.org/packages/' + newPackageName;
packageNameLink.target = '_blank'; packageNameLink.target = '_blank';
packageNameLink.appendChild(document.createTextNode(packageName)); packageNameLink.appendChild(document.createTextNode(newPackageName));
if (newPackageName !== packageName) {
labelElement.appendChild(document.createTextNode(packageName + ' ('));
}
labelElement.appendChild(packageNameLink); labelElement.appendChild(packageNameLink);
if (newPackageName !== packageName) {
labelElement.appendChild(document.createTextNode(')'));
}
labelElement.appendChild(document.createTextNode(': ' + versionInfo)); labelElement.appendChild(document.createTextNode(': ' + versionInfo));
} else if (newPackageName && packageName !== newPackageName) {
labelElement.appendChild(document.createTextNode(packageName + ' (' + newPackageName + '): ' + versionInfo));
} else { } else {
labelElement.appendChild(document.createTextNode(packageName + ': ' + versionInfo)); labelElement.appendChild(document.createTextNode(packageName + ': ' + versionInfo));
} }
@ -807,6 +815,7 @@ function renderOrphanPackage(value, obj, level, row)
return renderUpdateInfoWithCheckbox( return renderUpdateInfoWithCheckbox(
'update-info-checkbox-' + packageName + '-' + package.version, 'update-info-checkbox-' + packageName + '-' + package.version,
packageName, packageName,
undefined,
package.version package.version
); );
return document.createTextNode(); return document.createTextNode();
@ -825,6 +834,7 @@ function renderUpdateOrDowngrade(value, obj, level, row)
return renderUpdateInfoWithCheckbox( return renderUpdateInfoWithCheckbox(
'update-info-checkbox-' + packageName + '-' + oldVersion.version + '-' + newVersion.version, 'update-info-checkbox-' + packageName + '-' + oldVersion.version + '-' + newVersion.version,
packageName, packageName,
newVersion.name,
oldVersion.version + ' → ' + newVersion.version, oldVersion.version + ' → ' + newVersion.version,
sourceFromAur sourceFromAur
); );