mirror of
https://gitee.com/spark-store-project/spark-store
synced 2026-06-22 22:23:49 +08:00
Compare commits
55 Commits
dev
..
Flamescion
| Author | SHA1 | Date | |
|---|---|---|---|
| 38ce4b2bb2 | |||
| 6791c98bb9 | |||
| 0a5feb7cd5 | |||
| cf276efd10 | |||
| f1a7d94ab6 | |||
| 3621045353 | |||
| 4b0f5a0371 | |||
| 87c0201506 | |||
| d565eb993b | |||
| 8af3cdeb8c | |||
| 44a4dcd031 | |||
| 3e3cdbc784 | |||
| 8fe7aa0ef3 | |||
| 28f13cba28 | |||
| 9882e5f97d | |||
| 01dae03f42 | |||
| 2d173b5be8 | |||
| 4624d65b3f | |||
| e22ab41359 | |||
| 752c6166c1 | |||
| 9dcb1bd1ae | |||
| 7dc406bc4e | |||
| fdc7bf2551 | |||
| 62642cc0a6 | |||
| c865643e8d | |||
| 0b4733c08c | |||
| f74e936aa5 | |||
| 42cafb7487 | |||
| fd7fa2da30 | |||
| 102f35b0cf | |||
| 7a25c3c542 | |||
| c6aea69d86 | |||
| 132c2cf35f | |||
| 3da39f1276 | |||
| e08c7a37bd | |||
| c55529aa8c | |||
| 5cbc41f1ce | |||
| 6c108aecca | |||
| 7cd2977032 | |||
| 94a6532509 | |||
| 9acf7cc8d4 | |||
| 75b73088b4 | |||
| dd0629bc8d | |||
| 39be4cdf6f | |||
| fc58de0325 | |||
| ba00b208f0 | |||
| 2cca83a34b | |||
| ea7baa9ab0 | |||
| c228706144 | |||
| c030bf9e6e | |||
| 9ac0c67a25 | |||
| fd4b52e384 | |||
| db79a59fb6 | |||
| 6891fc5b87 | |||
| 62f52451b7 |
@@ -27,6 +27,7 @@ ui_*.h
|
|||||||
*.qmlc
|
*.qmlc
|
||||||
*.jsc
|
*.jsc
|
||||||
Makefile*
|
Makefile*
|
||||||
|
*build-*
|
||||||
|
|
||||||
# Qt unit tests
|
# Qt unit tests
|
||||||
target_wrapper.*
|
target_wrapper.*
|
||||||
|
|||||||
@@ -1,157 +0,0 @@
|
|||||||
# 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. 验证编译结果
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
#!/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 "========================================="
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#!/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
|
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
#!/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
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
#!/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 ""
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
#!/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 ""
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
#!/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-store(Qt5)"
|
|
||||||
echo "================================"
|
|
||||||
echo ""
|
|
||||||
"${SPARK_STORE}"
|
|
||||||
else
|
|
||||||
echo "错误: spark-store 未找到"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
#!/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-store(Qt6)"
|
|
||||||
echo "================================"
|
|
||||||
echo ""
|
|
||||||
"${SPARK_STORE}"
|
|
||||||
else
|
|
||||||
echo "错误: spark-store 未找到"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
Vendored
+12
-15
@@ -5,14 +5,14 @@ Priority: optional
|
|||||||
Build-Depends:
|
Build-Depends:
|
||||||
debhelper (>= 9),
|
debhelper (>= 9),
|
||||||
pkg-config,
|
pkg-config,
|
||||||
qtchooser (>= 55-gc9562a1-1~) | qt5-default | qt6-base-dev,
|
qtchooser (>= 55-gc9562a1-1~) | qt5-default,
|
||||||
qtbase5-dev | qt6-base-dev,
|
qtbase5-dev,
|
||||||
libqt5svg5-dev | libqt6svg6-dev,
|
libqt5svg5-dev,
|
||||||
qttools5-dev-tools | qt6-tools-dev,
|
qttools5-dev-tools,
|
||||||
qtwebengine5-dev | qt6-webengine-dev,
|
qtwebengine5-dev,
|
||||||
libdtkcore-dev (>= 5.0) | libdtk6core-dev (>= 6.0),
|
libdtkcore-dev (>= 5.0),
|
||||||
libdtkgui-dev (>= 5.0) | libdtk6gui-dev (>= 6.0),
|
libdtkgui-dev (>= 5.0),
|
||||||
libdtkwidget-dev (>= 5.0) | libdtk6widget-dev (>= 6.0)
|
libdtkwidget-dev (>= 5.0)
|
||||||
Standards-Version: 4.1.7
|
Standards-Version: 4.1.7
|
||||||
Homepage: https://www.spark-app.store/
|
Homepage: https://www.spark-app.store/
|
||||||
|
|
||||||
@@ -20,20 +20,17 @@ Package: spark-store
|
|||||||
Architecture: any
|
Architecture: any
|
||||||
Provides: spark-store-console-in-container
|
Provides: spark-store-console-in-container
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends},
|
Depends: ${shlibs:Depends}, ${misc:Depends},
|
||||||
libdtkcore5 (>= 5.0) | libdtk6core (>= 6.0),
|
dde-qt5integration,
|
||||||
libdtkgui5 (>= 5.0) | libdtk6gui (>= 6.0),
|
|
||||||
libdtkwidget5 (>= 5.0) | libdtk6widget (>= 6.0),
|
|
||||||
dde-qt5integration | dde-qt6integration,
|
|
||||||
curl,
|
curl,
|
||||||
openssl,
|
openssl,
|
||||||
aria2,
|
aria2,
|
||||||
gnupg,
|
gnupg,
|
||||||
zenity,
|
zenity,
|
||||||
policykit-1 | pkexec | polkit,
|
policykit-1 | pkexec,
|
||||||
libnotify-bin,
|
libnotify-bin,
|
||||||
qtwayland5 | qt6-wayland | qt-5,
|
qtwayland5,
|
||||||
desktop-file-utils,
|
desktop-file-utils,
|
||||||
|
dpkg-dev,
|
||||||
lsb-release,
|
lsb-release,
|
||||||
Description: Spark Store
|
Description: Spark Store
|
||||||
A community powered app store, based on DTK.
|
A community powered app store, based on DTK.
|
||||||
Supports both Qt5 and Qt6 versions.
|
|
||||||
|
|||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
spark-store
|
|
||||||
Vendored
+4
-16
@@ -1,18 +1,6 @@
|
|||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
# Determine Qt version based on QT_VERSION environment variable
|
export QT_SELECT = qt5
|
||||||
# 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
|
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||||
include /usr/share/dpkg/default.mk
|
include /usr/share/dpkg/default.mk
|
||||||
|
|
||||||
@@ -34,7 +22,7 @@ override_dh_auto_clean:
|
|||||||
override_dh_auto_configure:
|
override_dh_auto_configure:
|
||||||
mkdir -p $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
|
mkdir -p $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
|
||||||
|
|
||||||
$(QMAKE_CMD) BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
|
qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
|
||||||
-spec linux-g++ CONFIG+=force_debug_info \
|
-spec linux-g++ CONFIG+=force_debug_info \
|
||||||
-o $(CURDIR)/build-$(DEB_HOST_MULTIARCH)/
|
-o $(CURDIR)/build-$(DEB_HOST_MULTIARCH)/
|
||||||
|
|
||||||
@@ -46,8 +34,8 @@ override_dh_auto_install:
|
|||||||
INSTALL_ROOT=$(CURDIR)/debian/spark-store
|
INSTALL_ROOT=$(CURDIR)/debian/spark-store
|
||||||
|
|
||||||
# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
|
# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
|
||||||
# Qt Multimedia lib will ref to network library.
|
# Qt Mutidedia lib will ref to network libraray.
|
||||||
override_dh_shlibdeps:
|
override_dh_shlibdeps:
|
||||||
dh_shlibdeps --dpkg-shlibdeps-params=--warnings=0 --exclude=opt/durapps/spark-store/bin/ss-feedback/
|
dh_shlibdeps --dpkg-shlibdeps-params=--warnings=0 --exclude=opt/durapps/spark-store/bin/ss-feedback/
|
||||||
override_dh_strip:
|
override_dh_strip:
|
||||||
dh_strip --exclude=opt/durapps/spark-store/bin/ss-feedback/
|
dh_strip --exclude=opt/durapps/spark-store/bin/ss-feedback/
|
||||||
Vendored
+1
-1
@@ -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/local/bin/ss-apt-fast
|
||||||
|
|
||||||
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
|
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
|
# Install key
|
||||||
|
|||||||
@@ -69,30 +69,12 @@ set_target_properties(spark-update-tool PROPERTIES
|
|||||||
WIN32_EXECUTABLE TRUE
|
WIN32_EXECUTABLE TRUE
|
||||||
)
|
)
|
||||||
|
|
||||||
# 安装配置
|
include(GNUInstallDirs)
|
||||||
# 对于Linux,安装到/usr/bin目录
|
install(TARGETS spark-update-tool
|
||||||
if(UNIX AND NOT APPLE)
|
BUNDLE DESTINATION .
|
||||||
# 直接指定安装路径为 /usr/bin
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
install(TARGETS spark-update-tool
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
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)
|
if(QT_VERSION_MAJOR EQUAL 6)
|
||||||
qt_finalize_executable(spark-update-tool)
|
qt_finalize_executable(spark-update-tool)
|
||||||
|
|||||||
Binary file not shown.
@@ -38,17 +38,12 @@ RESOURCES += \
|
|||||||
|
|
||||||
# Linux-specific settings
|
# Linux-specific settings
|
||||||
unix:!macx {
|
unix:!macx {
|
||||||
# 安装到 /usr/bin 目录
|
# Installation paths for Linux
|
||||||
target.path = /usr/bin
|
target.path = $$[QT_INSTALL_BINS]
|
||||||
INSTALLS += target
|
INSTALLS += target
|
||||||
|
|
||||||
# 如果需要安装其他文件(如桌面文件、图标等),可以添加
|
|
||||||
# desktop.path = /usr/share/applications
|
|
||||||
# desktop.files = spark-update-tool.desktop
|
|
||||||
# INSTALLS += desktop
|
|
||||||
|
|
||||||
# Additional Linux specific configurations if needed
|
# Additional Linux specific configurations if needed
|
||||||
QMAKE_CXXFLAGS += -Wall -Wextra
|
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
|
||||||
|
|||||||
@@ -8,7 +8,6 @@
|
|||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QMouseEvent>
|
#include <QMouseEvent>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QEventLoop>
|
|
||||||
|
|
||||||
AppDelegate::AppDelegate(QObject *parent)
|
AppDelegate::AppDelegate(QObject *parent)
|
||||||
: QStyledItemDelegate(parent), m_downloadManager(new DownloadManager(this)), m_installProcess(nullptr) {
|
: QStyledItemDelegate(parent), m_downloadManager(new DownloadManager(this)), m_installProcess(nullptr) {
|
||||||
@@ -22,35 +21,6 @@ AppDelegate::AppDelegate(QObject *parent)
|
|||||||
qDebug() << (success ? "下载完成:" : "下载失败:") << packageName;
|
qDebug() << (success ? "下载完成:" : "下载失败:") << packageName;
|
||||||
if (success) {
|
if (success) {
|
||||||
enqueueInstall(packageName); // 安装完成后再设置 isInstalled
|
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -125,7 +95,6 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
|
|||||||
QString iconPath = index.data(Qt::UserRole + 4).toString();
|
QString iconPath = index.data(Qt::UserRole + 4).toString();
|
||||||
QString size = index.data(Qt::UserRole + 5).toString();
|
QString size = index.data(Qt::UserRole + 5).toString();
|
||||||
QString description = index.data(Qt::UserRole + 6).toString();
|
QString description = index.data(Qt::UserRole + 6).toString();
|
||||||
QString source = index.data(Qt::UserRole + 9).toString();
|
|
||||||
|
|
||||||
QRect rect = option.rect;
|
QRect rect = option.rect;
|
||||||
int margin = 10, spacing = 6, iconSize = 40;
|
int margin = 10, spacing = 6, iconSize = 40;
|
||||||
@@ -152,51 +121,11 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
|
|||||||
int textX = iconRect.right() + margin;
|
int textX = iconRect.right() + margin;
|
||||||
int textWidth = rect.width() - textX - 100;
|
int textWidth = rect.width() - textX - 100;
|
||||||
|
|
||||||
// 绘制应用名称
|
|
||||||
QRect nameRect(textX, rect.top() + margin, textWidth, 20);
|
QRect nameRect(textX, rect.top() + margin, textWidth, 20);
|
||||||
painter->setFont(boldFont);
|
painter->setFont(boldFont);
|
||||||
QColor nameColor = isIgnored ? QColor("#999999") : QColor("#333333");
|
QColor nameColor = isIgnored ? QColor("#999999") : QColor("#333333");
|
||||||
painter->setPen(nameColor);
|
painter->setPen(nameColor);
|
||||||
|
|
||||||
// 计算名称宽度
|
|
||||||
QFontMetrics fontMetrics(boldFont);
|
|
||||||
int nameWidth = fontMetrics.horizontalAdvance(name);
|
|
||||||
|
|
||||||
// 绘制名称
|
|
||||||
painter->drawText(nameRect, Qt::AlignLeft | Qt::AlignVCenter, 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);
|
QRect versionRect(textX, nameRect.bottom() + spacing, textWidth, 20);
|
||||||
painter->setFont(normalFont);
|
painter->setFont(normalFont);
|
||||||
@@ -232,24 +161,15 @@ void AppDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, c
|
|||||||
painter->setPen(QColor("#6B7280"));
|
painter->setPen(QColor("#6B7280"));
|
||||||
painter->drawText(unignoreButtonRect, Qt::AlignCenter, "取消忽略");
|
painter->drawText(unignoreButtonRect, Qt::AlignCenter, "取消忽略");
|
||||||
} else if (isDownloading) {
|
} else if (isDownloading) {
|
||||||
// 绘制灰底蓝色进度条
|
|
||||||
QRect progressRect(rect.right() - 270, rect.top() + (rect.height() - 20) / 2, 150, 20);
|
QRect progressRect(rect.right() - 270, rect.top() + (rect.height() - 20) / 2, 150, 20);
|
||||||
|
QStyleOptionProgressBar progressBarOption;
|
||||||
// 绘制背景
|
progressBarOption.rect = progressRect;
|
||||||
painter->setPen(Qt::NoPen);
|
progressBarOption.minimum = 0;
|
||||||
painter->setBrush(QColor("#E5E7EB"));
|
progressBarOption.maximum = 100;
|
||||||
painter->drawRoundedRect(progressRect, 10, 10);
|
progressBarOption.progress = progress;
|
||||||
|
progressBarOption.text = QString("%1%").arg(progress);
|
||||||
// 绘制进度
|
progressBarOption.textVisible = true;
|
||||||
int progressWidth = progressRect.width() * progress / 100;
|
QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
|
||||||
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);
|
QRect cancelButtonRect(rect.right() - 80, rect.top() + (rect.height() - 30) / 2, 70, 30);
|
||||||
painter->setPen(Qt::NoPen);
|
painter->setPen(Qt::NoPen);
|
||||||
@@ -346,21 +266,6 @@ bool AppDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
|
|||||||
if (cancelButtonRect.contains(mouseEvent->pos())) {
|
if (cancelButtonRect.contains(mouseEvent->pos())) {
|
||||||
m_downloadManager->cancelDownload(packageName);
|
m_downloadManager->cancelDownload(packageName);
|
||||||
m_downloads.remove(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);
|
emit updateDisplay(packageName);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -393,13 +298,19 @@ bool AppDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 触发下载流程(无论是否存在deb包,都尝试续传)
|
// 如果存在deb包,直接进行安装
|
||||||
QString downloadUrl = index.data(Qt::UserRole + 7).toString();
|
if (!debPath.isEmpty() && QFile::exists(debPath)) {
|
||||||
QString outputPath = QString("%1/%2.metalink").arg(QDir::tempPath(), packageName);
|
qDebug() << "发现已存在的deb包,直接进行安装:" << debPath;
|
||||||
|
enqueueInstall(packageName);
|
||||||
|
} else {
|
||||||
|
// 否则触发下载流程
|
||||||
|
QString downloadUrl = index.data(Qt::UserRole + 7).toString();
|
||||||
|
QString outputPath = QString("%1/%2.metalink").arg(QDir::tempPath(), packageName);
|
||||||
|
|
||||||
m_downloads[packageName] = {0, true};
|
m_downloads[packageName] = {0, true};
|
||||||
m_downloadManager->startDownload(packageName, downloadUrl, outputPath);
|
m_downloadManager->startDownload(packageName, downloadUrl, outputPath);
|
||||||
emit updateDisplay(packageName);
|
emit updateDisplay(packageName);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -473,47 +384,6 @@ void AppDelegate::startNextInstall() {
|
|||||||
return;
|
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);
|
m_installProcess = new QProcess(this);
|
||||||
|
|
||||||
QString logPath = QString("/tmp/%1_install.log").arg(packageName);
|
QString logPath = QString("/tmp/%1_install.log").arg(packageName);
|
||||||
@@ -541,7 +411,7 @@ void AppDelegate::startNextInstall() {
|
|||||||
qDebug().noquote() << QString::fromLocal8Bit(err);
|
qDebug().noquote() << QString::fromLocal8Bit(err);
|
||||||
});
|
});
|
||||||
connect(m_installProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
connect(m_installProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||||
this, [this, packageName, logFile, debPath, source](int exitCode, QProcess::ExitStatus status) {
|
this, [this, packageName, logFile, debPath](int exitCode, QProcess::ExitStatus status) {
|
||||||
if (logFile) logFile->close();
|
if (logFile) logFile->close();
|
||||||
m_downloads[packageName].isInstalling = false;
|
m_downloads[packageName].isInstalling = false;
|
||||||
if (exitCode == 0) {
|
if (exitCode == 0) {
|
||||||
@@ -555,117 +425,6 @@ void AppDelegate::startNextInstall() {
|
|||||||
qWarning() << "删除deb包失败:" << debPath;
|
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);
|
emit updateDisplay(packageName);
|
||||||
m_installProcess->deleteLater();
|
m_installProcess->deleteLater();
|
||||||
@@ -699,7 +458,7 @@ void AppDelegate::startNextInstall() {
|
|||||||
qDebug().noquote() << QString::fromLocal8Bit(err);
|
qDebug().noquote() << QString::fromLocal8Bit(err);
|
||||||
});
|
});
|
||||||
connect(m_installProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
connect(m_installProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
|
||||||
this, [this, packageName, debPath, source](int exitCode, QProcess::ExitStatus /*status*/) {
|
this, [this, packageName, debPath](int exitCode, QProcess::ExitStatus /*status*/) {
|
||||||
// 如果通过退出码判断安装成功,也删除deb包
|
// 如果通过退出码判断安装成功,也删除deb包
|
||||||
if (exitCode == 0 && QFile::exists(debPath)) {
|
if (exitCode == 0 && QFile::exists(debPath)) {
|
||||||
if (QFile::remove(debPath)) {
|
if (QFile::remove(debPath)) {
|
||||||
@@ -707,117 +466,6 @@ void AppDelegate::startNextInstall() {
|
|||||||
} else {
|
} else {
|
||||||
qWarning() << "删除deb包失败:" << debPath;
|
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);
|
emit updateDisplay(packageName);
|
||||||
@@ -829,15 +477,8 @@ void AppDelegate::startNextInstall() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
QStringList args;
|
QStringList args;
|
||||||
if (source == "apm") {
|
args << debPath << "--no-create-desktop-entry" << "--delete-after-install";
|
||||||
// APM 包使用 apm ssaudit 安装
|
m_installProcess->start("ssinstall", args);
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新增槽函数,用于更新旋转角度并触发刷新
|
// 新增槽函数,用于更新旋转角度并触发刷新
|
||||||
|
|||||||
@@ -34,8 +34,6 @@ QVariant AppListModel::data(const QModelIndex &index, int role) const
|
|||||||
return map.value("download_url"); // 返回下载 URL
|
return map.value("download_url"); // 返回下载 URL
|
||||||
case Qt::UserRole + 8: // 忽略状态
|
case Qt::UserRole + 8: // 忽略状态
|
||||||
return map.value("ignored");
|
return map.value("ignored");
|
||||||
case Qt::UserRole + 9: // 包来源
|
|
||||||
return map.value("source");
|
|
||||||
default:
|
default:
|
||||||
return QVariant();
|
return QVariant();
|
||||||
}
|
}
|
||||||
@@ -57,10 +55,9 @@ void AppListModel::setUpdateData(const QJsonArray &updateInfo)
|
|||||||
map["size"] = obj["size"].toString();
|
map["size"] = obj["size"].toString();
|
||||||
map["download_url"] = obj["download_url"].toString(); // 确保设置下载 URL
|
map["download_url"] = obj["download_url"].toString(); // 确保设置下载 URL
|
||||||
map["ignored"] = obj["ignored"].toBool(); // 设置忽略状态
|
map["ignored"] = obj["ignored"].toBool(); // 设置忽略状态
|
||||||
map["source"] = obj["source"].toString(); // 设置包来源
|
|
||||||
m_data.append(map); // 添加到 QList<QVariantMap>
|
m_data.append(map); // 添加到 QList<QVariantMap>
|
||||||
|
|
||||||
qDebug() << "设置到模型的包名:" << map["package"].toString() << "忽略状态:" << map["ignored"].toBool() << "来源:" << map["source"].toString();
|
qDebug() << "设置到模型的包名:" << map["package"].toString() << "忽略状态:" << map["ignored"].toBool();
|
||||||
qDebug() << "设置到模型的下载 URL:" << map["download_url"].toString(); // 检查设置的数据
|
qDebug() << "设置到模型的下载 URL:" << map["download_url"].toString(); // 检查设置的数据
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,14 +3,12 @@
|
|||||||
#include <QTextStream>
|
#include <QTextStream>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QDir>
|
|
||||||
#include <qdebug.h>
|
#include <qdebug.h>
|
||||||
|
|
||||||
aptssUpdater::aptssUpdater(QWidget *parent)
|
aptssUpdater::aptssUpdater(QWidget *parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
{
|
{
|
||||||
packageName = getUpdateablePackages();
|
packageName = getUpdateablePackages();
|
||||||
apmPackageName = getApmUpdateablePackages();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList aptssUpdater::getUpdateablePackages()
|
QStringList aptssUpdater::getUpdateablePackages()
|
||||||
@@ -436,219 +434,3 @@ QJsonArray aptssUpdater::getUpdateInfoAsJson()
|
|||||||
qDebug()<<jsonArray;
|
qDebug()<<jsonArray;
|
||||||
return 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;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -19,17 +19,10 @@ public:
|
|||||||
QStringList getPackageIcons(); // 获取包图标列表
|
QStringList getPackageIcons(); // 获取包图标列表
|
||||||
QJsonArray getUpdateInfoAsJson(); // 获取更新信息的 JSON 格式
|
QJsonArray getUpdateInfoAsJson(); // 获取更新信息的 JSON 格式
|
||||||
QString m_tempFilePath;
|
QString m_tempFilePath;
|
||||||
|
|
||||||
// APM 相关方法
|
|
||||||
QStringList getApmUpdateablePackages(); // 查询 APM 可更新包列表及更新内容
|
|
||||||
QJsonArray getApmUpdateInfoAsJson(); // 获取 APM 更新信息的 JSON 格式
|
|
||||||
QJsonArray mergeUpdateInfo(); // 合并 APTSS 和 APM 的更新信息
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
private:
|
private:
|
||||||
bool checkDesktopFiles(const QStringList &desktopFiles, QString &appName, const QString &lang, const QString &packageName);
|
bool checkDesktopFiles(const QStringList &desktopFiles, QString &appName, const QString &lang, const QString &packageName);
|
||||||
QStringList packageName;
|
QStringList packageName;
|
||||||
QStringList apmPackageName; // APM 包列表
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // APTSSUPDATER_H
|
#endif // APTSSUPDATER_H
|
||||||
@@ -39,8 +39,6 @@ void DownloadManager::startDownload(const QString &packageName, const QString &u
|
|||||||
"--console-log-level=warn",
|
"--console-log-level=warn",
|
||||||
"--summary-interval=1",
|
"--summary-interval=1",
|
||||||
"--allow-overwrite=true",
|
"--allow-overwrite=true",
|
||||||
"--connect-timeout=30",
|
|
||||||
"--max-tries=3",
|
|
||||||
"--dir=" + fileInfo.absolutePath(),
|
"--dir=" + fileInfo.absolutePath(),
|
||||||
"--out=" + fileInfo.fileName(),
|
"--out=" + fileInfo.fileName(),
|
||||||
metalinkUrl
|
metalinkUrl
|
||||||
|
|||||||
@@ -229,7 +229,7 @@ void MainWindow::initStyle()
|
|||||||
void MainWindow::checkUpdates()
|
void MainWindow::checkUpdates()
|
||||||
{
|
{
|
||||||
aptssUpdater updater;
|
aptssUpdater updater;
|
||||||
QJsonArray updateInfo = updater.mergeUpdateInfo();
|
QJsonArray updateInfo = updater.getUpdateInfoAsJson();
|
||||||
|
|
||||||
// 分离正常应用和忽略应用
|
// 分离正常应用和忽略应用
|
||||||
QJsonArray normalApps;
|
QJsonArray normalApps;
|
||||||
@@ -265,7 +265,7 @@ void MainWindow::checkUpdates()
|
|||||||
|
|
||||||
for (const auto &item : finalApps) {
|
for (const auto &item : finalApps) {
|
||||||
QJsonObject obj = item.toObject();
|
QJsonObject obj = item.toObject();
|
||||||
qDebug() << "模型设置的包名:" << obj["package"].toString() << "忽略状态:" << obj["ignored"].toBool() << "来源:" << obj["source"].toString();
|
qDebug() << "模型设置的包名:" << obj["package"].toString() << "忽略状态:" << obj["ignored"].toBool();
|
||||||
qDebug() << "模型设置的下载 URL:" << obj["download_url"].toString(); // 检查模型数据
|
qDebug() << "模型设置的下载 URL:" << obj["download_url"].toString(); // 检查模型数据
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,11 +120,8 @@ _create_lock()
|
|||||||
# unlock and remove the lock file
|
# unlock and remove the lock file
|
||||||
_remove_lock()
|
_remove_lock()
|
||||||
{
|
{
|
||||||
# Only unlock if lock file exists (was created by _create_lock)
|
flock -u "$LCK_FD" 2>/dev/null
|
||||||
if [ -f "$LCK_FILE.lock" ]; then
|
rm -f "$LCK_FILE.lock"
|
||||||
flock -u "$LCK_FD" 2>/dev/null
|
|
||||||
rm -f "$LCK_FILE.lock"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# Search for known options and decide if root privileges are needed.
|
# Search for known options and decide if root privileges are needed.
|
||||||
@@ -824,9 +821,6 @@ elif [ "$option" == "download" ]; then
|
|||||||
"${_APTMGR}" "$@"
|
"${_APTMGR}" "$@"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Clean up temporary directory for download command
|
|
||||||
cleanup_aptfast
|
|
||||||
|
|
||||||
elif [ "$option" == "source" ]; then
|
elif [ "$option" == "source" ]; then
|
||||||
msg
|
msg
|
||||||
msg "Working... this may take a while." "normal"
|
msg "Working... this may take a while." "normal"
|
||||||
@@ -853,9 +847,6 @@ elif [ "$option" == "source" ]; then
|
|||||||
# dpkg-source -x "$(basename "$srcfile")"
|
# dpkg-source -x "$(basename "$srcfile")"
|
||||||
#done < "$DLLIST"
|
#done < "$DLLIST"
|
||||||
|
|
||||||
# Clean up temporary directory for source command
|
|
||||||
cleanup_aptfast
|
|
||||||
|
|
||||||
# Execute package manager directly if unknown options are passed.
|
# Execute package manager directly if unknown options are passed.
|
||||||
else
|
else
|
||||||
"${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@"
|
"${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@"
|
||||||
|
|||||||
+4
-23
@@ -88,7 +88,7 @@ done
|
|||||||
}
|
}
|
||||||
|
|
||||||
function exec_link_clean(){
|
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/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 &
|
find /usr/share/icons -xtype l -exec echo '{} is invalid now and going to be cleaned' \; -exec unlink {} \; 2>/dev/null &
|
||||||
@@ -98,32 +98,13 @@ 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/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/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/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/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/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 /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 &
|
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(){
|
function exec_uos_package_update(){
|
||||||
update-icon-caches /usr/share/icons/* > /dev/null 2>&1 &
|
update-icon-caches /usr/share/icons/* > /dev/null 2>&1 &
|
||||||
|
|||||||
+8
-8
@@ -85,8 +85,8 @@ case $(arch) in
|
|||||||
STORE_LIST_URL=""
|
STORE_LIST_URL=""
|
||||||
;;
|
;;
|
||||||
aarch64)
|
aarch64)
|
||||||
STORE_URL="arm64-apm"
|
STORE_URL="aarch64-apm"
|
||||||
STORE_LIST_URL="-arm64"
|
STORE_LIST_URL="-aarch64"
|
||||||
;;
|
;;
|
||||||
loongarch64)
|
loongarch64)
|
||||||
STORE_URL="loong64-apm"
|
STORE_URL="loong64-apm"
|
||||||
@@ -345,7 +345,7 @@ function create_desktop_in_ace() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# 如果是强制创建,或者没有配置禁止创建
|
# 如果是强制创建,或者没有配置禁止创建
|
||||||
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || ! [ -e ~/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ]; then
|
if [ "$FORCE_CREATE_DESKTOP" -eq 1 ] || ! $ace_cmd "[ -e ~/.config/spark-union/spark-store/ssshell-config-do-not-create-desktop ]"; then
|
||||||
echo "在ACE环境中创建桌面快捷方式..."
|
echo "在ACE环境中创建桌面快捷方式..."
|
||||||
export -f exec_create_desktop_file
|
export -f exec_create_desktop_file
|
||||||
export package_name
|
export package_name
|
||||||
@@ -376,10 +376,10 @@ function install_in_ace_env() {
|
|||||||
$ace_cmd "ensure_aptss_exist"
|
$ace_cmd "ensure_aptss_exist"
|
||||||
|
|
||||||
# 首先尝试dry-run测试
|
# 首先尝试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测试失败,尝试更新后重试..."
|
echo "初始dry-run测试失败,尝试更新后重试..."
|
||||||
$ace_cmd aptss update
|
$ace_cmd "aptss update"
|
||||||
if ! $ace_cmd aptss install --dry-run "$deb_path"; then
|
if ! $ace_cmd "aptss install --dry-run '$deb_path'"; then
|
||||||
echo "dry-run测试仍然失败,放弃安装"
|
echo "dry-run测试仍然失败,放弃安装"
|
||||||
echo "OMG_IT_GOES_WRONG"
|
echo "OMG_IT_GOES_WRONG"
|
||||||
return 1
|
return 1
|
||||||
@@ -387,8 +387,8 @@ function install_in_ace_env() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# dry-run成功后执行实际安装
|
# dry-run成功后执行实际安装
|
||||||
$ace_cmd aptss install store.spark-app.app-runtime-base --no-install-recommends -yfq
|
$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
|
if $ace_cmd "dpkg -i '$deb_path' || aptss install '$deb_path' -yfq"; then
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -5,39 +5,41 @@ readonly ACE_ENVIRONMENTS=(
|
|||||||
"deepin23-run:amber-ce-deepin23"
|
"deepin23-run:amber-ce-deepin23"
|
||||||
"sid-run:amber-ce-sid"
|
"sid-run:amber-ce-sid"
|
||||||
)
|
)
|
||||||
dpkg -s '$1' 2>/dev/null | grep -q 'Status: install ok installed' > /dev/null 2>&1
|
dpkg -s "$1" > /dev/null
|
||||||
RET="$?"
|
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
|
||||||
echo "----------------------------------------"
|
ace_cmd=${ace_entry%%:*}
|
||||||
echo "正在检查 $ace_cmd 环境的安装..."
|
if command -v "$ace_cmd" >/dev/null 2>&1; then
|
||||||
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 "----------------------------------------"
|
||||||
echo "在 $ace_cmd 环境中找到了安装"
|
echo "正在检查 $ace_cmd 环境的安装..."
|
||||||
echo "----------------------------------------"
|
|
||||||
exit $try_run_ret
|
|
||||||
else
|
|
||||||
echo "----------------------------------------"
|
|
||||||
echo "在 $ace_cmd 环境中未能找到安装,继续查找"
|
|
||||||
echo "----------------------------------------"
|
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
|
fi
|
||||||
fi
|
done
|
||||||
done
|
echo "----------------------------------------"
|
||||||
echo "----------------------------------------"
|
echo "所有已安装的 ACE 环境中未能找到安装,退出"
|
||||||
echo "所有已安装的 ACE 环境中未能找到安装,退出"
|
echo "----------------------------------------"
|
||||||
echo "----------------------------------------"
|
exit "$RET"
|
||||||
exit "$RET"
|
fi
|
||||||
fi
|
|
||||||
## 如果在ACE环境中或者未出错
|
## 如果在ACE环境中或者未出错
|
||||||
exit "$RET"
|
exit "$RET"
|
||||||
|
|||||||
@@ -1,152 +0,0 @@
|
|||||||
#!/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"
|
|
||||||
Reference in New Issue
Block a user