Skip to content

Commit

Permalink
fix: Remove package will remove "breaks" reverse depends.
Browse files Browse the repository at this point in the history
卸载软件包时过滤标记为 Conflict/Replace/Break 的反向依赖包,
这些依赖包并非直接依赖待卸载的软件包,仅移除标记为 Depends 的包.

Log: 修复卸载软件包时卸载了标记"破坏"的反向依赖包
Bug: https://pms.uniontech.com/bug-view-208617.html
Influence: UninstallPcakge
  • Loading branch information
rb-union authored and starhcq committed Jul 11, 2023
1 parent 72b2894 commit 73634fe
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 0 deletions.
28 changes: 28 additions & 0 deletions src/deb-installer/manager/packagesmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1101,6 +1101,12 @@ const QStringList PackagesManager::packageReverseDependsList(const QString &pack
continue;
}

// Conflict / Replace / Break 的反向依赖同样跳过
if (isNegativeReverseDepend(packageName, currentPackage)) {
currentPackage = nullptr;
continue;
}

reverseDependSet << item;

if (specialPackage().contains(item))
Expand Down Expand Up @@ -1141,6 +1147,28 @@ const QStringList PackagesManager::packageReverseDependsList(const QString &pack
return reverseDependSet.toList();
}

bool PackagesManager::isNegativeReverseDepend(const QString &packageName, const QApt::Package *reverseDepend)
{
if (!reverseDepend) {
return false;
}

static auto containPackage = [](const QString &packageName, const QList<DependencyItem> &itemList) -> bool {
return std::any_of(itemList.begin(), itemList.end(), [&](const DependencyItem &item) {
return std::any_of(
item.begin(), item.end(), [&](const DependencyInfo &info) { return info.packageName() == packageName; });
});
};

// 不排除部分包设置 替换(Replace)/破坏(Breaks) 仍依赖 packageName , Depends 字段设置视为非消极包
if (containPackage(packageName, reverseDepend->depends())) {
return false;
}

return containPackage(packageName, reverseDepend->conflicts()) || containPackage(packageName, reverseDepend->replaces()) ||
containPackage(packageName, reverseDepend->breaks());
}

void PackagesManager::reset()
{
m_errorIndex.clear();
Expand Down
12 changes: 12 additions & 0 deletions src/deb-installer/manager/packagesmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,18 @@ public slots:
const QList<DependencyItem> &conflicts,
const QList<DependencyItem> &replaces);

//// 依赖查找 获取查找包是否为消极的反向依赖
private:
/**
* @brief isNegativeReverseDepend 判断软件包 `reverseDepend` 是否是 `packageName` 的消极依赖包,
* 例如 冲突(Conflict)/替换(Replace)/破坏(Breaks) 这些包在卸载时将被跳过,
* 在 依赖(Depends) 字段设置包将不会被视为消极包。
* @param packageName 当前处理的软件包
* @param reverseDepend `packageName` 的反向依赖包
* @return `reverseDepend` 是否为 `packageName` 的消极依赖
*/
bool isNegativeReverseDepend(const QString &packageName, const QApt::Package *reverseDepend);

private:
/**
* @brief packageWithArch 从指定的架构上打包
Expand Down
2 changes: 2 additions & 0 deletions src/deb-installer/model/deblistmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,8 @@ void DebListModel::slotUninstallPackage(const int index)
if (!debFile.isValid())
return;
const QStringList rdepends = m_packagesManager->packageReverseDependsList(debFile.packageName(), debFile.architecture()); //检查是否有应用依赖到该包
qInfo() << QString("Will remove reverse depends before remove %1 , Lists:").arg(debFile.packageName()) << rdepends;

Backend *backend = PackageAnalyzer::instance().backendPtr();
for (const auto &r : rdepends) { // 卸载所有依赖该包的应用(二者的依赖关系为depends)
if (backend->package(r)) {
Expand Down

0 comments on commit 73634fe

Please sign in to comment.