Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/deb-installer/manager/packagesmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -639,7 +639,7 @@ const ConflictResult PackagesManager::isConflictSatisfy(const QString &arch,
const auto result = Package::compareVersion(installed_version, conflict_version);

// not match, ok
if (!dependencyVersionMatch(result, type)) {
if (conflict_version.isEmpty() || !dependencyVersionMatch(result, type)) {
package = nullptr;
continue;
}
Expand Down
31 changes: 30 additions & 1 deletion src/deb-installer/utils/deb_package.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,35 @@

namespace Deb {

bool needRemoveByVersion(const QString &installed_version, const QString &conflict_version, QApt::RelationType type)
{
// 如果版本条件为空,则需要移除
if (conflict_version.isEmpty()) {
return true;
}

// 比较版本号
const int result = QApt::Package::compareVersion(installed_version, conflict_version);

// 根据关系类型判断是否需要移除
switch (type) {
case QApt::LessOrEqual:
return result <= 0;
case QApt::GreaterOrEqual:
return result >= 0;
case QApt::LessThan:
return result < 0;
case QApt::GreaterThan:
return result > 0;
case QApt::Equals:
return result == 0;
case QApt::NotEqual:
return result != 0;
default:
return true;
}
Comment on lines +29 to +44

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (bug_risk): Default case in switch returns true, which may mask unexpected relation types.

Returning true for unknown relation types may cause unintended package removals. Please handle unexpected types explicitly or add logging to prevent silent errors.

Suggested change
switch (type) {
case QApt::LessOrEqual:
return result <= 0;
case QApt::GreaterOrEqual:
return result >= 0;
case QApt::LessThan:
return result < 0;
case QApt::GreaterThan:
return result > 0;
case QApt::Equals:
return result == 0;
case QApt::NotEqual:
return result != 0;
default:
return true;
}
switch (type) {
case QApt::LessOrEqual:
return result <= 0;
case QApt::GreaterOrEqual:
return result >= 0;
case QApt::LessThan:
return result < 0;
case QApt::GreaterThan:
return result > 0;
case QApt::Equals:
return result == 0;
case QApt::NotEqual:
return result != 0;
default:
qWarning() << "Unknown relation type in deb_package.cpp:" << type << ". No removal performed.";
return false;
}

}

DebPackage::DebPackage(const QString &debFilePath)
: m_debFilePtr(QSharedPointer<QApt::DebFile>::create(debFilePath))
{
Expand Down Expand Up @@ -152,7 +181,7 @@ void DebPackage::setMarkedPackages(const QStringList &installDepends)
for (const QApt::DependencyItem &item : selfRemovePackages) {
for (const QApt::DependencyInfo &info : item) {
QApt::Package *package = backend->package(info.packageName());
if (package && package->isInstalled()) {
if (package && package->isInstalled() && needRemoveByVersion(package->installedVersion(), info.packageVersion(), info.relationType())) {
m_removePackages << package->name();
}
}
Expand Down
Loading