Skip to content

Commit

Permalink
fix: Fix package conflicts and replaces depends error.
Browse files Browse the repository at this point in the history
在判断冲突包标识时,仅考虑conflicts,未处理conflicts和
replaces结合使用的场景,更新判断replaces标识.
* 更新了 PackagesManager 的UT.

Log: 修复conflicts和replaces结合使用报告冲突的问题
Bug: https://pms.uniontech.com/bug-view-214693.html
Influence: PackageInstall
  • Loading branch information
rb-union committed Aug 14, 2023
1 parent 683322f commit 0d353c6
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 24 deletions.
8 changes: 4 additions & 4 deletions src/deb-installer/manager/packagesmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ const ConflictResult PackagesManager::packageConflictStat(const int index)
DebFile debfile(m_preparedPackages[index]);
if (!debfile.isValid())
return ConflictResult::err("");
ConflictResult ConflictResult = isConflictSatisfy(debfile.architecture(), debfile.conflicts());
ConflictResult ConflictResult = isConflictSatisfy(debfile.architecture(), debfile.conflicts(), debfile.replaces());
return ConflictResult;
}

Expand All @@ -394,7 +394,7 @@ const ConflictResult PackagesManager::isConflictSatisfy(const QString &arch, Pac
return ret_installed;
}

const auto conflictStatus = isConflictSatisfy(arch, package->conflicts());
const auto conflictStatus = isConflictSatisfy(arch, package->conflicts(), package->replaces());

return conflictStatus;
}
Expand Down Expand Up @@ -755,7 +755,7 @@ PackageDependsStatus PackagesManager::getPackageDependsStatus(const int index)
}

// conflicts
const ConflictResult debConflitsResult = isConflictSatisfy(architecture, debFile.conflicts());
const ConflictResult debConflitsResult = isConflictSatisfy(architecture, debFile.conflicts(), debFile.replaces());

if (!debConflitsResult.is_ok()) {
qWarning() << "PackagesManager:" << "depends break because conflict" << debFile.packageName();
Expand Down Expand Up @@ -1054,7 +1054,7 @@ void PackagesManager::packageCandidateChoose(QSet<QString> &choosed_set, const Q
}
}

if (!isConflictSatisfy(debArch, package->conflicts()).is_ok())
if (!isConflictSatisfy(debArch, package->conflicts(), package->replaces()).is_ok())
continue;

QSet<QString> upgradeDependsSet = choosed_set;
Expand Down
38 changes: 31 additions & 7 deletions src/deepin-deb-installer-dev/status/PackageStatus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -178,12 +178,12 @@ const ConflictResult PackageStatus::isConflictSatisfy(const QString &arch, Packa
const auto ret_installed = isInstalledConflict(name, package->version(), package->architecture());
if (!ret_installed.is_ok()) return ret_installed;

const auto ret_package = isConflictSatisfy(arch, package->conflicts());
const auto ret_package = isConflictSatisfy(arch, package->conflicts(), package->replaces());

return ret_package;
}

