Compare commits

..

31 Commits

Author SHA1 Message Date
shenmo7192 fc2ae7644a update tool/ssinstall.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-29 05:01:01 +00:00
shenmo7192 8e50fe8a43 Revert "drop所有i386软件包支持"
This reverts commit 024262957c.
2026-03-28 05:02:45 +00:00
shenmo7192 024262957c drop所有i386软件包支持
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-28 04:52:44 +00:00
shenmo7192 141d42ef96 不再依赖dpkg-dev,兼容AOSC OS
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-28 04:46:07 +00:00
shenmo7192 7c60b29f42 修复 aptss download 会创建 tmp 垃圾文件的问题 2026-03-22 17:57:23 +08:00
shenmo7192 7f63ea0446 适配 APM 2026-03-22 17:28:00 +08:00
shenmo7192 d36192b49c update debian/spark-store.postinst.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-15 13:00:23 +00:00
shenmo7192 2c38118576 update spark-update-tool/CMakeLists.txt.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-15 12:52:46 +00:00
shenmo7192 d0608308e5 update spark-update-tool/spark-update-tool.pro.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-15 12:51:57 +00:00
shenmo7192 1477994b66 ssinstall
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-08 05:16:03 +00:00
shenmo7192 5309e82af7 ssinstall
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-08 05:06:18 +00:00
shenmo7192 2dbb80782d ssinstall
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-08 05:01:20 +00:00
shenmo7192 15902ef2f2 ssinstall
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-08 05:00:11 +00:00
shenmo7192 2a54d4e238 修复 ACE安装 失败的问题
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-03-08 04:54:01 +00:00
shenmo7192 06840595cc 修复判断错误的问题
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-02-19 13:06:35 +00:00
shenmo7192 fda3f70d5d feat: 提升检查是否安装的效率
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-02-19 12:39:36 +00:00
shenmo7192 a960c49235 update debian/spark-store.postinst.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-02-02 13:18:44 +00:00
momen 5d1dd1fde9 update:将qt5.11环境更改为推荐项 2026-01-21 09:13:34 +08:00
momen bd13b73d58 update:当开发环境不为qt5.11时,则提示需要下载对应环境并给出下载链接 2026-01-21 08:55:38 +08:00
momen 8c4e71cdf6 update:添加构建deb脚本与debian文件 2026-01-20 11:10:34 +08:00
momen d04a34b726 update:添加构建脚本 2026-01-19 23:02:59 +08:00
shenmo7192 bd62eeb050 update builddeps 2026-01-19 19:43:39 +08:00
shenmo7192 69d2efcbd9 update debian/changelog.
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2026-01-19 11:35:54 +00:00
shenmo7192 bc98aaee9e !378 fix: blurry icons and images when build with Qt 5
Merge pull request !378 from BLumia/fix-blurry
2026-01-19 11:34:52 +00:00
Wang Zichong 60b379268d fix: blurry icons and images when build with Qt 5
This fix the issue that the icons on sidebar and the mascot on about
dialog is blurry.
2026-01-19 16:53:08 +08:00
shenmo7192 3623850f63 Sync: Spark Update Tool 2026-01-17 10:23:11 +08:00
shenmo7192 5d4ee291d5 !377 fix(Qt6): FTBFS with Qt 6
Merge pull request !377 from BLumia/qt6
2026-01-15 10:27:36 +00:00
Wang Zichong 14d7d26d0a fix(Qt6): FTBFS with Qt 6
1. QMake project file should use dtk6 when build with Qt 6
2. FollowRedirects attr for QNetworkRequest is on by default on Qt 6
3. QLabel::pixmap() always return a QPixmap instead of a const pointer
2026-01-15 13:27:52 +08:00
shenmo7192 5a790abb27 fix: Use svg icon to fix https://gitee.com/spark-store-project/spark-store/issues/IDAWEQ 2025-12-05 15:44:22 +08:00
shenmo7192 1f4803561c 修复:在存在空格时无法正确创建desktop
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2025-11-28 14:00:38 +00:00
shenmo7192 4909ddf220 修复 发送过多的desktop文件
Signed-off-by: shenmo <jifengshenmo@outlook.com>
2025-11-27 07:14:36 +00:00
43 changed files with 1834 additions and 274 deletions
-1
View File
@@ -27,7 +27,6 @@ ui_*.h
*.qmlc
*.jsc
Makefile*
*build-*
# Qt unit tests
target_wrapper.*
+157
View File
@@ -0,0 +1,157 @@
# Spark Store 编译脚本使用指南
本项目包含 4 个编译脚本,支持 Qt5 和 Qt6 并行编译。
## 脚本文件
### 1. **Qt5 编译脚本** (`build-qt5.sh`)
**功能**: 仅编译 Qt5 版本
```bash
./build-qt5.sh
```
**输出**:
- 编译目录: `build/qt5-Debug/`
- 可执行文件: `build/qt5-Debug/src/spark-store`
### 2. **Qt5 编译和运行脚本** (`build-run-qt5.sh`)
**功能**: 编译 Qt5 版本并立即运行
```bash
./build-run-qt5.sh
```
**流程**: 编译 → 运行应用(前台)
### 3. **Qt6 编译脚本** (`build-qt6.sh`)
**功能**: 仅编译 Qt6 版本
```bash
./build-qt6.sh
```
**输出**:
- 编译目录: `build/qt6-Debug/`
- 可执行文件: `build/qt6-Debug/src/spark-store`
### 4. **Qt6 编译和运行脚本** (`build-run-qt6.sh`)
**功能**: 编译 Qt6 版本并立即运行
```bash
./build-run-qt6.sh
```
**流程**: 编译 → 运行应用(前台)
## 快速开始
### 编译 Qt6 版本
```bash
cd /home/momen/Desktop/spark-git/spark-store
./build-qt6.sh
```
### 编译并运行 Qt5 版本
```bash
cd /home/momen/Desktop/spark-git/spark-store
./build-run-qt5.sh
```
### 编译两个版本(共存)
```bash
# 先编译 Qt6
./build-qt6.sh
# 再编译 Qt5
./build-qt5.sh
```
## 脚本特性
**自动检测**: 检查 Qt 工具是否安装
**并行编译**: 使用 `make -j$(nproc)` 利用所有 CPU 核心
**结果验证**: 编译完成后验证可执行文件
**错误处理**: 编译失败时立即停止并报错
**清洁构建**: 每次都从头开始(删除旧构建目录)
## 构建目录结构
```
spark-store/
├── build/
│ ├── qt5-Debug/ # Qt5 构建目录
│ │ ├── src/
│ │ │ └── spark-store (可执行文件)
│ │ └── spark-update-tool/
│ │ └── spark-update-tool (可执行文件)
│ └── qt6-Debug/ # Qt6 构建目录
│ ├── src/
│ │ └── spark-store (可执行文件)
│ └── spark-update-tool/
│ └── spark-update-tool (可执行文件)
├── build-qt5.sh
├── build-run-qt5.sh
├── build-qt6.sh
└── build-run-qt6.sh
```
## 环境要求
### Qt5
- qmake 路径: `/usr/lib/qt5/bin/qmake`
- Qt 版本: 5.15.15+
### Qt6
- qmake6 路径: `/usr/lib/qt6/bin/qmake6`
- Qt 版本: 6.8.2+
### 构建工具
- GCC/G++ 编译器
- make 工具
- pkg-config
## 故障排除
### 问题: 未找到 Qt qmake
**解决**:
```bash
# 检查 Qt 安装
which qmake # 检查 Qt5
/usr/lib/qt6/bin/qmake6 --version # 检查 Qt6
```
### 问题: 编译出错
**解决**:
1. 检查所有依赖是否安装
2. 确保有充足的磁盘空间
3. 查看完整的错误信息
4. 尝试清理构建目录
## 高级用法
### 仅运行已编译的应用(不重新编译)
```bash
# Qt5
./build/qt5-Debug/src/spark-store
# Qt6
./build/qt6-Debug/src/spark-store
```
### 后台运行应用
```bash
# Qt5 后台运行
./build/qt5-Debug/src/spark-store &
# Qt6 后台运行
./build/qt6-Debug/src/spark-store &
```
### 跳过编译直接运行
```bash
# 如果已编译,可直接运行
./build/qt6-Debug/src/spark-store
```
## 脚本维护
这些脚本会在每次运行时:
1. 检查 Qt 工具可用性
2. 清理旧的构建目录
3. 生成新的 Makefile
4. 编译项目
5. 验证编译结果
+91
View File
@@ -0,0 +1,91 @@
#!/bin/bash
# Spark Store - 构建 Qt5 和 Qt6 两个版本的 DEB 包
# Build both Qt5 and Qt6 versions of DEB packages
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR"
echo "========================================="
echo "Spark Store - 双版本 DEB 构建"
echo "========================================="
echo ""
echo "项目目录: $PROJECT_ROOT"
echo ""
# 检查脚本存在
if [ ! -f "$PROJECT_ROOT/build-deb-qt5.sh" ] || [ ! -f "$PROJECT_ROOT/build-deb-qt6.sh" ]; then
echo "错误: 构建脚本不存在"
exit 1
fi
# 检查 debian 目录存在
if [ ! -d "$PROJECT_ROOT/debian" ]; then
echo "错误: debian 目录不存在"
exit 1
fi
# 构建 Qt5
echo "================================"
echo "第一步:构建 Qt5 版本..."
echo "================================"
cd "$PROJECT_ROOT"
./build-deb-qt5.sh
# 检查输出
if ! ls ../*_qt5_amd64.deb 2>/dev/null | grep -q . ; then
echo "错误: Qt5 构建失败,未找到输出文件"
exit 1
fi
QT5_DEB=$(ls -t ../*_qt5_amd64.deb 2>/dev/null | head -1)
echo "✓ Qt5 版本已构建: $QT5_DEB"
echo ""
# 清理构建文件以进行下一次构建
echo "清理构建环境..."
cd "$PROJECT_ROOT"
rm -rf build-*/spark-update-tool build-*/src build-*/Makefile
# 构建 Qt6
echo "================================"
echo "第二步:构建 Qt6 版本..."
echo "================================"
cd "$PROJECT_ROOT"
./build-deb-qt6.sh
# 检查输出
if ! ls ../*_qt6_amd64.deb 2>/dev/null | grep -q . ; then
echo "错误: Qt6 构建失败,未找到输出文件"
exit 1
fi
QT6_DEB=$(ls -t ../*_qt6_amd64.deb 2>/dev/null | head -1)
echo "✓ Qt6 版本已构建: $QT6_DEB"
echo ""
# 显示最终结果
echo "========================================="
echo "✓ 构建完成!"
echo "========================================="
echo ""
echo "输出文件:"
ls -lh "$QT5_DEB" "$QT6_DEB" 2>/dev/null
echo ""
# 显示版本信息
echo "验证 Qt5 版本:"
dpkg -I "$QT5_DEB" | grep -E "Description:|Package:" | head -2
echo ""
echo "验证 Qt6 版本:"
dpkg -I "$QT6_DEB" | grep -E "Description:|Package:" | head -2
echo ""
echo "========================================="
echo "安装选项:"
echo " Qt5: sudo apt install $QT5_DEB"
echo " Qt6: sudo apt install $QT6_DEB"
echo "========================================="
+61
View File
@@ -0,0 +1,61 @@
#!/bin/bash
# Spark Store - Qt5 DEB Package Builder
# 构建 Qt5 版本的 DEB 包
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR"
echo "========================================="
echo "构建 Spark Store - Qt5 版本"
echo "========================================="
echo ""
# 检查 debian 目录是否存在
if [ ! -d "$PROJECT_ROOT/debian" ]; then
echo "错误: $PROJECT_ROOT/debian 目录不存在"
exit 1
fi
# 检查必要的文件
if [ ! -f "$PROJECT_ROOT/debian/control" ] || [ ! -f "$PROJECT_ROOT/debian/rules" ]; then
echo "错误: debian 目录中缺少必要的文件"
exit 1
fi
echo "使用 Qt5 构建..."
echo "Debian 配置目录: $PROJECT_ROOT/debian"
echo ""
# 构建 DEB 包,传递 Qt 版本标志
cd "$PROJECT_ROOT"
echo "开始构建..."
QT_VERSION=qt5 dpkg-buildpackage -us -uc -b
BUILD_STATUS=$?
if [ $BUILD_STATUS -eq 0 ]; then
echo ""
echo "========================================="
echo "✓ Qt5 DEB 包构建成功!"
echo "========================================="
# 重命名 DEB 文件以包含 qt5 标识
DEB_FILE=$(find "$PROJECT_ROOT/.." -maxdepth 1 -name "spark-store_*_$(dpkg-architecture -qDEB_BUILD_ARCH).deb" -type f -printf '%T@ %p\n' | sort -rn | head -1 | cut -d' ' -f2-)
if [ -n "$DEB_FILE" ] && [ -f "$DEB_FILE" ]; then
DEB_DIR=$(dirname "$DEB_FILE")
DEB_BASENAME=$(basename "$DEB_FILE")
DEB_NEW_NAME=$(echo "$DEB_BASENAME" | sed 's/_\([^_]*\)\.deb$/_qt5_\1.deb/')
DEB_NEW_PATH="$DEB_DIR/$DEB_NEW_NAME"
mv "$DEB_FILE" "$DEB_NEW_PATH"
echo "DEB 文件已重命名为: $DEB_NEW_NAME"
fi
else
echo ""
echo "========================================="
echo "✗ Qt5 DEB 包构建失败"
echo "========================================="
exit 1
fi
+61
View File
@@ -0,0 +1,61 @@
#!/bin/bash
# Spark Store - Qt6 DEB Package Builder
# 构建 Qt6 版本的 DEB 包
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$SCRIPT_DIR"
echo "========================================="
echo "构建 Spark Store - Qt6 版本"
echo "========================================="
echo ""
# 检查 debian 目录是否存在
if [ ! -d "$PROJECT_ROOT/debian" ]; then
echo "错误: $PROJECT_ROOT/debian 目录不存在"
exit 1
fi
# 检查必要的文件
if [ ! -f "$PROJECT_ROOT/debian/control" ] || [ ! -f "$PROJECT_ROOT/debian/rules" ]; then
echo "错误: debian 目录中缺少必要的文件"
exit 1
fi
echo "使用 Qt6 构建..."
echo "Debian 配置目录: $PROJECT_ROOT/debian"
echo ""
# 构建 DEB 包,传递 Qt 版本标志
cd "$PROJECT_ROOT"
echo "开始构建..."
QT_VERSION=qt6 dpkg-buildpackage -us -uc -b
BUILD_STATUS=$?
if [ $BUILD_STATUS -eq 0 ]; then
echo ""
echo "========================================="
echo "✓ Qt6 DEB 包构建成功!"
echo "========================================="
# 重命名 DEB 文件以包含 qt6 标识
DEB_FILE=$(find "$PROJECT_ROOT/.." -maxdepth 1 -name "spark-store_*_$(dpkg-architecture -qDEB_BUILD_ARCH).deb" -type f -printf '%T@ %p\n' | sort -rn | head -1 | cut -d' ' -f2-)
if [ -n "$DEB_FILE" ] && [ -f "$DEB_FILE" ]; then
DEB_DIR=$(dirname "$DEB_FILE")
DEB_BASENAME=$(basename "$DEB_FILE")
DEB_NEW_NAME=$(echo "$DEB_BASENAME" | sed 's/_\([^_]*\)\.deb$/_qt6_\1.deb/')
DEB_NEW_PATH="$DEB_DIR/$DEB_NEW_NAME"
mv "$DEB_FILE" "$DEB_NEW_PATH"
echo "DEB 文件已重命名为: $DEB_NEW_NAME"
fi
else
echo ""
echo "========================================="
echo "✗ Qt6 DEB 包构建失败"
echo "========================================="
exit 1
fi
Executable
+65
View File
@@ -0,0 +1,65 @@
#!/bin/bash
# Qt5 编译脚本
set -e
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="${PROJECT_ROOT}/build/qt5-Debug"
echo "================================"
echo "Qt5 编译脚本"
echo "================================"
echo ""
# 检查 Qt5 qmake
if ! command -v /usr/lib/qt5/bin/qmake &> /dev/null; then
echo "错误: 未找到 Qt5 qmake"
echo "请确保 Qt5 已安装: /usr/lib/qt5/bin/qmake"
exit 1
fi
echo "Qt5 版本:"
/usr/lib/qt5/bin/qmake --version
echo ""
# 创建构建目录
echo "创建构建目录: ${BUILD_DIR}"
rm -rf "${BUILD_DIR}"
mkdir -p "${BUILD_DIR}"
echo ""
# 生成 Makefile
echo "生成 Makefile..."
cd "${BUILD_DIR}"
/usr/lib/qt5/bin/qmake "${PROJECT_ROOT}/spark-store-project.pro" -r CONFIG+=debug
echo ""
# 编译
echo "开始编译..."
make -j$(nproc)
echo ""
echo "================================"
echo "Qt5 编译完成!"
echo "================================"
echo ""
echo "可执行文件位置:"
echo " 主应用: ${BUILD_DIR}/src/spark-store"
echo " 更新工具: ${BUILD_DIR}/spark-update-tool/spark-update-tool"
echo ""
# 验证编译结果
if [ -f "${BUILD_DIR}/src/spark-store" ]; then
echo "✓ 主应用编译成功"
ls -lh "${BUILD_DIR}/src/spark-store"
else
echo "✗ 主应用编译失败"
exit 1
fi
if [ -f "${BUILD_DIR}/spark-update-tool/spark-update-tool" ]; then
echo "✓ 更新工具编译成功"
ls -lh "${BUILD_DIR}/spark-update-tool/spark-update-tool"
fi
echo ""
Executable
+65
View File
@@ -0,0 +1,65 @@
#!/bin/bash
# Qt6 编译脚本
set -e
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="${PROJECT_ROOT}/build/qt6-Debug"
echo "================================"
echo "Qt6 编译脚本"
echo "================================"
echo ""
# 检查 Qt6 qmake
if ! command -v /usr/lib/qt6/bin/qmake6 &> /dev/null; then
echo "错误: 未找到 Qt6 qmake6"
echo "请确保 Qt6 已安装: /usr/lib/qt6/bin/qmake6"
exit 1
fi
echo "Qt6 版本:"
/usr/lib/qt6/bin/qmake6 --version
echo ""
# 创建构建目录
echo "创建构建目录: ${BUILD_DIR}"
rm -rf "${BUILD_DIR}"
mkdir -p "${BUILD_DIR}"
echo ""
# 生成 Makefile
echo "生成 Makefile..."
cd "${BUILD_DIR}"
/usr/lib/qt6/bin/qmake6 "${PROJECT_ROOT}/spark-store-project.pro" -r CONFIG+=debug
echo ""
# 编译
echo "开始编译..."
make -j$(nproc)
echo ""
echo "================================"
echo "Qt6 编译完成!"
echo "================================"
echo ""
echo "可执行文件位置:"
echo " 主应用: ${BUILD_DIR}/src/spark-store"
echo " 更新工具: ${BUILD_DIR}/spark-update-tool/spark-update-tool"
echo ""
# 验证编译结果
if [ -f "${BUILD_DIR}/src/spark-store" ]; then
echo "✓ 主应用编译成功"
ls -lh "${BUILD_DIR}/src/spark-store"
else
echo "✗ 主应用编译失败"
exit 1
fi
if [ -f "${BUILD_DIR}/spark-update-tool/spark-update-tool" ]; then
echo "✓ 更新工具编译成功"
ls -lh "${BUILD_DIR}/spark-update-tool/spark-update-tool"
fi
echo ""
+57
View File
@@ -0,0 +1,57 @@
#!/bin/bash
# Qt5 编译和运行脚本
set -e
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="${PROJECT_ROOT}/build/qt5-Debug"
echo "================================"
echo "Qt5 编译和运行脚本"
echo "================================"
echo ""
# 检查 Qt5 qmake
if ! command -v /usr/lib/qt5/bin/qmake &> /dev/null; then
echo "错误: 未找到 Qt5 qmake"
echo "请确保 Qt5 已安装: /usr/lib/qt5/bin/qmake"
exit 1
fi
echo "Qt5 版本:"
/usr/lib/qt5/bin/qmake --version
echo ""
# 创建构建目录
echo "创建构建目录: ${BUILD_DIR}"
rm -rf "${BUILD_DIR}"
mkdir -p "${BUILD_DIR}"
echo ""
# 生成 Makefile
echo "生成 Makefile..."
cd "${BUILD_DIR}"
/usr/lib/qt5/bin/qmake "${PROJECT_ROOT}/spark-store-project.pro" -r CONFIG+=debug
echo ""
# 编译
echo "开始编译..."
make -j$(nproc)
echo ""
echo "✓ 编译完成!"
echo ""
# 运行应用
SPARK_STORE="${BUILD_DIR}/src/spark-store"
if [ -f "${SPARK_STORE}" ]; then
echo "================================"
echo "启动 spark-storeQt5"
echo "================================"
echo ""
"${SPARK_STORE}"
else
echo "错误: spark-store 未找到"
exit 1
fi
+57
View File
@@ -0,0 +1,57 @@
#!/bin/bash
# Qt6 编译和运行脚本
set -e
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="${PROJECT_ROOT}/build/qt6-Debug"
echo "================================"
echo "Qt6 编译和运行脚本"
echo "================================"
echo ""
# 检查 Qt6 qmake
if ! command -v /usr/lib/qt6/bin/qmake6 &> /dev/null; then
echo "错误: 未找到 Qt6 qmake6"
echo "请确保 Qt6 已安装: /usr/lib/qt6/bin/qmake6"
exit 1
fi
echo "Qt6 版本:"
/usr/lib/qt6/bin/qmake6 --version
echo ""
# 创建构建目录
echo "创建构建目录: ${BUILD_DIR}"
rm -rf "${BUILD_DIR}"
mkdir -p "${BUILD_DIR}"
echo ""
# 生成 Makefile
echo "生成 Makefile..."
cd "${BUILD_DIR}"
/usr/lib/qt6/bin/qmake6 "${PROJECT_ROOT}/spark-store-project.pro" -r CONFIG+=debug
echo ""
# 编译
echo "开始编译..."
make -j$(nproc)
echo ""
echo "✓ 编译完成!"
echo ""
# 运行应用
SPARK_STORE="${BUILD_DIR}/src/spark-store"
if [ -f "${SPARK_STORE}" ]; then
echo "================================"
echo "启动 spark-storeQt6"
echo "================================"
echo ""
"${SPARK_STORE}"
else
echo "错误: spark-store 未找到"
exit 1
fi
+8
View File
@@ -1,3 +1,11 @@
spark-store (4.8.4) UNRELEASED; urgency=medium
* 修复 软件更新器更新无法正确处理忽略的软件包
* 修复 在高分屏下 左侧的分类图标模糊问题,感谢 @Blumia
* 合并 qt5和qt6分支
-- shenmo <shenmo@spark-app.store> Tue, 28 Aug 2025 01:03:08 +0800
spark-store (4.8.3) UNRELEASED; urgency=medium
* 更新软件主图标
+15 -12
View File
@@ -5,14 +5,14 @@ Priority: optional
Build-Depends:
debhelper (>= 9),
pkg-config,
qtchooser (>= 55-gc9562a1-1~) | qt5-default,
qtbase5-dev,
libqt5svg5-dev,
qttools5-dev-tools,
qtwebengine5-dev,
libdtkcore-dev (>= 5.0),
libdtkgui-dev (>= 5.0),
libdtkwidget-dev (>= 5.0)
qtchooser (>= 55-gc9562a1-1~) | qt5-default | qt6-base-dev,
qtbase5-dev | qt6-base-dev,
libqt5svg5-dev | libqt6svg6-dev,
qttools5-dev-tools | qt6-tools-dev,
qtwebengine5-dev | qt6-webengine-dev,
libdtkcore-dev (>= 5.0) | libdtk6core-dev (>= 6.0),
libdtkgui-dev (>= 5.0) | libdtk6gui-dev (>= 6.0),
libdtkwidget-dev (>= 5.0) | libdtk6widget-dev (>= 6.0)
Standards-Version: 4.1.7
Homepage: https://www.spark-app.store/
@@ -20,17 +20,20 @@ Package: spark-store
Architecture: any
Provides: spark-store-console-in-container
Depends: ${shlibs:Depends}, ${misc:Depends},
dde-qt5integration,
libdtkcore5 (>= 5.0) | libdtk6core (>= 6.0),
libdtkgui5 (>= 5.0) | libdtk6gui (>= 6.0),
libdtkwidget5 (>= 5.0) | libdtk6widget (>= 6.0),
dde-qt5integration | dde-qt6integration,
curl,
openssl,
aria2,
gnupg,
zenity,
policykit-1 | pkexec,
policykit-1 | pkexec | polkit,
libnotify-bin,
qtwayland5,
qtwayland5 | qt6-wayland | qt-5,
desktop-file-utils,
dpkg-dev,
lsb-release,
Description: Spark Store
A community powered app store, based on DTK.
Supports both Qt5 and Qt6 versions.
+1
View File
@@ -0,0 +1 @@
spark-store
+16 -4
View File
@@ -1,6 +1,18 @@
#!/usr/bin/make -f
export QT_SELECT = qt5
# Determine Qt version based on QT_VERSION environment variable
# Default to Qt5 if not specified
# Usage: QT_VERSION=qt6 dpkg-buildpackage -us -uc -b
QT_VERSION ?= qt5
ifeq ($(QT_VERSION),qt6)
export QT_SELECT = qt6
QMAKE_CMD = qmake6
else
export QT_SELECT = qt5
QMAKE_CMD = qmake
endif
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
include /usr/share/dpkg/default.mk
@@ -22,7 +34,7 @@ override_dh_auto_clean:
override_dh_auto_configure:
mkdir -p $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
$(QMAKE_CMD) BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
-spec linux-g++ CONFIG+=force_debug_info \
-o $(CURDIR)/build-$(DEB_HOST_MULTIARCH)/
@@ -34,8 +46,8 @@ override_dh_auto_install:
INSTALL_ROOT=$(CURDIR)/debian/spark-store
# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
# Qt Mutidedia lib will ref to network libraray.
# Qt Multimedia lib will ref to network library.
override_dh_shlibdeps:
dh_shlibdeps --dpkg-shlibdeps-params=--warnings=0 --exclude=opt/durapps/spark-store/bin/ss-feedback/
override_dh_strip:
dh_strip --exclude=opt/durapps/spark-store/bin/ss-feedback/
dh_strip --exclude=opt/durapps/spark-store/bin/ss-feedback/
+1 -1
View File
@@ -42,7 +42,7 @@ case "$1" in
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
ln -sf /usr/lib/qt5/bin/spark-update-tool /usr/bin/spark-update-tool
# Install key
Binary file not shown.

Before

Width:  |  Height:  |  Size: 381 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 34 KiB

+55 -15
View File
@@ -9,7 +9,8 @@ set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt5 REQUIRED COMPONENTS Widgets Network Concurrent)
find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets Network Concurrent)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets Network Concurrent)
set(PROJECT_SOURCES
src/main.cpp
@@ -29,31 +30,70 @@ set(PROJECT_SOURCES
src/ignoreconfig.cpp
)
if(ANDROID)
add_library(spark-update-tool SHARED
if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
qt_add_executable(spark-update-tool
MANUAL_FINALIZATION
${PROJECT_SOURCES}
)
# Define target properties for Android with Qt 6 as:
# set_property(TARGET spark-update-tool APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
# ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
if(ANDROID)
add_library(spark-update-tool SHARED
${PROJECT_SOURCES}
)
# Define properties for Android with Qt 5 after find_package() calls as:
# set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
else()
add_executable(spark-update-tool
${PROJECT_SOURCES}
)
else()
add_executable(spark-update-tool
${PROJECT_SOURCES}
)
endif()
endif()
target_link_libraries(spark-update-tool PRIVATE Qt5::Widgets Qt5::Network Qt5::Concurrent)
target_link_libraries(spark-update-tool PRIVATE Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Network Qt${QT_VERSION_MAJOR}::Concurrent)
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
if(${QT_VERSION} VERSION_LESS 6.1.0)
set(BUNDLE_ID_OPTION MACOSX_BUNDLE_GUI_IDENTIFIER com.example.spark-update-tool)
endif()
set_target_properties(spark-update-tool PROPERTIES
MACOSX_BUNDLE_GUI_IDENTIFIER com.example.spark-update-tool
${BUNDLE_ID_OPTION}
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
include(GNUInstallDirs)
install(TARGETS spark-update-tool
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
# 安装配置
# 对于Linux,安装到/usr/bin目录
if(UNIX AND NOT APPLE)
# 直接指定安装路径为 /usr/bin
install(TARGETS spark-update-tool
RUNTIME DESTINATION /usr/bin
)
# 可选:安装桌面文件和应用图标
# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/spark-update-tool.desktop
# DESTINATION /usr/share/applications
# )
# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/icons/spark-update-tool.png
# DESTINATION /usr/share/icons/hicolor/256x256/apps
# )
else()
# 对于其他系统,使用GNU标准安装路径
include(GNUInstallDirs)
install(TARGETS spark-update-tool
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
endif()
if(QT_VERSION_MAJOR EQUAL 6)
qt_finalize_executable(spark-update-tool)
endif()
+4
View File
@@ -1,3 +1,7 @@
spark-update-tool (1.0.4) unstable; urgency=low
* 修复点击更新全部按钮后,会更新被忽略应用的问题。
spark-update-tool (1.0.3) unstable; urgency=low
* 修复默认图标加载失败的问题
Binary file not shown.
+8 -3
View File
@@ -38,12 +38,17 @@ RESOURCES += \
# Linux-specific settings
unix:!macx {
# Installation paths for Linux
target.path = $$[QT_INSTALL_BINS]
# 安装到 /usr/bin 目录
target.path = /usr/bin
INSTALLS += target
# 如果需要安装其他文件(如桌面文件图标等),可以添加
# desktop.path = /usr/share/applications
# desktop.files = spark-update-tool.desktop
# INSTALLS += desktop
# Additional Linux specific configurations if needed
QMAKE_CXXFLAGS += -Wall -Wextra
}
# Remove Windows and macOS specific sections since we're focusing on Linux
# Remove Windows and macOS specific sections since we're focusing on Linux
+410 -24
View File
@@ -8,10 +8,12 @@
#include <QPainter>
#include <QMouseEvent>
#include <QFile>
#include <QEventLoop>
AppDelegate::AppDelegate(QObject *parent)
: QStyledItemDelegate(parent), m_downloadManager(new DownloadManager(this)), m_installProcess(nullptr) {
connect(m_downloadManager, &DownloadManager::downloadFinished, this,
[this](const QString &packageName, bool success) {
if (m_downloads.contains(packageName)) {
m_downloads[packageName].isDownloading = false;
@@ -20,6 +22,35 @@ AppDelegate::AppDelegate(QObject *parent)
qDebug() << (success ? "下载完成:" : "下载失败:") << packageName;
if (success) {
enqueueInstall(packageName); // 安装完成后再设置 isInstalled
} else {
// 下载失败,删除已存在的deb包并重新下载
QDir tempDir(QDir::tempPath());
QStringList debs = tempDir.entryList(QStringList() << QString("%1_*.deb").arg(packageName) << QString("%1*.deb").arg(packageName), QDir::Files);
for (const QString &deb : debs) {
QString debPath = tempDir.absoluteFilePath(deb);
if (QFile::exists(debPath)) {
if (QFile::remove(debPath)) {
qDebug() << "已删除下载失败的软件包:" << debPath;
} else {
qWarning() << "删除下载失败的软件包失败:" << debPath;
}
}
}
// 重新开始下载
if (m_model) {
for (int row = 0; row < m_model->rowCount(); ++row) {
QModelIndex index = m_model->index(row, 0);
if (index.data(Qt::UserRole + 1).toString() == packageName) {
QString downloadUrl = index.data(Qt::UserRole + 7).toString();
QString outputPath = QString("%1/%2.metalink").arg(QDir::tempPath(), packageName);
m_downloads[packageName] = {0, true};
m_downloadManager->startDownload(packageName, downloadUrl, outputPath);
emit updateDisplay(packageName);
break;
}
}
}
}
}
});
@@ -39,6 +70,17 @@ AppDelegate::AppDelegate(QObject *parent)
connect(&m_spinnerUpdateTimer, &QTimer::timeout, this, &AppDelegate::updateSpinner);
}
AppDelegate::~AppDelegate()
{
// 终止并清理安装进程
if (m_installProcess && m_installProcess->state() != QProcess::NotRunning) {
m_installProcess->kill();
m_installProcess->waitForFinished(3000);
m_installProcess->deleteLater();
m_installProcess = nullptr;
}
}
void AppDelegate::setModel(QAbstractItemModel *model) {
m_model = model;
}
@@ -83,6 +125,7 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
QString iconPath = index.data(Qt::UserRole + 4).toString();
QString size = index.data(Qt::UserRole + 5).toString();
QString description = index.data(Qt::UserRole + 6).toString();
QString source = index.data(Qt::UserRole + 9).toString();
QRect rect = option.rect;
int margin = 10, spacing = 6, iconSize = 40;
@@ -109,11 +152,51 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
int textX = iconRect.right() + margin;
int textWidth = rect.width() - textX - 100;
// 绘制应用名称
QRect nameRect(textX, rect.top() + margin, textWidth, 20);
painter->setFont(boldFont);
QColor nameColor = isIgnored ? QColor("#999999") : QColor("#333333");
painter->setPen(nameColor);
// 计算名称宽度
QFontMetrics fontMetrics(boldFont);
int nameWidth = fontMetrics.horizontalAdvance(name);
// 绘制名称
painter->drawText(nameRect, Qt::AlignLeft | Qt::AlignVCenter, name);
// 绘制来源Tag
if (!source.isEmpty()) {
int tagX = textX + nameWidth + 10;
QString tagText;
QColor bgColor;
QColor textColor;
if (source == "apm") {
tagText = "APM";
bgColor = QColor("#3B82F6"); // 蓝色
textColor = QColor("#FFFFFF");
} else {
tagText = "传统deb";
bgColor = QColor("#F97316"); // 橙色
textColor = QColor("#FFFFFF");
}
int tagWidth = fontMetrics.horizontalAdvance(tagText) + 12;
int tagHeight = 18;
QRect tagRect(tagX, rect.top() + margin + 1, tagWidth, tagHeight);
// 绘制Tag背景
painter->setBrush(bgColor);
painter->setPen(Qt::NoPen);
painter->drawRoundedRect(tagRect, 9, 9);
// 绘制Tag文本
painter->setFont(normalFont);
painter->setPen(textColor);
painter->drawText(tagRect, Qt::AlignCenter, tagText);
}
QRect versionRect(textX, nameRect.bottom() + spacing, textWidth, 20);
painter->setFont(normalFont);
@@ -149,15 +232,24 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
painter->setPen(QColor("#6B7280"));
painter->drawText(unignoreButtonRect, Qt::AlignCenter, "取消忽略");
} else if (isDownloading) {
// 绘制灰底蓝色进度条
QRect progressRect(rect.right() - 270, rect.top() + (rect.height() - 20) / 2, 150, 20);
QStyleOptionProgressBar progressBarOption;
progressBarOption.rect = progressRect;
progressBarOption.minimum = 0;
progressBarOption.maximum = 100;
progressBarOption.progress = progress;
progressBarOption.text = QString("%1%").arg(progress);
progressBarOption.textVisible = true;
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
// 绘制背景
painter->setPen(Qt::NoPen);
painter->setBrush(QColor("#E5E7EB"));
painter->drawRoundedRect(progressRect, 10, 10);
// 绘制进度
int progressWidth = progressRect.width() * progress / 100;
QRect progressFillRect(progressRect.left(), progressRect.top(), progressWidth, progressRect.height());
painter->setBrush(QColor("#3B82F6"));
painter->drawRoundedRect(progressFillRect, 10, 10);
// 绘制进度文本
painter->setPen(Qt::white);
painter->setFont(option.font);
painter->drawText(progressRect, Qt::AlignCenter, QString("%1%").arg(progress));
QRect cancelButtonRect(rect.right() - 80, rect.top() + (rect.height() - 30) / 2, 70, 30);
painter->setPen(Qt::NoPen);
@@ -254,6 +346,21 @@ bool AppDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
if (cancelButtonRect.contains(mouseEvent->pos())) {
m_downloadManager->cancelDownload(packageName);
m_downloads.remove(packageName);
// 删除未下载完成的软件包
QDir tempDir(QDir::tempPath());
QStringList debs = tempDir.entryList(QStringList() << QString("%1_*.deb").arg(packageName) << QString("%1*.deb").arg(packageName), QDir::Files);
for (const QString &deb : debs) {
QString debPath = tempDir.absoluteFilePath(deb);
if (QFile::exists(debPath)) {
if (QFile::remove(debPath)) {
qDebug() << "已删除未下载完成的软件包:" << debPath;
} else {
qWarning() << "删除未下载完成的软件包失败:" << debPath;
}
}
}
emit updateDisplay(packageName);
return true;
}
@@ -286,19 +393,13 @@ bool AppDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
}
}
// 如果存在deb包,直接进行安装
if (!debPath.isEmpty() && QFile::exists(debPath)) {
qDebug() << "发现已存在的deb包,直接进行安装:" << debPath;
enqueueInstall(packageName);
} else {
// 否则触发下载流程
QString downloadUrl = index.data(Qt::UserRole + 7).toString();
QString outputPath = QString("%1/%2.metalink").arg(QDir::tempPath(), packageName);
// 触发下载流程(无论是否存在deb包,都尝试续传)
QString downloadUrl = index.data(Qt::UserRole + 7).toString();
QString outputPath = QString("%1/%2.metalink").arg(QDir::tempPath(), packageName);
m_downloads[packageName] = {0, true};
m_downloadManager->startDownload(packageName, downloadUrl, outputPath);
emit updateDisplay(packageName);
}
m_downloads[packageName] = {0, true};
m_downloadManager->startDownload(packageName, downloadUrl, outputPath);
emit updateDisplay(packageName);
return true;
}
}
@@ -311,6 +412,14 @@ void AppDelegate::startDownloadForAll() {
if (!m_model) return;
for (int row = 0; row < m_model->rowCount(); ++row) {
QModelIndex index = m_model->index(row, 0);
// 检查应用是否被忽略
bool isIgnored = index.data(Qt::UserRole + 8).toBool();
if (isIgnored) {
qDebug() << "跳过被忽略的应用:" << index.data(Qt::UserRole + 1).toString();
continue;
}
QString packageName = index.data(Qt::UserRole + 1).toString();
if (m_downloads.contains(packageName) && (m_downloads[packageName].isDownloading || m_downloads[packageName].isInstalled))
continue;
@@ -364,6 +473,47 @@ void AppDelegate::startNextInstall() {
return;
}
// 获取包的来源信息
QString source = "aptss"; // 默认来源
if (m_model) {
for (int row = 0; row < m_model->rowCount(); ++row) {
QModelIndex index = m_model->index(row, 0);
if (index.data(Qt::UserRole + 1).toString() == packageName) {
source = index.data(Qt::UserRole + 9).toString();
break;
}
}
}
// 如果是APM包,先检查APM中是否存在对应的包,再卸载APTSS版本
if (source == "apm") {
// 检查APM中是否存在对应的包
QProcess checkProcess;
QStringList checkArgs;
checkArgs << "list" << packageName;
checkProcess.start("apm", checkArgs);
checkProcess.waitForFinished(30000); // 30秒超时
QString checkOutput = checkProcess.readAllStandardOutput();
if (checkOutput.contains(packageName)) {
// APM中存在对应的包,卸载APTSS版本
QProcess removeProcess;
QStringList removeArgs;
removeArgs << "remove" << "--purge" << "-y" << packageName;
removeProcess.start("aptss", removeArgs);
removeProcess.waitForFinished(30000); // 30秒超时
qDebug() << "卸载APTSS版本" << packageName << "退出码:" << removeProcess.exitCode();
} else {
// APM中不存在对应的包,安装失败
qWarning() << "APM中不存在对应的包:" << packageName;
m_downloads[packageName].isInstalling = false;
emit updateDisplay(packageName);
m_installingPackage.clear();
startNextInstall();
return;
}
}
m_installProcess = new QProcess(this);
QString logPath = QString("/tmp/%1_install.log").arg(packageName);
@@ -391,7 +541,7 @@ void AppDelegate::startNextInstall() {
qDebug().noquote() << QString::fromLocal8Bit(err);
});
connect(m_installProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, [this, packageName, logFile, debPath](int exitCode, QProcess::ExitStatus status) {
this, [this, packageName, logFile, debPath, source](int exitCode, QProcess::ExitStatus status) {
if (logFile) logFile->close();
m_downloads[packageName].isInstalling = false;
if (exitCode == 0) {
@@ -405,6 +555,117 @@ void AppDelegate::startNextInstall() {
qWarning() << "删除deb包失败:" << debPath;
}
}
} else {
// 安装失败,尝试从APM安装
if (source == "aptss") {
qDebug() << "APTSS安装失败,尝试从APM安装:" << packageName;
// 检查apm命令是否存在
QProcess whichProcess;
whichProcess.start("which", QStringList() << "apm");
whichProcess.waitForFinished(5000);
if (whichProcess.exitCode() != 0) {
// apm命令不存在,先安装apm
qDebug() << "apm命令不存在,先安装apm";
QProcess installApmProcess;
installApmProcess.start("aptss", QStringList() << "install" << "apm" << "-y");
installApmProcess.waitForFinished(60000); // 60秒超时
if (installApmProcess.exitCode() != 0) {
qWarning() << "安装apm失败:" << packageName;
emit updateDisplay(packageName);
m_installProcess->deleteLater();
m_installProcess = nullptr;
m_installingPackage.clear();
startNextInstall();
return;
}
qDebug() << "apm安装成功";
}
// 检查APM中是否存在对应的包
QProcess checkProcess;
QStringList checkArgs;
checkArgs << "list" << packageName;
checkProcess.start("apm", checkArgs);
checkProcess.waitForFinished(30000); // 30秒超时
QString checkOutput = checkProcess.readAllStandardOutput();
if (checkOutput.contains(packageName)) {
// APM中存在对应的包,卸载当前版本
QProcess removeProcess;
QStringList removeArgs;
removeArgs << "remove" << "--purge" << "-y" << packageName;
removeProcess.start("aptss", removeArgs);
removeProcess.waitForFinished(30000);
// 从APM获取下载URL,使用与aptssupdater相同的方法
QString downloadUrl;
QProcess process;
QString command = QString("amber-pm-debug /usr/bin/apt -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf download %1 --print-uris").arg(packageName);
process.start("bash", QStringList() << "-c" << command);
if (process.waitForFinished(30000)) { // 30秒超时
QString output = process.readAllStandardOutput();
// 解析输出格式:'URL' 文件名 大小 SHA512:哈希值
QRegularExpression regex(R"('([^']+)'\s+\S+\s+(\d+)\s+SHA512:([^\s]+))");
QRegularExpressionMatch match = regex.match(output);
if (match.hasMatch()) {
downloadUrl = match.captured(1);
}
}
if (!downloadUrl.isEmpty()) {
// 使用更新器的下载功能下载APM包
QString outputPath = QString("%1/%2.metalink").arg(QDir::tempPath(), packageName);
m_downloads[packageName] = {0, true};
m_downloadManager->startDownload(packageName, downloadUrl, outputPath);
// 等待下载完成后再安装
QEventLoop loop;
connect(m_downloadManager, &DownloadManager::downloadFinished, &loop, [&loop](const QString &, bool) {
loop.quit();
});
loop.exec();
// 下载完成后,使用APM安装
QDir tempDir(QDir::tempPath());
QStringList debs = tempDir.entryList(QStringList() << QString("%1_*.deb").arg(packageName) << QString("%1*.deb").arg(packageName), QDir::Files);
if (!debs.isEmpty()) {
QString apmDebPath = tempDir.absoluteFilePath(debs.first());
QProcess apmProcess;
QStringList apmArgs;
apmArgs << "ssaudit" << apmDebPath;
apmProcess.start("apm", apmArgs);
apmProcess.waitForFinished(60000); // 60秒超时
int apmExitCode = apmProcess.exitCode();
qDebug() << "APM安装" << packageName << "退出码:" << apmExitCode;
// APM安装成功后设置状态
if (apmExitCode == 0) {
m_downloads[packageName].isInstalling = false;
m_downloads[packageName].isInstalled = true;
// 安装成功后删除deb包
if (QFile::exists(apmDebPath)) {
if (QFile::remove(apmDebPath)) {
qDebug() << "已删除deb包:" << apmDebPath;
} else {
qWarning() << "删除deb包失败:" << apmDebPath;
}
}
}
}
} else {
qWarning() << "无法获取APM包的下载URL:" << packageName;
}
} else {
// APM中不存在对应的包,不卸载aptss包
qWarning() << "APM中不存在对应的包,安装失败:" << packageName;
}
}
}
emit updateDisplay(packageName);
m_installProcess->deleteLater();
@@ -438,7 +699,7 @@ void AppDelegate::startNextInstall() {
qDebug().noquote() << QString::fromLocal8Bit(err);
});
connect(m_installProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, [this, packageName, debPath](int exitCode, QProcess::ExitStatus /*status*/) {
this, [this, packageName, debPath, source](int exitCode, QProcess::ExitStatus /*status*/) {
// 如果通过退出码判断安装成功,也删除deb包
if (exitCode == 0 && QFile::exists(debPath)) {
if (QFile::remove(debPath)) {
@@ -446,6 +707,117 @@ void AppDelegate::startNextInstall() {
} else {
qWarning() << "删除deb包失败:" << debPath;
}
} else {
// 安装失败,尝试从APM安装
if (source == "aptss") {
qDebug() << "APTSS安装失败,尝试从APM安装:" << packageName;
// 检查apm命令是否存在
QProcess whichProcess;
whichProcess.start("which", QStringList() << "apm");
whichProcess.waitForFinished(5000);
if (whichProcess.exitCode() != 0) {
// apm命令不存在,先安装apm
qDebug() << "apm命令不存在,先安装apm";
QProcess installApmProcess;
installApmProcess.start("aptss", QStringList() << "install" << "apm" << "-y");
installApmProcess.waitForFinished(60000); // 60秒超时
if (installApmProcess.exitCode() != 0) {
qWarning() << "安装apm失败:" << packageName;
emit updateDisplay(packageName);
m_installProcess->deleteLater();
m_installProcess = nullptr;
m_installingPackage.clear();
startNextInstall();
return;
}
qDebug() << "apm安装成功";
}
// 检查APM中是否存在对应的包
QProcess checkProcess;
QStringList checkArgs;
checkArgs << "list" << packageName;
checkProcess.start("apm", checkArgs);
checkProcess.waitForFinished(30000); // 30秒超时
QString checkOutput = checkProcess.readAllStandardOutput();
if (checkOutput.contains(packageName)) {
// APM中存在对应的包,卸载当前版本
QProcess removeProcess;
QStringList removeArgs;
removeArgs << "remove" << "--purge" << "-y" << packageName;
removeProcess.start("aptss", removeArgs);
removeProcess.waitForFinished(30000);
// 从APM获取下载URL,使用与aptssupdater相同的方法
QString downloadUrl;
QProcess process;
QString command = QString("amber-pm-debug /usr/bin/apt -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf download %1 --print-uris").arg(packageName);
process.start("bash", QStringList() << "-c" << command);
if (process.waitForFinished(30000)) { // 30秒超时
QString output = process.readAllStandardOutput();
// 解析输出格式:'URL' 文件名 大小 SHA512:哈希值
QRegularExpression regex(R"('([^']+)'\s+\S+\s+(\d+)\s+SHA512:([^\s]+))");
QRegularExpressionMatch match = regex.match(output);
if (match.hasMatch()) {
downloadUrl = match.captured(1);
}
}
if (!downloadUrl.isEmpty()) {
// 使用更新器的下载功能下载APM包
QString outputPath = QString("%1/%2.metalink").arg(QDir::tempPath(), packageName);
m_downloads[packageName] = {0, true};
m_downloadManager->startDownload(packageName, downloadUrl, outputPath);
// 等待下载完成后再安装
QEventLoop loop;
connect(m_downloadManager, &DownloadManager::downloadFinished, &loop, [&loop](const QString &, bool) {
loop.quit();
});
loop.exec();
// 下载完成后,使用APM安装
QDir tempDir(QDir::tempPath());
QStringList debs = tempDir.entryList(QStringList() << QString("%1_*.deb").arg(packageName) << QString("%1*.deb").arg(packageName), QDir::Files);
if (!debs.isEmpty()) {
QString apmDebPath = tempDir.absoluteFilePath(debs.first());
QProcess apmProcess;
QStringList apmArgs;
apmArgs << "ssaudit" << apmDebPath;
apmProcess.start("apm", apmArgs);
apmProcess.waitForFinished(60000); // 60秒超时
int apmExitCode = apmProcess.exitCode();
qDebug() << "APM安装" << packageName << "退出码:" << apmExitCode;
// APM安装成功后设置状态
if (apmExitCode == 0) {
m_downloads[packageName].isInstalling = false;
m_downloads[packageName].isInstalled = true;
// 安装成功后删除deb包
if (QFile::exists(apmDebPath)) {
if (QFile::remove(apmDebPath)) {
qDebug() << "已删除deb包:" << apmDebPath;
} else {
qWarning() << "删除deb包失败:" << apmDebPath;
}
}
}
}
} else {
qWarning() << "无法获取APM包的下载URL:" << packageName;
}
} else {
// APM中不存在对应的包,不卸载aptss包
qWarning() << "APM中不存在对应的包,安装失败:" << packageName;
}
}
}
emit updateDisplay(packageName);
@@ -457,8 +829,15 @@ void AppDelegate::startNextInstall() {
}
QStringList args;
args << debPath << "--no-create-desktop-entry" << "--delete-after-install";
m_installProcess->start("ssinstall", args);
if (source == "apm") {
// APM 包使用 apm ssaudit 安装
args << "ssaudit" << debPath;
m_installProcess->start("apm", args);
} else {
// APTSS 包使用 ssinstall 安装
args << debPath << "--no-create-desktop-entry" << "--delete-after-install" << "--native";
m_installProcess->start("/usr/bin/ssinstall", args);
}
}
// 新增槽函数,用于更新旋转角度并触发刷新
@@ -474,6 +853,13 @@ void AppDelegate::startDownloadForSelected() {
QModelIndex index = m_model->index(row, 0);
QString packageName = index.data(Qt::UserRole + 1).toString();
// 检查应用是否被忽略
bool isIgnored = index.data(Qt::UserRole + 8).toBool();
if (isIgnored) {
qDebug() << "跳过被忽略的应用:" << packageName;
continue;
}
// 只下载选中的应用
if (m_selectedPackages.contains(packageName)) {
if (m_downloads.contains(packageName) && (m_downloads[packageName].isDownloading || m_downloads[packageName].isInstalled))
+1
View File
@@ -21,6 +21,7 @@ class AppDelegate : public QStyledItemDelegate {
Q_OBJECT
public:
explicit AppDelegate(QObject *parent = nullptr);
~AppDelegate();
void setModel(QAbstractItemModel *model);
+4 -1
View File
@@ -34,6 +34,8 @@ QVariant AppListModel::data(const QModelIndex &index, int role) const
return map.value("download_url"); // 返回下载 URL
case Qt::UserRole + 8: // 忽略状态
return map.value("ignored");
case Qt::UserRole + 9: // 包来源
return map.value("source");
default:
return QVariant();
}
@@ -55,9 +57,10 @@ void AppListModel::setUpdateData(const QJsonArray &updateInfo)
map["size"] = obj["size"].toString();
map["download_url"] = obj["download_url"].toString(); // 确保设置下载 URL
map["ignored"] = obj["ignored"].toBool(); // 设置忽略状态
map["source"] = obj["source"].toString(); // 设置包来源
m_data.append(map); // 添加到 QList<QVariantMap>
qDebug() << "设置到模型的包名:" << map["package"].toString() << "忽略状态:" << map["ignored"].toBool();
qDebug() << "设置到模型的包名:" << map["package"].toString() << "忽略状态:" << map["ignored"].toBool() << "来源:" << map["source"].toString();
qDebug() << "设置到模型的下载 URL:" << map["download_url"].toString(); // 检查设置的数据
}
+218
View File
@@ -3,12 +3,14 @@
#include <QTextStream>
#include <QRegularExpression>
#include <QFile>
#include <QDir>
#include <qdebug.h>
aptssUpdater::aptssUpdater(QWidget *parent)
: QWidget(parent)
{
packageName = getUpdateablePackages();
apmPackageName = getApmUpdateablePackages();
}
QStringList aptssUpdater::getUpdateablePackages()
@@ -434,3 +436,219 @@ QJsonArray aptssUpdater::getUpdateInfoAsJson()
qDebug()<<jsonArray;
return jsonArray;
}
QStringList aptssUpdater::getApmUpdateablePackages()
{
QStringList packageDetails;
// 检查apm命令是否存在
QProcess checkProcess;
checkProcess.start("which", QStringList() << "apm");
if (!checkProcess.waitForFinished(5000) || checkProcess.exitCode() != 0) {
qDebug() << "apm命令不存在,跳过APM更新检查";
return packageDetails;
}
QProcess process;
QString command = R"(env LANGUAGE=en_US /usr/bin/apm list --upgradable | awk 'NR>1')";
process.start("bash", QStringList() << "-c" << command);
if (!process.waitForFinished(30000)) { // 30秒超时
qWarning() << "APM process failed to finish within 30 seconds.";
process.kill();
return packageDetails;
}
QString output = process.readAllStandardOutput();
#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)
QStringList lines = output.split('\n', Qt::SkipEmptyParts);
#else
QStringList lines = output.split('\n', QString::SkipEmptyParts);
#endif
for (const QString &line : lines) {
QRegularExpression regex(R"(([\w\-\+\.]+)/\S+\s+([^\s]+)\s+\S+\s+\[upgradable from: ([^\]]+)\])");
QRegularExpressionMatch match = regex.match(line);
if (match.hasMatch()) {
QString name = match.captured(1);
QString newVersion = match.captured(2);
QString oldVersion = match.captured(3);
// 检查版本是否相同,相同则跳过
if (newVersion == oldVersion) {
qDebug() << "跳过版本相同的APM包:" << name << "(" << oldVersion << "" << newVersion << ")";
continue;
}
// 写入内存列表
packageDetails << QString("%1: %2 → %3").arg(name, oldVersion, newVersion);
}
}
return packageDetails;
}
QJsonArray aptssUpdater::getApmUpdateInfoAsJson()
{
QJsonArray jsonArray;
// 解析APM包版本信息
QHash<QString, QHash<QString, QString>> packageInfo;
for (const QString &pkg : apmPackageName) {
QStringList parts = pkg.split(": ");
if (parts.size() >= 2) {
QString packageName = parts[0];
QStringList versions = parts[1].split("");
if (versions.size() == 2) {
packageInfo[packageName]["current_version"] = versions[0];
packageInfo[packageName]["new_version"] = versions[1];
packageInfo[packageName]["source"] = "apm";
}
}
}
// 构建JSON数组
for (const QString &packageName : packageInfo.keys()) {
QJsonObject jsonObj;
jsonObj["package"] = packageName;
// 从APM桌面文件中解析应用名称和图标
QString displayName = packageName; // 默认使用包名
QString iconPath = ":/resources/default_icon.png"; // 默认图标
// APM应用的desktop文件路径
QString apmDesktopPath = QString("/var/lib/apm/apm/files/ace-env/var/lib/apm/%1/entries/applications").arg(packageName);
QDir desktopDir(apmDesktopPath);
if (desktopDir.exists()) {
// 查找desktop文件
QStringList desktopFiles = desktopDir.entryList(QStringList() << "*.desktop", QDir::Files);
if (!desktopFiles.isEmpty()) {
QString desktopFile = desktopDir.absoluteFilePath(desktopFiles.first());
QFile file(desktopFile);
if (file.open(QIODevice::ReadOnly | QIODevice::Text)) {
QTextStream in(&file);
while (!in.atEnd()) {
QString line = in.readLine().trimmed();
if (line.startsWith("Name=")) {
displayName = line.mid(5).trimmed();
} else if (line.startsWith("Icon=")) {
QString iconName = line.mid(5).trimmed();
// 处理图标路径
if (!iconName.contains('/')) {
// 查找APM包中的图标
QString apmIconPath = QString("/var/lib/apm/apm/files/ace-env/var/lib/apm/%1/entries/icons/hicolor/48x48/apps/%2.png").arg(packageName, iconName);
if (QFile::exists(apmIconPath)) {
iconPath = apmIconPath;
}
} else {
// 已经是绝对路径
if (QFile::exists(iconName)) {
iconPath = iconName;
}
}
}
}
file.close();
}
}
}
// 获取APM包大小和下载信息
QString size = "0";
QString url = "";
QString sha512 = "";
QProcess process;
QString command = QString("amber-pm-debug /usr/bin/apt -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf download %1 --print-uris").arg(packageName);
process.start("bash", QStringList() << "-c" << command);
if (process.waitForFinished(30000)) { // 30秒超时
QString output = process.readAllStandardOutput();
// 解析输出格式:'URL' 文件名 大小 SHA512:哈希值
QRegularExpression regex(R"('([^']+)'\s+\S+\s+(\d+)\s+SHA512:([^\s]+))");
QRegularExpressionMatch match = regex.match(output);
if (match.hasMatch()) {
url = match.captured(1);
size = match.captured(2);
sha512 = match.captured(3);
}
}
jsonObj["name"] = displayName;
jsonObj["current_version"] = packageInfo[packageName]["current_version"];
jsonObj["new_version"] = packageInfo[packageName]["new_version"];
jsonObj["icon"] = iconPath;
jsonObj["ignored"] = false; // 默认不忽略
jsonObj["source"] = "apm";
jsonObj["size"] = size;
jsonObj["download_url"] = url;
jsonObj["sha512"] = sha512;
jsonArray.append(jsonObj);
}
qDebug()<<"APM更新信息:"<<jsonArray;
return jsonArray;
}
QJsonArray aptssUpdater::mergeUpdateInfo()
{
QJsonArray aptssInfo = getUpdateInfoAsJson();
QJsonArray apmInfo = getApmUpdateInfoAsJson();
// 创建包名到更新信息的映射
QHash<QString, QJsonObject> aptssMap;
for (const QJsonValue &value : aptssInfo) {
QJsonObject obj = value.toObject();
QString packageName = obj["package"].toString();
obj["source"] = "aptss";
aptssMap[packageName] = obj;
}
QHash<QString, QJsonObject> apmMap;
for (const QJsonValue &value : apmInfo) {
QJsonObject obj = value.toObject();
QString packageName = obj["package"].toString();
obj["source"] = "apm";
apmMap[packageName] = obj;
}
QJsonArray mergedArray;
// 处理只在aptss中存在的包
for (const QString &packageName : aptssMap.keys()) {
if (!apmMap.contains(packageName)) {
mergedArray.append(aptssMap[packageName]);
}
}
// 处理只在apm中存在的包
for (const QString &packageName : apmMap.keys()) {
if (!aptssMap.contains(packageName)) {
mergedArray.append(apmMap[packageName]);
}
}
// 处理在两者中都存在的包
for (const QString &packageName : aptssMap.keys()) {
if (apmMap.contains(packageName)) {
QJsonObject aptssObj = aptssMap[packageName];
QJsonObject apmObj = apmMap[packageName];
// 比较版本
QString aptssVersion = aptssObj["new_version"].toString();
QString apmVersion = apmObj["new_version"].toString();
// 这里简化处理,实际应该使用版本比较函数
if (apmVersion > aptssVersion) {
// APM版本更高,使用APM版本
mergedArray.append(apmObj);
} else {
// APTSS版本更高或相同,不展示该包
qDebug() << "APTSS版本更高,不展示APM包:" << packageName;
}
}
}
qDebug()<<"合并后的更新信息:"<<mergedArray;
return mergedArray;
}
+7
View File
@@ -19,10 +19,17 @@ public:
QStringList getPackageIcons(); // 获取包图标列表
QJsonArray getUpdateInfoAsJson(); // 获取更新信息的 JSON 格式
QString m_tempFilePath;
// APM 相关方法
QStringList getApmUpdateablePackages(); // 查询 APM 可更新包列表及更新内容
QJsonArray getApmUpdateInfoAsJson(); // 获取 APM 更新信息的 JSON 格式
QJsonArray mergeUpdateInfo(); // 合并 APTSS 和 APM 的更新信息
signals:
private:
bool checkDesktopFiles(const QStringList &desktopFiles, QString &appName, const QString &lang, const QString &packageName);
QStringList packageName;
QStringList apmPackageName; // APM 包列表
};
#endif // APTSSUPDATER_H
+17 -1
View File
@@ -10,6 +10,20 @@ DownloadManager::DownloadManager(QObject *parent) : QObject(parent)
cleanupTempFiles();
}
DownloadManager::~DownloadManager()
{
// 终止并清理所有正在运行的下载进程
for (auto it = m_processes.begin(); it != m_processes.end(); ) {
QProcess *process = it.value();
if (process->state() != QProcess::NotRunning) {
process->kill(); // 立即终止进程
process->waitForFinished(3000); // 最多等待3秒
}
process->deleteLater();
it = m_processes.erase(it);
}
}
void DownloadManager::startDownload(const QString &packageName, const QString &url, const QString &outputPath)
{
if (m_processes.contains(packageName)) {
@@ -25,6 +39,8 @@ void DownloadManager::startDownload(const QString &packageName, const QString &u
"--console-log-level=warn",
"--summary-interval=1",
"--allow-overwrite=true",
"--connect-timeout=30",
"--max-tries=3",
"--dir=" + fileInfo.absolutePath(),
"--out=" + fileInfo.fileName(),
metalinkUrl
@@ -114,4 +130,4 @@ void DownloadManager::cleanupTempFiles()
for (const QString &f : leftovers) {
tempDir.remove(f);
}
}
}
+2 -1
View File
@@ -10,6 +10,7 @@ class DownloadManager : public QObject
Q_OBJECT
public:
explicit DownloadManager(QObject *parent = nullptr);
~DownloadManager();
void startDownload(const QString &packageName, const QString &url, const QString &outputPath);
void cancelDownload(const QString &packageName);
bool isDownloading(const QString &packageName) const;
@@ -25,4 +26,4 @@ private:
QMap<QString, QProcess*> m_processes;
};
#endif // DOWNLOADMANAGER_H
#endif // DOWNLOADMANAGER_H
+2 -2
View File
@@ -229,7 +229,7 @@ void MainWindow::initStyle()
void MainWindow::checkUpdates()
{
aptssUpdater updater;
QJsonArray updateInfo = updater.getUpdateInfoAsJson();
QJsonArray updateInfo = updater.mergeUpdateInfo();
// 分离正常应用和忽略应用
QJsonArray normalApps;
@@ -265,7 +265,7 @@ void MainWindow::checkUpdates()
for (const auto &item : finalApps) {
QJsonObject obj = item.toObject();
qDebug() << "模型设置的包名:" << obj["package"].toString() << "忽略状态:" << obj["ignored"].toBool();
qDebug() << "模型设置的包名:" << obj["package"].toString() << "忽略状态:" << obj["ignored"].toBool() << "来源:" << obj["source"].toString();
qDebug() << "模型设置的下载 URL:" << obj["download_url"].toString(); // 检查模型数据
}
}
+3
View File
@@ -180,6 +180,9 @@ int main(int argc, char *argv[])
}
int fakeArgc = argc + 2; // QCoreApplication 的 argc 要用引用,避免 c++ 编译器优化
Application a(fakeArgc, fakeArgs.data());
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
a.setAttribute(Qt::ApplicationAttribute::AA_UseHighDpiPixmaps);
#endif // QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
// 设置版本和构建时间
a.setBuildDateTime(buildDateTime);
+4 -1
View File
@@ -73,8 +73,9 @@ void AppIntoPage::openUrl(const QUrl &url)
iconRequest.setUrl(QUrl(pkgUrlBase + "/icon.png"));
iconRequest.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
iconRequest.setHeader(QNetworkRequest::ContentTypeHeader, "charset='utf-8'");
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
iconRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
#endif // QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
iconManager->get(iconRequest);
QObject::connect(iconManager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
@@ -97,7 +98,9 @@ void AppIntoPage::openUrl(const QUrl &url)
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
request.setUrl(QUrl(imgUrl));
request.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
#endif // QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
request.setHeader(QNetworkRequest::ContentTypeHeader, "charset='utf-8'");
manager->get(request);
QObject::connect(manager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
+2 -1
View File
@@ -31,7 +31,8 @@ DEFINES += APP_BRANCH=\\\"'$$system(git symbolic-ref --short -q HEAD)'\\\"
# We want to capture all logs (INFO, DEBUG, WARNING, ERROR) for export to /tmp/spark-store
CONFIG += c++11 link_pkgconfig
PKGCONFIG += dtkcore dtkgui dtkwidget
equals(QT_MAJOR_VERSION, 6): PKGCONFIG += dtk6core dtk6gui dtk6widget
equals(QT_MAJOR_VERSION, 5): PKGCONFIG += dtkcore dtkgui dtkwidget
SOURCES += \
backend/DataCollectorAndUploader.cpp \
+6 -3
View File
@@ -10,8 +10,11 @@ CustomLabel::CustomLabel(QWidget *parent,
QPixmap CustomLabel::pixmap() const
{
const QPixmap* p = QLabel::pixmap();
return p ? *p : QPixmap();
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
return *QLabel::pixmap();
#else
return QLabel::pixmap();
#endif // QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
}
void CustomLabel::setPixmap(const QPixmap &pixmap)
@@ -23,4 +26,4 @@ void CustomLabel::setPixmap(const QPixmap &pixmap)
Qt::SmoothTransformation);
QLabel::setPixmap(_pixmap);
}
}
+11 -2
View File
@@ -120,8 +120,11 @@ _create_lock()
# unlock and remove the lock file
_remove_lock()
{
flock -u "$LCK_FD" 2>/dev/null
rm -f "$LCK_FILE.lock"
# Only unlock if lock file exists (was created by _create_lock)
if [ -f "$LCK_FILE.lock" ]; then
flock -u "$LCK_FD" 2>/dev/null
rm -f "$LCK_FILE.lock"
fi
}
# Search for known options and decide if root privileges are needed.
@@ -821,6 +824,9 @@ elif [ "$option" == "download" ]; then
"${_APTMGR}" "$@"
fi
# Clean up temporary directory for download command
cleanup_aptfast
elif [ "$option" == "source" ]; then
msg
msg "Working... this may take a while." "normal"
@@ -847,6 +853,9 @@ elif [ "$option" == "source" ]; then
# dpkg-source -x "$(basename "$srcfile")"
#done < "$DLLIST"
# Clean up temporary directory for source command
cleanup_aptfast
# Execute package manager directly if unknown options are passed.
else
"${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@"
+24 -5
View File
@@ -30,7 +30,7 @@ linkDir() {
ensureTargetDir "$targetFile"
sourceFile=$(realpath --relative-to="$(dirname $targetFile)" "$sourceFile" )
if [ ! -e ${targetFile} ];then
if [ ! -e "${targetFile}" ];then
ln -sv "$sourceFile" "$targetFile"
fi
done
@@ -88,7 +88,7 @@ done
}
function exec_link_clean(){
# remove broken links in /usr/share
# remove broken links in /usr/share
find /usr/share/applications -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/icons -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
@@ -98,13 +98,32 @@ function exec_link_clean(){
find /usr/share/fcitx -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/help -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/locale -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/lib/`dpkg-architecture -qDEB_HOST_MULTIARCH`/fcitx -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
# 根据 uname -m 确定 multiarch 目录名
arch=$(uname -m)
case $arch in
x86_64)
multiarch="x86_64-linux-gnu"
;;
aarch64)
multiarch="aarch64-linux-gnu"
;;
loongarch64|loong64)
multiarch="loongarch64-linux-gnu"
;;
*)
multiarch=""
;;
esac
if [ -n "$multiarch" ]; then
find "/usr/lib/$multiarch/fcitx" -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
fi
find /usr/lib/mozilla/plugins -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/polkit-1/actions -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /usr/share/fonts -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
find /etc/fonts/conf.d -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
}
function exec_uos_package_update(){
update-icon-caches /usr/share/icons/* > /dev/null 2>&1 &
+32 -6
View File
@@ -291,16 +291,42 @@ function create_desktop_file() {
export CURRENT_USER_DIR_DESKTOP=$(sudo -u "$user" xdg-user-dir DESKTOP)
function exec_create_desktop_file() {
local desktop_files=()
local package_name_lower=$(echo "$package_name" | tr '[:upper:]' '[:lower:]')
# 收集所有桌面文件
desktop_files+=($(dpkg -L "$package_name" | grep '/usr/share/applications/.*\.desktop$'))
desktop_files+=($(dpkg -L "$package_name" | grep '/opt/apps/'"$package_name"'/entries/applications/.*\.desktop$'))
# 收集指定路径下的桌面文件
# 1. /usr/share/applications/ 目录下的 .desktop 文件
desktop_files+=($(dpkg -L "$package_name" 2>/dev/null | grep '^/usr/share/applications/.*\.desktop$' || true))
# 2. /opt/apps/包名/entries/applications/ 目录下的 .desktop 文件
# 先尝试精确匹配包名路径
desktop_files+=($(dpkg -L "$package_name" 2>/dev/null | grep "^/opt/apps/$package_name/entries/applications/.*\.desktop$" || true))
# 再尝试小写包名路径(有些包可能使用小写路径)
desktop_files+=($(dpkg -L "$package_name" 2>/dev/null | grep "^/opt/apps/$package_name_lower/entries/applications/.*\.desktop$" || true))
# 如果没有找到任何符合条件的桌面文件,则直接返回
if [ ${#desktop_files[@]} -eq 0 ]; then
echo "未找到符合条件的桌面快捷方式文件(/usr/share/applications/ 或 /opt/apps/$package_name/entries/applications/"
return 0
fi
echo "找到 ${#desktop_files[@]} 个桌面快捷方式文件:"
printf '%s\n' "${desktop_files[@]}"
for desktop_file_path in "${desktop_files[@]}"; do
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || [ -z "$(grep 'NoDisplay=true' "$desktop_file_path")" ]; then
echo "$desktop_file_path is checked and will be installed to desktop"
# 检查文件是否存在
if [ ! -f "$desktop_file_path" ]; then
echo "文件不存在,跳过: $desktop_file_path"
continue
fi
# 检查是否是 NoDisplay=true 的桌面文件
if [ -z "$(grep -i 'NoDisplay=true' "$desktop_file_path")" ]; then
echo "安装桌面快捷方式: $desktop_file_path"
chmod +x "$desktop_file_path"
sudo -u "$user" cp "$desktop_file_path" "${CURRENT_USER_DIR_DESKTOP}"
sudo -u "$user" cp "$desktop_file_path" "${CURRENT_USER_DIR_DESKTOP}/"
else
echo "跳过 NoDisplay=true 的桌面文件: $desktop_file_path"
fi
done
}
+41 -14
View File
@@ -85,8 +85,8 @@ case $(arch) in
STORE_LIST_URL=""
;;
aarch64)
STORE_URL="aarch64-apm"
STORE_LIST_URL="-aarch64"
STORE_URL="arm64-apm"
STORE_LIST_URL="-arm64"
;;
loongarch64)
STORE_URL="loong64-apm"
@@ -291,19 +291,46 @@ function create_desktop_file() {
export CURRENT_USER_DIR_DESKTOP=$(sudo -u "$user" xdg-user-dir DESKTOP)
function exec_create_desktop_file() {
local desktop_files=()
local package_name_lower=$(echo "$package_name" | tr '[:upper:]' '[:lower:]')
# 收集所有桌面文件
desktop_files+=($(dpkg -L "$package_name" | grep '/usr/share/applications/.*\.desktop$'))
desktop_files+=($(dpkg -L "$package_name" | grep '/opt/apps/'"$package_name"'/entries/applications/.*\.desktop$'))
# 收集指定路径下的桌面文件
# 1. /usr/share/applications/ 目录下的 .desktop 文件
desktop_files+=($(dpkg -L "$package_name" 2>/dev/null | grep '^/usr/share/applications/.*\.desktop$' || true))
# 2. /opt/apps/包名/entries/applications/ 目录下的 .desktop 文件
# 先尝试精确匹配包名路径
desktop_files+=($(dpkg -L "$package_name" 2>/dev/null | grep "^/opt/apps/$package_name/entries/applications/.*\.desktop$" || true))
# 再尝试小写包名路径(有些包可能使用小写路径)
desktop_files+=($(dpkg -L "$package_name" 2>/dev/null | grep "^/opt/apps/$package_name_lower/entries/applications/.*\.desktop$" || true))
# 如果没有找到任何符合条件的桌面文件,则直接返回
if [ ${#desktop_files[@]} -eq 0 ]; then
echo "未找到符合条件的桌面快捷方式文件(/usr/share/applications/ 或 /opt/apps/$package_name/entries/applications/"
return 0
fi
echo "找到 ${#desktop_files[@]} 个桌面快捷方式文件:"
printf '%s\n' "${desktop_files[@]}"
for desktop_file_path in "${desktop_files[@]}"; do
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || [ -z "$(grep 'NoDisplay=true' "$desktop_file_path")" ]; then
echo "$desktop_file_path is checked and will be installed to desktop"
# 检查文件是否存在
if [ ! -f "$desktop_file_path" ]; then
echo "文件不存在,跳过: $desktop_file_path"
continue
fi
# 检查是否是 NoDisplay=true 的桌面文件
if [ -z "$(grep -i 'NoDisplay=true' "$desktop_file_path")" ]; then
echo "安装桌面快捷方式: $desktop_file_path"
chmod +x "$desktop_file_path"
sudo -u "$user" cp "$desktop_file_path" "${CURRENT_USER_DIR_DESKTOP}"
sudo -u "$user" cp "$desktop_file_path" "${CURRENT_USER_DIR_DESKTOP}/"
else
echo "跳过 NoDisplay=true 的桌面文件: $desktop_file_path"
fi
done
}
export -f exec_create_desktop_file
# 在ACE环境中创建桌面快捷方式
@@ -318,7 +345,7 @@ function create_desktop_in_ace() {
fi
# 如果是强制创建,或者没有配置禁止创建
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || ! $ace_cmd "[ -e ~/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ]"; then
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || ! [ -e ~/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ]; then
echo "在ACE环境中创建桌面快捷方式..."
export -f exec_create_desktop_file
export package_name
@@ -349,10 +376,10 @@ function install_in_ace_env() {
$ace_cmd "ensure_aptss_exist"
# 首先尝试dry-run测试
if ! $ace_cmd "aptss install --dry-run '$deb_path'"; then
if ! $ace_cmd aptss install --dry-run "$deb_path"; then
echo "初始dry-run测试失败,尝试更新后重试..."
$ace_cmd "aptss update"
if ! $ace_cmd "aptss install --dry-run '$deb_path'"; then
$ace_cmd aptss update
if ! $ace_cmd aptss install --dry-run "$deb_path"; then
echo "dry-run测试仍然失败,放弃安装"
echo "OMG_IT_GOES_WRONG"
return 1
@@ -360,8 +387,8 @@ function install_in_ace_env() {
fi
# dry-run成功后执行实际安装
$ace_cmd "aptss install store.spark-app.app-runtime-base --no-install-recommends -yfq"
if $ace_cmd "dpkg -i '$deb_path' || aptss install '$deb_path' -yfq"; then
$ace_cmd aptss install store.spark-app.app-runtime-base --no-install-recommends -yfq
if $ace_cmd dpkg -i "$deb_path" || $ace_cmd aptss install "$deb_path" -yfq; then
return 0
else
return 1
+30 -32
View File
@@ -5,41 +5,39 @@ readonly ACE_ENVIRONMENTS=(
"deepin23-run:amber-ce-deepin23"
"sid-run:amber-ce-sid"
)
dpkg -s "$1" > /dev/null
dpkg -s '$1' 2>/dev/null | grep -q 'Status: install ok installed' > /dev/null 2>&1
RET="$?"
if [[ "$RET" != "0" ]] &&[[ "$IS_ACE_ENV" == "" ]];then ## 如果未在ACE环境中
if [[ "$RET" != "0" ]] && [[ "$IS_ACE_ENV" == "" ]];then ## 如果未在ACE环境中
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
ace_cmd=${ace_entry%%:*}
if command -v "$ace_cmd" >/dev/null 2>&1; then
for ace_entry in "${ACE_ENVIRONMENTS[@]}"; do
ace_cmd=${ace_entry%%:*}
if command -v "$ace_cmd" >/dev/null 2>&1; then
echo "----------------------------------------"
echo "正在检查 $ace_cmd 环境的安装..."
echo "----------------------------------------"
# 在ACE环境中使用dpkg -s检查安装状态
# 使用dpkg -s并检查输出中是否包含"Status: install ok installed"
$ace_cmd dpkg -s "$1" 2>/dev/null | grep -q 'Status: install ok installed'
try_run_ret="$?"
# 最终检测结果处理
if [ "$try_run_ret" -eq 0 ]; then
echo "----------------------------------------"
echo "正在检查 $ace_cmd 环境的安装..."
echo " $ace_cmd 环境中找到了安装"
echo "----------------------------------------"
exit $try_run_ret
else
echo "----------------------------------------"
echo "在 $ace_cmd 环境中未能找到安装,继续查找"
echo "----------------------------------------"
# 在ACE环境中执行安装检测
$ace_cmd dpkg -l | grep "^ii $1 " > /dev/null
try_run_ret="$?"
# 最终检测结果处理
if [ "$try_run_ret" -eq 0 ]; then
echo "----------------------------------------"
echo "在 $ace_cmd 环境中找到了安装"
echo "----------------------------------------"
exit $try_run_ret
else
echo "----------------------------------------"
echo "在 $ace_cmd 环境中未能找到安装,继续查找"
echo "----------------------------------------"
fi
fi
done
echo "----------------------------------------"
echo "所有已安装的 ACE 环境中未能找到安装,退出"
echo "----------------------------------------"
exit "$RET"
fi
fi
done
echo "----------------------------------------"
echo "所有已安装的 ACE 环境中未能找到安装,退出"
echo "----------------------------------------"
exit "$RET"
fi
## 如果在ACE环境中或者未出错
exit "$RET"
exit "$RET"
+29 -29
View File
@@ -86,10 +86,10 @@
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="243"/>
<location filename="../src/pages/appintopage.cpp" line="212"/>
<location filename="../src/pages/appintopage.cpp" line="359"/>
<location filename="../src/pages/appintopage.cpp" line="404"/>
<location filename="../src/pages/appintopage.cpp" line="637"/>
<location filename="../src/pages/appintopage.cpp" line="215"/>
<location filename="../src/pages/appintopage.cpp" line="362"/>
<location filename="../src/pages/appintopage.cpp" line="407"/>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<source>Download and Install</source>
<translation type="unfinished"></translation>
</message>
@@ -177,87 +177,87 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="133"/>
<location filename="../src/pages/appintopage.cpp" line="136"/>
<source>Developer Mode Disabled</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="193"/>
<location filename="../src/pages/appintopage.cpp" line="391"/>
<location filename="../src/pages/appintopage.cpp" line="606"/>
<location filename="../src/pages/appintopage.cpp" line="196"/>
<location filename="../src/pages/appintopage.cpp" line="394"/>
<location filename="../src/pages/appintopage.cpp" line="609"/>
<source>Reinstall</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="195"/>
<location filename="../src/pages/appintopage.cpp" line="393"/>
<location filename="../src/pages/appintopage.cpp" line="569"/>
<location filename="../src/pages/appintopage.cpp" line="198"/>
<location filename="../src/pages/appintopage.cpp" line="396"/>
<location filename="../src/pages/appintopage.cpp" line="572"/>
<source>Launch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="204"/>
<location filename="../src/pages/appintopage.cpp" line="207"/>
<source>Upgrade</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="551"/>
<location filename="../src/pages/appintopage.cpp" line="367"/>
<location filename="../src/pages/appintopage.cpp" line="554"/>
<source>Install</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="369"/>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<source>Installing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<source>The current application does not support or tested on deepin, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<source>The current application does not support or tested on UOS, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The current application does not support or tested on Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<source>The current application does not support or tested on Debian, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>The current application does not support or tested on current platform, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>Spark Store</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<source>Uninstall succeeded</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>The URL has been copied to the clipboard</source>
<translation type="unfinished"></translation>
</message>
+29 -29
View File
@@ -86,10 +86,10 @@
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="243"/>
<location filename="../src/pages/appintopage.cpp" line="212"/>
<location filename="../src/pages/appintopage.cpp" line="359"/>
<location filename="../src/pages/appintopage.cpp" line="404"/>
<location filename="../src/pages/appintopage.cpp" line="637"/>
<location filename="../src/pages/appintopage.cpp" line="215"/>
<location filename="../src/pages/appintopage.cpp" line="362"/>
<location filename="../src/pages/appintopage.cpp" line="407"/>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<source>Download and Install</source>
<translation>Descargar e instalar</translation>
</message>
@@ -177,87 +177,87 @@
<translation>Haga clic en &quot;abrir&quot;</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="133"/>
<location filename="../src/pages/appintopage.cpp" line="136"/>
<source>Developer Mode Disabled</source>
<translation>Se ha desactivado el modo desarrollador</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="193"/>
<location filename="../src/pages/appintopage.cpp" line="391"/>
<location filename="../src/pages/appintopage.cpp" line="606"/>
<location filename="../src/pages/appintopage.cpp" line="196"/>
<location filename="../src/pages/appintopage.cpp" line="394"/>
<location filename="../src/pages/appintopage.cpp" line="609"/>
<source>Reinstall</source>
<translation>Reinstalación</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="195"/>
<location filename="../src/pages/appintopage.cpp" line="393"/>
<location filename="../src/pages/appintopage.cpp" line="569"/>
<location filename="../src/pages/appintopage.cpp" line="198"/>
<location filename="../src/pages/appintopage.cpp" line="396"/>
<location filename="../src/pages/appintopage.cpp" line="572"/>
<source>Launch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="204"/>
<location filename="../src/pages/appintopage.cpp" line="207"/>
<source>Upgrade</source>
<translation>Actualización</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="551"/>
<location filename="../src/pages/appintopage.cpp" line="367"/>
<location filename="../src/pages/appintopage.cpp" line="554"/>
<source>Install</source>
<translation>Instalación</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="369"/>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<source>Installing</source>
<translation>Se está instalando</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>Warning</source>
<translation>Aviso</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<source>The current application does not support or tested on deepin, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<source>The current application does not support or tested on UOS, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The current application does not support or tested on Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<source>The current application does not support or tested on Debian, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>The current application does not support or tested on current platform, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>Spark Store</source>
<translation>SPARK Store</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<source>Uninstall succeeded</source>
<translation>Desinstalación exitosa</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>The URL has been copied to the clipboard</source>
<translation>La URL ha sido copiada al portapapeles</translation>
</message>
+29 -29
View File
@@ -86,10 +86,10 @@
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="243"/>
<location filename="../src/pages/appintopage.cpp" line="212"/>
<location filename="../src/pages/appintopage.cpp" line="359"/>
<location filename="../src/pages/appintopage.cpp" line="404"/>
<location filename="../src/pages/appintopage.cpp" line="637"/>
<location filename="../src/pages/appintopage.cpp" line="215"/>
<location filename="../src/pages/appintopage.cpp" line="362"/>
<location filename="../src/pages/appintopage.cpp" line="407"/>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<source>Download and Install</source>
<translation>Télécharger et installer</translation>
</message>
@@ -177,87 +177,87 @@
<translation>Cliquez sur Ouvrir</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="133"/>
<location filename="../src/pages/appintopage.cpp" line="136"/>
<source>Developer Mode Disabled</source>
<translation>Mode développeur désactivé</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="193"/>
<location filename="../src/pages/appintopage.cpp" line="391"/>
<location filename="../src/pages/appintopage.cpp" line="606"/>
<location filename="../src/pages/appintopage.cpp" line="196"/>
<location filename="../src/pages/appintopage.cpp" line="394"/>
<location filename="../src/pages/appintopage.cpp" line="609"/>
<source>Reinstall</source>
<translation>Réinstaller</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="195"/>
<location filename="../src/pages/appintopage.cpp" line="393"/>
<location filename="../src/pages/appintopage.cpp" line="569"/>
<location filename="../src/pages/appintopage.cpp" line="198"/>
<location filename="../src/pages/appintopage.cpp" line="396"/>
<location filename="../src/pages/appintopage.cpp" line="572"/>
<source>Launch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="204"/>
<location filename="../src/pages/appintopage.cpp" line="207"/>
<source>Upgrade</source>
<translation>Mise à niveau</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="551"/>
<location filename="../src/pages/appintopage.cpp" line="367"/>
<location filename="../src/pages/appintopage.cpp" line="554"/>
<source>Install</source>
<translation>Installation</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="369"/>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<source>Installing</source>
<translation>Installation en cours</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>Warning</source>
<translation>Avertissement</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<source>The current application does not support or tested on deepin, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<source>The current application does not support or tested on UOS, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The current application does not support or tested on Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<source>The current application does not support or tested on Debian, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>The current application does not support or tested on current platform, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>Spark Store</source>
<translation>Le Spark store</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<source>Uninstall succeeded</source>
<translation>Désinstallation réussie</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>The URL has been copied to the clipboard</source>
<translation>L&apos;URL a é copiée dans le presse - papiers</translation>
</message>
+29 -29
View File
@@ -81,10 +81,10 @@
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="243"/>
<location filename="../src/pages/appintopage.cpp" line="212"/>
<location filename="../src/pages/appintopage.cpp" line="359"/>
<location filename="../src/pages/appintopage.cpp" line="404"/>
<location filename="../src/pages/appintopage.cpp" line="637"/>
<location filename="../src/pages/appintopage.cpp" line="215"/>
<location filename="../src/pages/appintopage.cpp" line="362"/>
<location filename="../src/pages/appintopage.cpp" line="407"/>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<source>Download and Install</source>
<translation></translation>
</message>
@@ -177,87 +177,87 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="133"/>
<location filename="../src/pages/appintopage.cpp" line="136"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="193"/>
<location filename="../src/pages/appintopage.cpp" line="391"/>
<location filename="../src/pages/appintopage.cpp" line="606"/>
<location filename="../src/pages/appintopage.cpp" line="196"/>
<location filename="../src/pages/appintopage.cpp" line="394"/>
<location filename="../src/pages/appintopage.cpp" line="609"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="195"/>
<location filename="../src/pages/appintopage.cpp" line="393"/>
<location filename="../src/pages/appintopage.cpp" line="569"/>
<location filename="../src/pages/appintopage.cpp" line="198"/>
<location filename="../src/pages/appintopage.cpp" line="396"/>
<location filename="../src/pages/appintopage.cpp" line="572"/>
<source>Launch</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="204"/>
<location filename="../src/pages/appintopage.cpp" line="207"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="551"/>
<location filename="../src/pages/appintopage.cpp" line="367"/>
<location filename="../src/pages/appintopage.cpp" line="554"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="369"/>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>Warning</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<source>The current application does not support or tested on deepin, there may be problems</source>
<translation>deepin上测试过</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<source>The current application does not support or tested on UOS, there may be problems</source>
<translation>UOS上测试过</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The current application does not support or tested on Ubuntu, there may be problems</source>
<translation>Ubuntu上测试过</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<source>The current application does not support or tested on Debian, there may be problems</source>
<translation>Debian上测试过</translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>The current application does not support or tested on current platform, there may be problems</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
+29 -29
View File
@@ -81,10 +81,10 @@
</message>
<message>
<location filename="../src/pages/appintopage.ui" line="243"/>
<location filename="../src/pages/appintopage.cpp" line="212"/>
<location filename="../src/pages/appintopage.cpp" line="359"/>
<location filename="../src/pages/appintopage.cpp" line="404"/>
<location filename="../src/pages/appintopage.cpp" line="637"/>
<location filename="../src/pages/appintopage.cpp" line="215"/>
<location filename="../src/pages/appintopage.cpp" line="362"/>
<location filename="../src/pages/appintopage.cpp" line="407"/>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<source>Download and Install</source>
<translation></translation>
</message>
@@ -177,87 +177,87 @@
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="133"/>
<location filename="../src/pages/appintopage.cpp" line="136"/>
<source>Developer Mode Disabled</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="193"/>
<location filename="../src/pages/appintopage.cpp" line="391"/>
<location filename="../src/pages/appintopage.cpp" line="606"/>
<location filename="../src/pages/appintopage.cpp" line="196"/>
<location filename="../src/pages/appintopage.cpp" line="394"/>
<location filename="../src/pages/appintopage.cpp" line="609"/>
<source>Reinstall</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="195"/>
<location filename="../src/pages/appintopage.cpp" line="393"/>
<location filename="../src/pages/appintopage.cpp" line="569"/>
<location filename="../src/pages/appintopage.cpp" line="198"/>
<location filename="../src/pages/appintopage.cpp" line="396"/>
<location filename="../src/pages/appintopage.cpp" line="572"/>
<source>Launch</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="204"/>
<location filename="../src/pages/appintopage.cpp" line="207"/>
<source>Upgrade</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="364"/>
<location filename="../src/pages/appintopage.cpp" line="551"/>
<location filename="../src/pages/appintopage.cpp" line="367"/>
<location filename="../src/pages/appintopage.cpp" line="554"/>
<source>Install</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="369"/>
<location filename="../src/pages/appintopage.cpp" line="372"/>
<source>Installing</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>Warning</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="525"/>
<location filename="../src/pages/appintopage.cpp" line="528"/>
<source>The current application does not support or tested on deepin, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="529"/>
<location filename="../src/pages/appintopage.cpp" line="532"/>
<source>The current application does not support or tested on UOS, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="533"/>
<location filename="../src/pages/appintopage.cpp" line="536"/>
<source>The current application does not support or tested on Ubuntu, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="537"/>
<location filename="../src/pages/appintopage.cpp" line="540"/>
<source>The current application does not support or tested on Debian, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="541"/>
<location filename="../src/pages/appintopage.cpp" line="544"/>
<source>The current application does not support or tested on current platform, there may be problems</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>Spark Store</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="640"/>
<location filename="../src/pages/appintopage.cpp" line="643"/>
<source>Uninstall succeeded</source>
<translation></translation>
</message>
<message>
<location filename="../src/pages/appintopage.cpp" line="655"/>
<location filename="../src/pages/appintopage.cpp" line="658"/>
<source>The URL has been copied to the clipboard</source>
<translation></translation>
</message>
+152
View File
@@ -0,0 +1,152 @@
#!/bin/bash
# Debian 合并后的验证脚本
# Verification script for merged Debian configuration
echo "========================================="
echo "Spark Store - Debian 配置验证"
echo "========================================="
echo ""
# 检查文件存在
echo "[1/4] 检查文件结构..."
if [ ! -d "debian" ]; then
echo " ✗ debian 目录不存在"
exit 1
fi
if [ ! -f "debian/control" ]; then
echo " ✗ debian/control 不存在"
exit 1
fi
if [ ! -f "debian/rules" ]; then
echo " ✗ debian/rules 不存在"
exit 1
fi
echo " ✓ 文件结构完整"
echo ""
# 检查是否有旧目录残留
echo "[2/4] 检查是否清理了冗余目录..."
if [ -d "debian-qt5" ] || [ -d "debian-qt6" ]; then
echo " ⚠ 警告: 仍然存在 debian-qt5 或 debian-qt6 目录"
else
echo " ✓ 已清理冗余目录"
fi
if [ -f "debian-qt5-qt6-backup.tar.gz" ]; then
echo " ✓ 已创建备份: debian-qt5-qt6-backup.tar.gz"
fi
echo ""
# 检查 control 文件支持两个版本
echo "[3/4] 检查 debian/control 的版本支持..."
if grep -q "qt5-default | qt6-base-dev" debian/control; then
echo " ✓ control 文件支持 Qt5 和 Qt6 选择"
else
echo " ⚠ control 文件可能未正确配置"
fi
if grep -q "libdtk6core-dev" debian/control && grep -q "libdtk6core[^-]" debian/control; then
echo " ✓ control 文件包含 Qt6 DTK 依赖"
else
echo " ⚠ control 文件可能缺少 Qt6 DTK 依赖"
fi
echo ""
# 检查 rules 文件支持版本切换
echo "[4/4] 检查 debian/rules 的版本切换支持..."
if grep -q "QT_VERSION ?= qt5" debian/rules; then
echo " ✓ rules 文件支持 QT_VERSION 变量(默认 qt5"
else
echo " ✗ rules 文件缺少 QT_VERSION 变量定义"
exit 1
fi
if grep -q "ifeq.*QT_VERSION.*qt6" debian/rules; then
echo " ✓ rules 文件支持 qt6 条件配置"
else
echo " ⚠ rules 文件可能缺少 qt6 条件"
fi
if grep -q "QMAKE_CMD = qmake6" debian/rules; then
echo " ✓ rules 文件支持 qmake6 选择"
else
echo " ⚠ rules 文件可能缺少 qmake6 支持"
fi
echo ""
# 检查Qt5版本
echo "[5/5] 检查Qt5版本..."
QT5_VERSION=""
if command -v qmake &> /dev/null; then
QT5_VERSION=$(qmake --version | grep -oP 'Qt\s+\K[0-9]+\.[0-9]+')
echo " 当前Qt5版本: $QT5_VERSION"
elif command -v qmake5 &> /dev/null; then
QT5_VERSION=$(qmake5 --version | grep -oP 'Qt\s+\K[0-9]+\.[0-9]+')
echo " 当前Qt5版本: $QT5_VERSION"
else
echo " ✗ 未检测到Qt5 (qmake或qmake5)"
QT5_VERSION="0.0"
fi
# 检查是否需要安装Qt5.11
if [ "$QT5_VERSION" != "5.11" ]; then
echo " ⚠ Qt5版本不是5.11,推荐使用Qt5.11版本以获得最佳兼容性(非强制要求)"
# 询问用户是否继续
read -p " 要继续尝试自动安装吗?(Y/N): " user_choice
if [[ "$user_choice" =~ ^[Yy]$ ]]; then
# 尝试通过系统源安装Qt5.11
if command -v apt-get &> /dev/null; then
sudo apt-get update
sudo apt-get install -y qt5-default
# 重新检查版本
if command -v qmake &> /dev/null; then
QT5_VERSION=$(qmake --version | grep -oP 'Qt\s+\K[0-9]+\.[0-9]+')
echo " 安装后Qt5版本: $QT5_VERSION"
elif command -v qmake5 &> /dev/null; then
QT5_VERSION=$(qmake5 --version | grep -oP 'Qt\s+\K[0-9]+\.[0-9]+')
echo " 安装后Qt5版本: $QT5_VERSION"
fi
else
echo " ⚠ 不支持的包管理器,无法自动安装"
fi
else
echo " 用户选择不进行自动安装"
fi
# 再次检查版本
if [ "$QT5_VERSION" != "5.11" ]; then
echo "======================================================"
echo " ⚠ 注意:Qt5版本仍不是5.11,可能会影响应用程序的兼容性"
echo " 如需使用Qt5.11版本,请访问以下链接自行安装:"
echo " https://download.qt.io/new_archive/qt/5.11/5.11.3/"
echo " 脚本将继续执行后续检查..."
echo "======================================================"
else
echo " ✓ Qt5版本已更新为5.11"
fi
else
echo " ✓ Qt5版本为5.11,符合要求"
fi
echo ""
# 最终结果
echo "========================================="
echo "✓ 验证完成!Debian 配置已正确合并"
echo "========================================="
echo ""
echo "使用方法:"
echo " 构建 Qt5: ./build-deb-qt5.sh"
echo " 构建 Qt6: ./build-deb-qt6.sh"
echo " 构建两个版本: ./build-deb-both.sh"
echo ""
echo "或手动指定版本:"
echo " QT_VERSION=qt5 dpkg-buildpackage -us -uc -b"
echo " QT_VERSION=qt6 dpkg-buildpackage -us -uc -b"