Skip to content

Commit

Permalink
fix: or/provides depends error when first pkg fails.
Browse files Browse the repository at this point in the history
或包中包含虚包时,仅匹配了第一个虚包提供包,
不能自动切换到其它提供包,调整或包依赖解析,
将续保所有实现包添加到或包依赖列表中,满足遍历。

Log: 修复虚包、或包共用依赖满足问题
Influence: ProvidesDepends
  • Loading branch information
rb-union committed Nov 20, 2023
1 parent 6694711 commit 49b3cbc
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 10 deletions.
47 changes: 41 additions & 6 deletions src/deb-installer/manager/packagesmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -908,7 +908,30 @@ void PackagesManager::getPackageOrDepends(const QString &package, const QString
int mid = ordepend.indexOf("(");
ordepend = ordepend.left(mid);
}
dependStatus.append(ordepend);

// 判断是否为虚包,若为虚包,将实现包都加入或列表
Package *package = packageWithArch(ordepend, arch, arch);
if (package && ordepend != package->name()) {
Backend *backend = PackageAnalyzer::instance().backendPtr();
for (auto *availablePackage : backend->availablePackages()) {
if (!availablePackage->providesList().contains(ordepend)) {
continue;
}

if (!dependStatus.contains(availablePackage->name())) {
dependStatus.append(availablePackage->name());

// 使用虚包的依赖关系
if (m_dependsInfo.contains(ordepend)) {
m_dependsInfo.insert(availablePackage->name(), m_dependsInfo.value(ordepend));

qInfo() << QString("Detect or depends %1 contains virtual package: %2").arg(ordepend).arg(availablePackage->name());
}
}
}
} else {
dependStatus.append(ordepend);
}
}
m_orDepends.append(dependStatus);
m_unCheckedOrDepends.append(dependStatus);
Expand Down Expand Up @@ -1624,16 +1647,28 @@ const PackageDependsStatus PackagesManager::checkDependsPackageStatus(QSet<QStri
if (m_checkedOrDependsStatus.contains(otherDepend)) {
status = m_checkedOrDependsStatus[otherDepend];
} else {
status = checkDependsPackageStatus(choosed_set, architecture, m_dependsInfo.find(otherDepend).value());
// 虚拟或包共用,区分判断
if (m_dependsInfo.contains(otherDepend)) {
DependencyInfo dependencyInfo = m_dependsInfo.value(otherDepend);
if (dependencyInfo.packageName() == otherDepend) {
status = checkDependsPackageStatus(choosed_set, architecture, dependencyInfo);
} else {
// 依赖名和包名不同,为虚包依赖
status = checkDependsPackageStatus(choosed_set, architecture, dependencyInfo, otherDepend);
}
} else {
// 虚包使用或包判断
status = checkDependsPackageStatus(choosed_set, architecture, m_dependsInfo.find(info.packageName()).value(), otherDepend);
}

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;
qInfo() << qPrintable("Orpackage depends") << status.status;
if (status.isBreak()) //若剩余依赖中存在状态不为break,则说明依赖关系满足
continue;
dependsStatus.minEq(status);
Expand All @@ -1652,11 +1687,11 @@ const PackageDependsStatus PackagesManager::checkDependsPackageStatus(QSet<QStri

const PackageDependsStatus PackagesManager::checkDependsPackageStatus(QSet<QString> &choosed_set,
const QString &architecture,
const DependencyInfo &dependencyInfo)
const DependencyInfo &dependencyInfo, const QString &providesName)
{
m_dinfo.packageName.clear();
m_dinfo.version.clear();
const QString package_name = dependencyInfo.packageName();
const QString package_name = providesName.isEmpty() ? dependencyInfo.packageName() : providesName;
QString realArch = architecture;

// 对 wine 应用特殊处理,wine包依赖升级混用i386/amd64,不使用主包的架构
Expand Down
2 changes: 1 addition & 1 deletion src/deb-installer/manager/packagesmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ public slots:
const PackageDependsStatus checkDependsPackageStatus(QSet<QString> &choosed_set, const QString &architecture,
const QApt::DependencyItem &candicate);
const PackageDependsStatus checkDependsPackageStatus(QSet<QString> &choosed_set, const QString &architecture,
const QApt::DependencyInfo &dependencyInfo);
const QApt::DependencyInfo &dependencyInfo, const QString &providesName = QString::null);
/**
* @brief packageCandidateChoose 查找包的依赖候选
* @param choosed_set 包的依赖候选的集合
Expand Down
9 changes: 6 additions & 3 deletions tests/src/manager/ut_packagemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1190,7 +1190,8 @@ const PackageDependsStatus stub_checkDependsPackageStatus_ok(QSet<QString> &, co

const PackageDependsStatus stub_checkDependsPackageStatus_DI(QSet<QString> &,
const QString &,
const DependencyInfo &)
const DependencyInfo &,
const QString &)
{
return PackageDependsStatus::_break("1");
}
Expand Down Expand Up @@ -1232,7 +1233,8 @@ TEST_F(UT_packagesManager, PackageManager_UT_getPackageDependsStatus_06)

stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &,
const QString &,
const DependencyInfo &))
const DependencyInfo &,
const QString &))
ADDR(PackagesManager, checkDependsPackageStatus), stub_checkDependsPackageStatus_DI);


Expand Down Expand Up @@ -1293,7 +1295,8 @@ TEST_F(UT_packagesManager, PackageManager_UT_getPackageDependsStatus_07)

stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &,
const QString &,
const DependencyInfo &))
const DependencyInfo &,
const QString &))
ADDR(PackagesManager, checkDependsPackageStatus), stub_checkDependsPackageStatus_DI);

stub.set(ADDR(QThread, isRunning), stub_isRunning);
Expand Down

0 comments on commit 49b3cbc

Please sign in to comment.