const ConflictResult PackageStatus::isConflictSatisfy(const QString &arch, const QList<DependencyItem> &conflicts)
const ConflictResult PackageStatus::isConflictSatisfy(const QString &arch, const QList<DependencyItem> &conflicts, const QList<QApt::DependencyItem> &replaces)
{
for (const auto &conflict_list : conflicts) {
for (const auto &conflict : conflict_list) {
Expand Down Expand Up @@ -212,9 +212,33 @@ const ConflictResult PackageStatus::isConflictSatisfy(const QString &arch, const

// mirror version is also break
const auto mirror_result = QApt::Package::compareVersion(mirror_version, conflict_version);
if (dependencyVersionMatch(mirror_result, type)) {
qWarning() << "PackagesManager:" << "conflicts package installed: " << arch << p->name() << p->architecture()
<< p->multiArchTypeString() << mirror_version << conflict_version;
if (dependencyVersionMatch(mirror_result, type) && name != m_package) { //此处即可确认冲突成立
//额外判断是否会替换此包
bool conflict_yes = true;
for (auto replace_list : replaces) {
for (auto replace : replace_list) {
if (replace.packageName() == name) { //包名符合
auto replaceType = replace.relationType(); //提取版本号规则
auto versionCompare = Package::compareVersion(installed_version, replace.packageVersion()); //比较版本号
if (dependencyVersionMatch(versionCompare, replaceType)) { //如果版本号符合要求,即判定replace成立
conflict_yes = false;
break;
}
}
}
if (!conflict_yes) {
break;
}
}

if (!conflict_yes) {
p = nullptr;
continue;
}

qWarning() << "PackagesManager:" << "conflicts package installed: "
<< arch << p->name() << p->architecture()
<< p->multiArchTypeString() << mirror_version << conflict_version;
return ConflictResult::err(name);
}
}
Expand Down Expand Up @@ -443,7 +467,7 @@ DependsStatus PackageStatus::getPackageDependsStatus(const QString &packagePath)
}

// conflicts
const ConflictResult debConflitsResult = isConflictSatisfy(architecture, deb->conflicts());
const ConflictResult debConflitsResult = isConflictSatisfy(architecture, deb->conflicts(), deb->replaces());

if (!debConflitsResult.is_ok()) {
qWarning() << "PackagesManager:" << "depends break because conflict" << deb->packageName();
Expand Down Expand Up @@ -547,7 +571,7 @@ void PackageStatus::packageCandidateChoose(QSet<QString> &choosed_set, const QSt
}
}

if (!isConflictSatisfy(debArch, dep->conflicts()).is_ok()) {
if (!isConflictSatisfy(debArch, dep->conflicts(), dep->replaces()).is_ok()) {
continue;
}

Expand Down
2 changes: 1 addition & 1 deletion src/deepin-deb-installer-dev/status/PackageStatus.h
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ class PackageStatus
* @return 冲突的结果
*/
const ConflictResult isConflictSatisfy(const QString &arch, QApt::Package *package);
const ConflictResult isConflictSatisfy(const QString &arch, const QList<QApt::DependencyItem> &conflicts);
const ConflictResult isConflictSatisfy(const QString &arch, const QList<QApt::DependencyItem> &conflicts, const QList<QApt::DependencyItem> &replaces = {});


/**
Expand Down
50 changes: 38 additions & 12 deletions tests/src/manager/ut_packagemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,11 @@ QList<DependencyItem> deb_conflicts()
QList<DependencyItem> deb_conflicts_null()
{
return {};
}

QList<DependencyItem> deb_replaces_null()
{
return {};
}

Package *stub_packageWithArch(QString, QString, QString)
Expand Down Expand Up @@ -544,6 +548,7 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageConflictStat)

stub.set(ADDR(PackagesManager, getPackageDependsStatus), stub_getPackageDependsStatus);
stub.set(ADDR(DebFile, conflicts), deb_conflicts_null);
stub.set(ADDR(DebFile, replaces), deb_replaces_null);

stub.set(ADDR(PackagesManager, dealPackagePath), stub_dealPackagePath);
stub.set(ADDR(PackagesManager, dealInvalidPackage), stub_dealInvalidPackage);
Expand Down Expand Up @@ -822,12 +827,12 @@ TEST_F(UT_packagesManager, PackageManager_UT_isConflictSatisfy_0003)
ASSERT_FALSE(cr.is_ok());
}

const ConflictResult stub_isConflictSatisfy(const QString &, const QList<QApt::DependencyItem> &)
const ConflictResult stub_isConflictSatisfy(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &)
{
return ConflictResult::ok("1");
}

const ConflictResult stub_isConflictSatisfy_error(const QString &, const QList<QApt::DependencyItem> &)
const ConflictResult stub_isConflictSatisfy_error(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &)
{
return ConflictResult::err("1");
}
Expand All @@ -847,9 +852,11 @@ TEST_F(UT_packagesManager, PackageManager_UT_isConflictSatisfy_0004)
stub.set(ADDR(Package, version), package_version);
stub.set(ADDR(Package, architecture), package_architecture);
stub.set(ADDR(Package, conflicts), package_conflicts);
stub.set(ADDR(Package, replaces), deb_replaces_null);

stub.set(ADDR(PackagesManager, isInstalledConflict), stub_isInstalledConflict_ok);
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);

ConflictResult cr = m_packageManager->isConflictSatisfy("i386", &package);
ASSERT_TRUE(cr.is_ok());
Expand Down Expand Up @@ -964,6 +971,7 @@ TEST_F(UT_packagesManager, PackageManager_UT_DealDependResult)
stub.set(ADDR(DebFile, depends), deb_depends);
stub.set(ADDR(PackagesManager, isArchError), ut_isArchError_false);
stub.set(ADDR(DebFile, conflicts), deb_conflicts);
stub.set(ADDR(DebFile, replaces), deb_replaces_null);
stub.set((QString(DebFile::*)(const QString & name) const)ADDR(DebFile, controlField), ut_controlField);
stub.set(ADDR(DependGraph, getBestInstallQueue), stub_getBestInstallQueue);

Expand Down Expand Up @@ -1159,7 +1167,7 @@ TEST_F(UT_packagesManager, PackageManager_UT_getPackageDependsStatus_05)
stub.set(ADDR(Package, isInstalled), stub_isInstalled);


stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy_error);

PackageDependsStatus pd = m_packageManager->getPackageDependsStatus(0);
Expand Down Expand Up @@ -1215,7 +1223,7 @@ TEST_F(UT_packagesManager, PackageManager_UT_getPackageDependsStatus_06)
stub.set(ADDR(PackagesManager, dealInvalidPackage), stub_dealInvalidPackage);
stub.set(ADDR(PackagesManager, isBlackApplication), stub_isBlackApplication_false);

stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);

stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &, const QString &,
Expand Down Expand Up @@ -1271,6 +1279,7 @@ TEST_F(UT_packagesManager, PackageManager_UT_getPackageDependsStatus_07)
stub.set((QApt::Package * (QApt::Backend::*)(const QString & name) const)ADDR(Backend, package), package_package);
stub.set(ADDR(Package, multiArchType), ut_packagesManager_multiArchType);
stub.set(ADDR(Package, conflicts), package_conflicts);
stub.set(ADDR(DebFile, replaces), deb_replaces_null);
stub.set((QString(DebFile::*)(const QString & name) const)ADDR(DebFile, controlField), ut_controlField);

stub.set(ADDR(PackagesManager, packageWithArch), stub_avaialbe_packageWithArch);
Expand All @@ -1279,7 +1288,7 @@ TEST_F(UT_packagesManager, PackageManager_UT_getPackageDependsStatus_07)
stub.set(ADDR(PackagesManager, dealInvalidPackage), stub_dealInvalidPackage);
stub.set(ADDR(PackagesManager, isBlackApplication), stub_isBlackApplication_false);

stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);

stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &,
Expand Down Expand Up @@ -1418,10 +1427,16 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageReverseDependsList)
ASSERT_TRUE(ads.isEmpty());
}

bool stub_isNegativeReverseDepend(const QString &packageName, const QApt::Package *reverseDepend)
{
return false;
}

TEST_F(UT_packagesManager, PackageManager_UT_packageReverseDependsList_1)
{
stub.set(ADDR(DebFile, depends), deb_depends);
stub.set(ADDR(DebFile, conflicts), deb_conflicts);
stub.set(ADDR(DebFile, replaces), deb_replaces_null);

stub.set(ADDR(Package, installedVersion), package_installedVersion);
stub.set(ADDR(Package, compareVersion), package_compareVersion);
Expand All @@ -1435,6 +1450,7 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageReverseDependsList_1)
stub.set(ADDR(PackagesManager, getPackageDependsStatus), stub_getPackageDependsStatus);
stub.set(ADDR(PackagesManager, dealPackagePath), stub_dealPackagePath);
stub.set(ADDR(PackagesManager, dealInvalidPackage), stub_dealInvalidPackage);
stub.set(ADDR(PackagesManager, isNegativeReverseDepend), stub_isNegativeReverseDepend);

usleep(10 * 1000);
m_packageManager->appendPackage({"/"});
Expand Down Expand Up @@ -1547,6 +1563,7 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageReverseDependsList_5)
stub.set(ADDR(PackagesManager, getPackageDependsStatus), stub_getPackageDependsStatus);
stub.set(ADDR(PackagesManager, dealPackagePath), stub_dealPackagePath);
stub.set(ADDR(PackagesManager, dealInvalidPackage), stub_dealInvalidPackage);
stub.set(ADDR(PackagesManager, isNegativeReverseDepend), stub_isNegativeReverseDepend);

usleep(10 * 1000);
m_packageManager->appendPackage({"/"});
Expand Down Expand Up @@ -2000,10 +2017,12 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageCandidateChoose)
stub.set(ADDR(Package, name), package_name);
stub.set(ADDR(Package, architecture), package_architecture);
stub.set(ADDR(Package, conflicts), package_conflicts);
stub.set(ADDR(Package, replaces), deb_replaces_null);
stub.set(ADDR(Package, depends), deb_conflicts_null);
stub.set((QApt::Package * (QApt::Backend::*)(const QString & name) const)ADDR(Backend, package), packagesManager_package);

stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);

stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &, const QString &,
const QList<QApt::DependencyItem> &))
Expand Down Expand Up @@ -2033,10 +2052,12 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageCandidateChoose_1)
stub.set(ADDR(Package, name), package_name);
stub.set(ADDR(Package, architecture), package_architecture);
stub.set(ADDR(Package, conflicts), package_conflicts);
stub.set(ADDR(Package, replaces), deb_replaces_null);
stub.set(ADDR(Package, depends), deb_conflicts_null);
stub.set((QApt::Package * (QApt::Backend::*)(const QString & name) const)ADDR(Backend, package), packagesManager_package);

stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);

stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &, const QString &,
const QList<QApt::DependencyItem> &))
Expand Down Expand Up @@ -2066,10 +2087,12 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageCandidateChoose_2)
stub.set(ADDR(Package, name), package_name);
stub.set(ADDR(Package, architecture), package_architecture);
stub.set(ADDR(Package, conflicts), package_conflicts);
stub.set(ADDR(Package, replaces), deb_replaces_null);
stub.set(ADDR(Package, depends), deb_conflicts_null);
stub.set((QApt::Package * (QApt::Backend::*)(const QString & name) const)ADDR(Backend, package), package_package);

stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy);

stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &, const QString &,
const QList<QApt::DependencyItem> &))
Expand Down Expand Up @@ -2099,11 +2122,12 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageCandidateChoose_3)
stub.set(ADDR(Package, name), package_name);
stub.set(ADDR(Package, architecture), package_architecture);
stub.set(ADDR(Package, conflicts), package_conflicts);
stub.set(ADDR(Package, replaces), deb_replaces_null);
stub.set(ADDR(Package, depends), deb_conflicts_null);
stub.set((QApt::Package * (QApt::Backend::*)(const QString & name) const)ADDR(Backend, package), package_package);

stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy_error);

stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy_error);
stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &, const QString &,
const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, checkDependsPackageStatus), stub_checkDependsPackageStatus_ok);
Expand Down Expand Up @@ -2132,10 +2156,12 @@ TEST_F(UT_packagesManager, PackageManager_UT_packageCandidateChoose_4)
stub.set(ADDR(Package, name), package_name);
stub.set(ADDR(Package, architecture), package_architecture);
stub.set(ADDR(Package, conflicts), package_conflicts);
stub.set(ADDR(Package, replaces), deb_replaces_null);
stub.set(ADDR(Package, depends), deb_conflicts_null);
stub.set((QApt::Package * (QApt::Backend::*)(const QString & name) const)ADDR(Backend, package), package_package);

stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &))ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy_error);
stub.set((const ConflictResult(PackagesManager::*)(const QString &, const QList<QApt::DependencyItem> &, const QList<QApt::DependencyItem> &))
ADDR(PackagesManager, isConflictSatisfy), stub_isConflictSatisfy_error);

stub.set((const PackageDependsStatus(PackagesManager::*)(QSet<QString> &, const QString &,
const QList<QApt::DependencyItem> &))
Expand Down

0 comments on commit 0d353c6

Please sign in to comment.