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

Master merge release/eagle. #218

Merged
merged 14 commits into from
Jul 26, 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
6 changes: 3 additions & 3 deletions .tx/config
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@ host = https://www.transifex.com
minimum_perc = 80
mode = developer

[deepin-package-manager.deepin-deb-installer]
[o:linuxdeepin:p:deepin-package-manager:r:deepin-deb-installer]
file_filter = translations/deepin-deb-installer_<lang>.ts
source_file = translations/deepin-deb-installer.ts
preTranlate_file = src/deb_installer/deepin-deb-installer.desktop
source_lang = en
type = QT

[deepin-package-manager.deepin-deb-installer_desktop]
[o:linuxdeepin:p:deepin-package-manager:r:deepin-deb-installer_desktop]
file_filter = translations/desktop/desktop_<lang>.ts
source_file = translations/desktop/desktop.ts
preTranlate_file = src/deb_installer/deepin-deb-installer.desktop
source_lang = en
type = QT

[deepin-package-manager.deepin-deb-installer-policy-ts]
[o:linuxdeepin:p:deepin-package-manager:r:deepin-deb-installer-policy-ts]
file_filter = translations/policy/policy_<lang>.ts
source_file = translations/policy/policy.ts
source_lang = en
Expand Down
53 changes: 34 additions & 19 deletions assets/data/deepin-deb-installer.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,35 @@
{
"groups": [{
"key": "basic",
"name": "Basic",
"groups": [{
"key": "develop_digital_verify",
"name": "",
"options": [
{
"key": "",
"name": "",
"type": "verifycheckbox",
"text": "Check digital signatures if the developer mode is enabled",
"default": false
}
]
}
]
}]
}
"groups": [
{
"key": "basic",
"name": "Basic",
"groups": [
{
"key": "develop_digital_verify",
"name": "",
"options": [
{
"key": "",
"name": "",
"type": "checkbox",
"text": "Check digital signatures if the developer mode is enabled",
"default": false,
"hide": false
}
]
},
{
"key": "hierarachical_verify",
"name": "",
"options": [
{
"key": "proceedSecurity",
"type": "proceedLabel",
"hide": false
}
]
}
]
}
]
}
2 changes: 1 addition & 1 deletion src/deb-installer/manager/DealDependThread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ void DealDependThread::slotReadOutput()
if (HierarchicalVerify::instance()->checkTransactionError(m_brokenDepend, tmp)) {
bVerifyStatusErr = true;
qWarning() << QString("[Hierarchical] Install Wine dependency not verify, [output]: %1").arg(tmp);
emit signalDependResult(DebListModel::VerifyDependsErr, m_index, m_brokenDepend);
// 结束后统一发送信号
}
}

Expand Down
70 changes: 58 additions & 12 deletions src/deb-installer/manager/packagesmanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -402,7 +402,7 @@ const ConflictResult PackagesManager::isConflictSatisfy(const QString &arch, Pac
const ConflictResult PackagesManager::isInstalledConflict(const QString &packageName, const QString &packageVersion,
const QString &packageArch)
{
static QList<QPair<QLatin1String, DependencyInfo>> sysConflicts;
static QList<QPair<QString, DependencyInfo>> sysConflicts;

if (sysConflicts.isEmpty()) {
Backend *backend = PackageAnalyzer::instance().backendPtr();
Expand All @@ -421,7 +421,9 @@ const ConflictResult PackagesManager::isInstalledConflict(const QString &package

for (const auto &conflict_list : conflicts)
for (const auto &conflict : conflict_list) {
sysConflicts << QPair<QLatin1String, DependencyInfo>(pkg->name(), conflict);
// FIXME: 在 Realse 模式下,某些场景后续调用 QLatin1String 时可能访问失败(内存被释放)!
// 临时修改为拷贝数据。
sysConflicts << QPair<QString, DependencyInfo>(pkg->name(), conflict);
}
pkg = nullptr;
}
Expand Down Expand Up @@ -722,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 @@ -739,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 @@ -771,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 @@ -803,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 Expand Up @@ -1101,6 +1119,12 @@ const QStringList PackagesManager::packageReverseDependsList(const QString &pack
continue;
}

// Conflict / Replace / Break 的反向依赖同样跳过
if (isNegativeReverseDepend(packageName, currentPackage)) {
currentPackage = nullptr;
continue;
}

reverseDependSet << item;

if (specialPackage().contains(item))
Expand Down Expand Up @@ -1141,6 +1165,28 @@ const QStringList PackagesManager::packageReverseDependsList(const QString &pack
return reverseDependSet.toList();
}

bool PackagesManager::isNegativeReverseDepend(const QString &packageName, const QApt::Package *reverseDepend)
{
if (!reverseDepend) {
return false;
}

static auto containPackage = [](const QString &packageName, const QList<DependencyItem> &itemList) -> bool {
return std::any_of(itemList.begin(), itemList.end(), [&](const DependencyItem &item) {
return std::any_of(
item.begin(), item.end(), [&](const DependencyInfo &info) { return info.packageName() == packageName; });
});
};

// 不排除部分包设置 替换(Replace)/破坏(Breaks) 仍依赖 packageName , Depends 字段设置视为非消极包
if (containPackage(packageName, reverseDepend->depends())) {
return false;
}

return containPackage(packageName, reverseDepend->conflicts()) || containPackage(packageName, reverseDepend->replaces()) ||
containPackage(packageName, reverseDepend->breaks());
}

void PackagesManager::reset()
{
m_errorIndex.clear();
Expand Down
12 changes: 12 additions & 0 deletions src/deb-installer/manager/packagesmanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -370,6 +370,18 @@ public slots:
const QList<DependencyItem> &conflicts,
const QList<DependencyItem> &replaces);

//// 依赖查找 获取查找包是否为消极的反向依赖
private:
/**
* @brief isNegativeReverseDepend 判断软件包 `reverseDepend` 是否是 `packageName` 的消极依赖包,
* 例如 冲突(Conflict)/替换(Replace)/破坏(Breaks) 这些包在卸载时将被跳过,
* 在 依赖(Depends) 字段设置包将不会被视为消极包。
* @param packageName 当前处理的软件包
* @param reverseDepend `packageName` 的反向依赖包
* @return `reverseDepend` 是否为 `packageName` 的消极依赖
*/
bool isNegativeReverseDepend(const QString &packageName, const QApt::Package *reverseDepend);

private:
/**
* @brief packageWithArch 从指定的架构上打包
Expand Down
Loading
Loading