Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Detect Provides/Or dependencies error. #228

Merged
merged 1 commit into from
Oct 31, 2023
Merged
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
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
Loading