From 49b3cbc5dbaa423c0fa8e998ce5b4bbf3fa73997 Mon Sep 17 00:00:00 2001 From: renbin Date: Fri, 17 Nov 2023 18:16:58 +0800 Subject: [PATCH] fix: or/provides depends error when first pkg fails. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 或包中包含虚包时,仅匹配了第一个虚包提供包, 不能自动切换到其它提供包,调整或包依赖解析, 将续保所有实现包添加到或包依赖列表中,满足遍历。 Log: 修复虚包、或包共用依赖满足问题 Influence: ProvidesDepends --- src/deb-installer/manager/packagesmanager.cpp | 47 ++++++++++++++++--- src/deb-installer/manager/packagesmanager.h | 2 +- tests/src/manager/ut_packagemanager.cpp | 9 ++-- 3 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/deb-installer/manager/packagesmanager.cpp b/src/deb-installer/manager/packagesmanager.cpp index 7a4f5013..adb9a4fc 100644 --- a/src/deb-installer/manager/packagesmanager.cpp +++ b/src/deb-installer/manager/packagesmanager.cpp @@ -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); @@ -1624,16 +1647,28 @@ const PackageDependsStatus PackagesManager::checkDependsPackageStatus(QSet &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,不使用主包的架构 diff --git a/src/deb-installer/manager/packagesmanager.h b/src/deb-installer/manager/packagesmanager.h index b9a4b270..4eaa5992 100644 --- a/src/deb-installer/manager/packagesmanager.h +++ b/src/deb-installer/manager/packagesmanager.h @@ -335,7 +335,7 @@ public slots: const PackageDependsStatus checkDependsPackageStatus(QSet &choosed_set, const QString &architecture, const QApt::DependencyItem &candicate); const PackageDependsStatus checkDependsPackageStatus(QSet &choosed_set, const QString &architecture, - const QApt::DependencyInfo &dependencyInfo); + const QApt::DependencyInfo &dependencyInfo, const QString &providesName = QString::null); /** * @brief packageCandidateChoose 查找包的依赖候选 * @param choosed_set 包的依赖候选的集合 diff --git a/tests/src/manager/ut_packagemanager.cpp b/tests/src/manager/ut_packagemanager.cpp index 12adbb1c..22e1d6d1 100644 --- a/tests/src/manager/ut_packagemanager.cpp +++ b/tests/src/manager/ut_packagemanager.cpp @@ -1190,7 +1190,8 @@ const PackageDependsStatus stub_checkDependsPackageStatus_ok(QSet &, co const PackageDependsStatus stub_checkDependsPackageStatus_DI(QSet &, const QString &, - const DependencyInfo &) + const DependencyInfo &, + const QString &) { return PackageDependsStatus::_break("1"); } @@ -1232,7 +1233,8 @@ TEST_F(UT_packagesManager, PackageManager_UT_getPackageDependsStatus_06) stub.set((const PackageDependsStatus(PackagesManager::*)(QSet &, const QString &, - const DependencyInfo &)) + const DependencyInfo &, + const QString &)) ADDR(PackagesManager, checkDependsPackageStatus), stub_checkDependsPackageStatus_DI); @@ -1293,7 +1295,8 @@ TEST_F(UT_packagesManager, PackageManager_UT_getPackageDependsStatus_07) stub.set((const PackageDependsStatus(PackagesManager::*)(QSet &, const QString &, - const DependencyInfo &)) + const DependencyInfo &, + const QString &)) ADDR(PackagesManager, checkDependsPackageStatus), stub_checkDependsPackageStatus_DI); stub.set(ADDR(QThread, isRunning), stub_isRunning);