Skip to content

Commit

Permalink
fix: Wrong architecture used while install wine package.
Browse files Browse the repository at this point in the history
安装 Wine 软件包时,未根据依赖包架构查询软件包,
而是使用安装包架构,修改为根据 Depends 指定架构查询。

Log: 修复安装Wine软件包时查找了错误的依赖包架构。
Bug: https://pms.uniontech.com/bug-view-205805.html
Influence: WineDepends
  • Loading branch information
rb-union committed Jul 17, 2023
1 parent a2d76a8 commit bf9388e
Showing 1 changed file with 26 additions and 10 deletions.
36 changes: 26 additions & 10 deletions src/deb-installer/manager/packagesmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -724,7 +724,6 @@ PackageDependsStatus PackagesManager::getPackageDependsStatus(const int index)
if (m_packageMd5DependsStatus.contains(currentPackageMd5))
return m_packageMd5DependsStatus[currentPackageMd5];


DebFile debFile(m_preparedPackages[index]);
if (!debFile.isValid())
return PackageDependsStatus::_break("");
Expand All @@ -741,17 +740,17 @@ PackageDependsStatus PackagesManager::getPackageDependsStatus(const int index)
PackageDependsStatus dependsStatus = PackageDependsStatus::ok();

if (isBlackApplication(debFile.packageName())) {
dependsStatus.status = DebListModel::Prohibit;
dependsStatus.status = DebListModel::Prohibit;
dependsStatus.package = debFile.packageName();
m_packageMd5DependsStatus.insert(currentPackageMd5, dependsStatus);
qWarning() << debFile.packageName() << "In the blacklist";
return dependsStatus;
}

if (isArchError(index)) {
dependsStatus.status = DebListModel::ArchBreak; //添加ArchBreak错误。
dependsStatus.status = DebListModel::ArchBreak; //添加ArchBreak错误。
dependsStatus.package = debFile.packageName();
m_packageMd5DependsStatus.insert(currentPackageMd5, dependsStatus);//更换依赖的存储方式
m_packageMd5DependsStatus.insert(currentPackageMd5, dependsStatus); //更换依赖的存储方式
return dependsStatus;
}

Expand All @@ -773,21 +772,31 @@ PackageDependsStatus PackagesManager::getPackageDependsStatus(const int index)
QSet<QString> choose_set;
choose_set << debFile.packageName();
QStringList dependList;
QMap<QString, QString> dependArchMap;
bool isWineApplication = false; //判断是否是wine应用
for (auto ditem : debFile.depends()) { //每一个list中的关系是或的关系
for (auto dinfo : ditem) {
Package *depend = packageWithArch(dinfo.packageName(), debFile.architecture());
// Note: 此处使用依赖包的架构查找软件包版本,某些场景下deb包架构和依赖包架构不一定一致。
QString packageArch = dinfo.multiArchAnnotation();
if (Q_UNLIKELY(packageArch.isEmpty())) {
// 无架构信息采用deb架构
packageArch = debFile.architecture();
}

Package *depend = packageWithArch(dinfo.packageName(), packageArch);
if (depend) {
QString dependName;
if (depend->name() == "deepin-elf-verify") //deepi-elf-verify 是amd64架构非i386
dependList << depend->name();
dependName = depend->name();
else
dependList << depend->name() + ":" + depend->architecture();
dependName = depend->name() + ":" + depend->architecture();

dependList << dependName;
dependArchMap.insert(dependName, packageArch);
depend = nullptr;

if (dinfo.packageName().contains("deepin-wine")) // 如果依赖中出现deepin-wine字段。则是wine应用
isWineApplication = true;

}
}
}
Expand All @@ -805,11 +814,18 @@ PackageDependsStatus PackagesManager::getPackageDependsStatus(const int index)
do {
if (isWineApplication && dependsStatus.status != DebListModel::DependsOk) { //增加是否是wine应用的判断
//额外判断wine依赖是否已安装,同时剔除非wine依赖
auto removedIter = std::remove_if(dependList.begin(), dependList.end(), [&debFile, this](const QString & eachDepend) {
auto removedIter = std::remove_if(dependList.begin(), dependList.end(), [&debFile, &dependArchMap, this](const QString & eachDepend) {
if (!eachDepend.contains("deepin-wine")) {
return true;
}
auto package = packageWithArch(eachDepend, debFile.architecture());

// 使用软件包架构查询
QString packageArch = dependArchMap.value(eachDepend);
if (Q_UNLIKELY(packageArch.isEmpty())) {
packageArch = debFile.architecture();
}

auto package = packageWithArch(eachDepend, packageArch);
return !package->installedVersion().isEmpty();
});
dependList.erase(removedIter, dependList.end());
Expand Down

0 comments on commit bf9388e

Please sign in to comment.