feat(aptssupdater): 添加包安装状态检查方法并优化更新合并逻辑

添加 isPackageInstalledInAptss 和 isPackageInstalledInApm 方法检查包安装状态
优化 mergeUpdateInfo 逻辑,根据包安装状态判断是否为迁移场景
This commit is contained in:
2026-04-05 10:57:22 +08:00
parent 1becfbc9be
commit 462cdc38bf
3 changed files with 45 additions and 5 deletions

View File

@@ -647,9 +647,14 @@ QJsonArray aptssUpdater::mergeUpdateInfo()
QString aptssVersion = aptssObj["new_version"].toString(); QString aptssVersion = aptssObj["new_version"].toString();
QString apmVersion = apmObj["new_version"].toString(); QString apmVersion = apmObj["new_version"].toString();
// 检查是否为迁移场景APM版本更新且当前包是通过aptss安装的 // 检查包在两个源中的安装状态
// 通过检查aptss中是否有当前版本号来判断是否通过aptss安装 bool installedInAptss = isPackageInstalledInAptss(packageName);
if (apmVersion > aptssVersion) { bool installedInApm = isPackageInstalledInApm(packageName);
// 判断是否为迁移场景:
// 1. 只在 aptss 中安装了包(不在 apm 中安装)
// 2. APM 版本更新
if (installedInAptss && !installedInApm && apmVersion > aptssVersion) {
// 迁移场景Spark -> APM // 迁移场景Spark -> APM
QJsonObject migrationObj = apmObj; QJsonObject migrationObj = apmObj;
migrationObj["is_migration"] = true; migrationObj["is_migration"] = true;
@@ -661,7 +666,11 @@ QJsonArray aptssUpdater::mergeUpdateInfo()
// 同时保留aptss的更新项如果aptss也有更新 // 同时保留aptss的更新项如果aptss也有更新
mergedArray.append(aptssObj); mergedArray.append(aptssObj);
} else { } else {
// 非迁移场景:同时展示两个来源的更新 // 非迁移场景(共存场景):同时展示两个来源的更新
// 包括以下情况:
// 1. 同时在 aptss 和 apm 中都安装了包
// 2. 只在 apm 中安装了包
// 3. APM 版本不更新
mergedArray.append(aptssObj); mergedArray.append(aptssObj);
mergedArray.append(apmObj); mergedArray.append(apmObj);
} }
@@ -671,3 +680,30 @@ QJsonArray aptssUpdater::mergeUpdateInfo()
qDebug()<<"合并后的更新信息:"<<mergedArray; qDebug()<<"合并后的更新信息:"<<mergedArray;
return mergedArray; return mergedArray;
} }
bool aptssUpdater::isPackageInstalledInAptss(const QString &packageName)
{
QProcess process;
QString command = QString("dpkg -s '%1' 2>/dev/null | grep -q 'Status: install ok installed'").arg(packageName);
process.start("bash", QStringList() << "-c" << command);
if (!process.waitForFinished(5000)) {
process.kill();
return false;
}
return process.exitCode() == 0;
}
bool aptssUpdater::isPackageInstalledInApm(const QString &packageName)
{
QProcess process;
process.start("apm", QStringList() << "list" << "--installed");
if (!process.waitForFinished(30000)) {
process.kill();
return false;
}
QString output = process.readAllStandardOutput();
// 解析格式: pkgname/repo,section version arch [flags]
// 或: pkgname/repo version arch [flags]
QRegularExpression regex(QString("^%1/\\S+(?:,\\S+)?\\s+\\S+\\s+\\S+\\s+\\[").arg(QRegularExpression::escape(packageName)));
return regex.match(output).hasMatch();
}

View File

@@ -30,6 +30,10 @@ private:
bool checkDesktopFiles(const QStringList &desktopFiles, QString &appName, const QString &lang, const QString &packageName); bool checkDesktopFiles(const QStringList &desktopFiles, QString &appName, const QString &lang, const QString &packageName);
QStringList packageName; QStringList packageName;
QStringList apmPackageName; // APM 包列表 QStringList apmPackageName; // APM 包列表
// 检查包安装状态的方法
bool isPackageInstalledInAptss(const QString &packageName); // 检查包是否在 aptss 中已安装
bool isPackageInstalledInApm(const QString &packageName); // 检查包是否在 apm 中已安装
}; };
#endif // APTSSUPDATER_H #endif // APTSSUPDATER_H

View File

@@ -5,7 +5,7 @@ readonly ACE_ENVIRONMENTS=(
"deepin23-run:amber-ce-deepin23" "deepin23-run:amber-ce-deepin23"
"sid-run:amber-ce-sid" "sid-run:amber-ce-sid"
) )
dpkg -s '$1' 2>/dev/null | grep -q 'Status: install ok installed' > /dev/null 2>&1 dpkg -s "$1" 2>/dev/null | grep -q 'Status: install ok installed' > /dev/null 2>&1
RET="$?" RET="$?"
if [[ "$RET" != "0" ]] && [[ "$IS_ACE_ENV" == "" ]];then ## 如果未在ACE环境中 if [[ "$RET" != "0" ]] && [[ "$IS_ACE_ENV" == "" ]];then ## 如果未在ACE环境中