Skip to content

Commit

Permalink
fix: Detect Provides/Or dependencies error.
Browse files Browse the repository at this point in the history
修复同时存在虚包依赖/或依赖时检测错误,
旧版流程基于包不会重复给出ok结果,
引入考虑虚包场景,检测包和实际包名不一致,
导致依赖包未能正常安装.

含虚包依赖/或依赖检测过程:
1. 检测前清理缓存状态;
2. 顺序遍历(后续依赖可能已安装)或依赖;
3. 依赖中存在非ok依赖,缓存包依赖状态;
4. 检测到重复包,返回缓存状态,而不是直接返回ok.

Issue: https://pms.uniontech.com/bug-view-212307.html
Influence: ProvidesDepends OrDepends
  • Loading branch information
rb-union committed Oct 31, 2023
1 parent 7acfc01 commit ec0888f
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 1 deletion.
26 changes: 25 additions & 1 deletion src/deb-installer/manager/packagesmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ PackageDependsStatus PackagesManager::checkDependsStatus(const QString &package_
m_checkedOrDependsStatus.clear();
m_unCheckedOrDepends.clear();
m_dependsInfo.clear();
m_loopErrorDeepends.clear();
//用debFile.packageName()无法打开deb文件,故替换成debFile.filePath()
//更新m_dependsInfo
getPackageOrDepends(debFile.filePath(), debFile.architecture(), true);
Expand Down Expand Up @@ -743,6 +744,7 @@ PackageDependsStatus PackagesManager::getPackageDependsStatus(const int index)
m_checkedOrDependsStatus.clear();
m_unCheckedOrDepends.clear();
m_dependsInfo.clear();
m_loopErrorDeepends.clear();
//用debFile.packageName()无法打开deb文件,故替换成debFile.filePath()
//更新m_dependsInfo
getPackageOrDepends(debFile.filePath(), debFile.architecture(), true);
Expand Down Expand Up @@ -1566,6 +1568,11 @@ const PackageDependsStatus PackagesManager::checkDependsPackageStatus(QSet<QStri
const QString &architecture,
const QList<DependencyItem> &depends)
{
// 只有单包,认为首次进入
if (choosed_set.size() <= 1) {
m_loopErrorDeepends.clear();
}

PackageDependsStatus dependsStatus = PackageDependsStatus::ok();
QList<DependInfo> break_list;
QList<DependInfo> available_list;
Expand Down Expand Up @@ -1597,6 +1604,11 @@ const PackageDependsStatus PackagesManager::checkDependsPackageStatus(QSet<QStri
const auto r = checkDependsPackageStatus(choosed_set, architecture, info);
dependsStatus.minEq(r);

// 空包名表示只返回 ok
if (!r.package.isEmpty() && !m_loopErrorDeepends.contains(r.package)) {
m_loopErrorDeepends.insert(r.package, r.status);
}

if (!m_unCheckedOrDepends.isEmpty() && r.isBreak()) { //安装包存在或依赖关系且当前依赖状态为break
for (auto orDepends : m_unCheckedOrDepends) { //遍历或依赖组,检测当前依赖是否存在或依赖关系
if (orDepends.contains(info.packageName())) {
Expand All @@ -1613,6 +1625,12 @@ const PackageDependsStatus PackagesManager::checkDependsPackageStatus(QSet<QStri
} else {
status = checkDependsPackageStatus(choosed_set, architecture, m_dependsInfo.find(otherDepend).value());
m_checkedOrDependsStatus.insert(otherDepend, status);

// 空包名表示只返回 ok
if (!status.package.isEmpty() && !m_loopErrorDeepends.contains(status.package)) {
m_loopErrorDeepends.insert(status.package, status.status);
}

}
qInfo() << status.status;
if (status.isBreak()) //若剩余依赖中存在状态不为break,则说明依赖关系满足
Expand Down Expand Up @@ -1712,8 +1730,14 @@ const PackageDependsStatus PackagesManager::checkDependsPackageStatus(QSet<QStri
}

// is that already choosed?
if (choosed_set.contains(package->name()))
if (choosed_set.contains(package->name())) {
// 已有记录,返回之前排查的结果,而不是直接返回 Ok , 当前包名可能为虚包。
if (m_loopErrorDeepends.contains(package->name())) {
return PackageDependsStatus(m_loopErrorDeepends.value(package->name()), package->name());
}

return PackageDependsStatus::ok();
}

// check arch conflicts
if (package->multiArchType() == MultiArchSame) {
Expand Down
7 changes: 7 additions & 0 deletions src/deb-installer/manager/packagesmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -578,6 +578,13 @@ private slots:
QMap<QByteArray, QPair<QList<DependInfo>, QList<DependInfo>>> m_dependsPackages;
DependInfo m_dinfo; //依赖包的包名及版本

/**
@brief m_loopErrorDeepends 循环判断依赖时缓存非 Ok 的前置包状态
用于对 OR 或依赖及 Provides 虚包依赖在循环中依赖中返回前置已检测的包状态,
而不是直接返回 Ok .
*/
QHash<QString, int> m_loopErrorDeepends;

// wine应用处理的下标
int m_DealDependIndex = -1;

Expand Down

0 comments on commit ec0888f

Please sign in to comment.