diff --git a/debian/changelog b/debian/changelog index 6692452..521ab0b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,14 @@ +spark-store (4.5.0) UNRELEASED; urgency=medium + + * 支持从商店中直接启动应用 + * ssinstall 修复安装时不再指定版本号以避免出现问题 + * aptss支持fish补全 + * 修复: distrobox下无法正常校验应用hash + * aptss 4.5.0 + * 应用更新新增进度条 + + -- shenmo Tue, 24 Sep 2024 11:27:08 +0800 + spark-store (4.3.3.2) UNRELEASED; urgency=medium * 提升升级工具体验,不再反复弹窗 diff --git a/pkg/usr/share/bash-completion/completions/aptss b/pkg/usr/share/bash-completion/completions/aptss index 087c51e..91e12ef 100644 --- a/pkg/usr/share/bash-completion/completions/aptss +++ b/pkg/usr/share/bash-completion/completions/aptss @@ -40,7 +40,7 @@ _aptss() "list" "search" "show" "showsrc" - "install" "remove" "purge" "autoremove" + "install" "remove" "purge" "autoremove" "autopurge" "update" "upgrade" "full-upgrade" "dist-upgrade" "edit-sources" diff --git a/pkg/usr/share/fish/completions/aptss.fish b/pkg/usr/share/fish/completions/aptss.fish new file mode 100644 index 0000000..0bb08fa --- /dev/null +++ b/pkg/usr/share/fish/completions/aptss.fish @@ -0,0 +1,242 @@ +# 清除已有的 aptss 补全(如果有的话) +complete -c aptss -e + +# 禁用默认的文件补全(避免显示当前目录文件) +complete -c aptss -f + +######################################################################## +# aptss Fish 补全脚本(中文说明版,软件包补全显示简介) +# +# 说明: +# 1. 子命令和选项的说明采用中文显示。 +# 2. 软件包补全部分不再调用 apt-cache,而是解析 aptss 自有的软件源索引文件, +# 从 /var/lib/aptss/lists/*Packages(或 *Sources)中提取软件包名称及简介信息。 +# +# 注意:如果你的 aptss 软件源索引文件位置或格式有变化,请相应修改下面的 awk 命令。 +######################################################################## + +### 辅助函数 + +# 解析 /var/lib/aptss/lists/*Packages 文件,输出符合当前输入前缀的“软件包简介” +function __fish_aptss_print_packages + set cur (commandline -ct) + # 将所有匹配的 Packages 文件拼接后,用 awk 分段解析(RS="" 表示以空行为分段) + awk -v cur="$cur" ' + BEGIN { RS=""; FS="\n" } + { + pkg = ""; desc = ""; + for(i=1; i<=NF; i++){ + if($i ~ /^Package: /) { pkg = substr($i, 10) } # “Package: ”共9个字符 + else if($i ~ /^Description: /) { desc = substr($i, 14) } # “Description: ”共13个字符 + } + if(pkg != "" && (cur == "" || pkg ~ ("^" cur))) { + print pkg "\t" desc + } + } + ' /var/lib/aptss/lists/*Packages 2>/dev/null +end + +# 解析已安装软件包(这里仍使用 dpkg-query,如果需要使用 aptss 数据,可另外构造) +function __fish_aptss_print_installed_packages + set cur (commandline -ct) + dpkg-query -W -f='${Package}\t${Description}\n' 2>/dev/null | grep -i "^$cur" +end + +# 解析 /var/lib/aptss/lists/*Sources 文件,输出源代码包信息(如果存在) +function __fish_aptss_print_source_packages + set cur (commandline -ct) + awk -v cur="$cur" ' + BEGIN { RS=""; FS="\n" } + { + pkg = ""; desc = ""; + for(i=1; i<=NF; i++){ + if($i ~ /^Package: /) { pkg = substr($i, 10) } + else if($i ~ /^Description: /) { desc = substr($i, 14) } + } + if(pkg != "" && (cur == "" || pkg ~ ("^" cur))) { + print pkg "\t" desc + } + } + ' /var/lib/aptss/lists/*Sources 2>/dev/null +end + +# 翻译子命令为中文说明(用于补全时显示在括号内) +function __fish_translate_aptss_cmd + switch $argv[1] + case ssupdate + echo "更新软件源" + case list + echo "列出软件包" + case search + echo "搜索软件包" + case show + echo "显示软件包信息" + case showsrc + echo "显示源包信息" + case install + echo "安装软件包" + case remove + echo "移除软件包" + case purge + echo "彻底移除软件包" + case autoremove + echo "自动移除不必要的软件包" + case update + echo "更新软件包列表" + case upgrade + echo "升级软件包" + case full-upgrade + echo "完全升级(可能移除其他软件包)" + case dist-upgrade + echo "发行版升级" + case edit-sources + echo "编辑软件源列表" + case help + echo "显示帮助信息" + case source + echo "下载源代码包" + case build-dep + echo "安装构建依赖" + case clean + echo "清除软件包缓存" + case autoclean + echo "自动清理旧缓存" + case download + echo "下载软件包" + case changelog + echo "显示更新日志" + case moo + echo "彩蛋" + case depends + echo "显示软件包依赖" + case rdepends + echo "显示软件包逆向依赖" + case policy + echo "显示软件包策略" + case '*' + echo $argv[1] + end +end + +### 定义各类子命令组 + +# 所有子命令列表 +set -g __aptss_commands ssupdate list search show showsrc install remove purge autoremove update upgrade full-upgrade dist-upgrade edit-sources help source build-dep clean autoclean download changelog moo depends rdepends policy + +# 需要补全二进制软件包名称的子命令(例如 install、show、search、download、changelog、depends、rdepends) +set -l __aptss_pkg_subcmds install show search download changelog depends rdepends + +# 需要补全已安装软件包的子命令(例如 remove、purge、autoremove) +set -l __aptss_installed_pkg_subcmds remove purge autoremove + +# 需要补全源代码包的子命令(例如 source、build-dep、showsrc、policy) +set -l __aptss_src_pkg_subcmds source build-dep showsrc policy + +### 子命令补全 +# 未输入子命令时,显示所有候选子命令,并在括号中显示中文说明 +for cmd in $__aptss_commands + set desc (__fish_translate_aptss_cmd $cmd) + complete -c aptss -a $cmd -d "$desc" -n "not __fish_seen_subcommand_from $__aptss_commands" +end + +### 公共选项(适用于一组子命令) +set -l group1 "install remove purge upgrade dist-upgrade full-upgrade autoremove" + +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l show-progress -d '显示进度' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l fix-broken -d '修复损坏的依赖' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l purge -d '清除配置文件' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l verbose-versions -d '显示详细版本' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l auto-remove -d '自动移除依赖' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -s s -l simulate -d '模拟/试运行' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l download -d '下载软件包' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l fix-missing -d '修复丢失文件' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l fix-policy -d '修复策略' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l ignore-hold -d '忽略锁定' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l force-yes -d '强制确认' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l trivial-only -d '仅处理简单情况' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l reinstall -d '重新安装' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l solver -d '使用求解器' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -s t -l target-release -d '目标版本' + +# 附加的 GENERIC 选项 +complete -c aptss -n "__fish_seen_subcommand_from $group1" -s d -l download-only -d '仅下载' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -s y -l assume-yes -d '默认确认' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -l assume-no -d '默认否定' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -s u -l show-upgraded -d '显示升级情况' +complete -c aptss -n "__fish_seen_subcommand_from $group1" -s m -l ignore-missing -d '忽略缺失' + +### 针对各个子命令的专用选项 + +# update 命令 +complete -c aptss -n "__fish_seen_subcommand_from update" -l list-cleanup -d '清理列表' +complete -c aptss -n "__fish_seen_subcommand_from update" -l print-uris -d '显示 URI' +complete -c aptss -n "__fish_seen_subcommand_from update" -l allow-insecure-repositories -d '允许不安全的仓库' + +# list 命令 +complete -c aptss -n "__fish_seen_subcommand_from list" -l installed -d '已安装的软件包' +complete -c aptss -n "__fish_seen_subcommand_from list" -l upgradable -d '可升级的软件包' +complete -c aptss -n "__fish_seen_subcommand_from list" -l manual-installed -d '手动安装的软件包' +complete -c aptss -n "__fish_seen_subcommand_from list" -s v -l verbose -d '详细模式' +complete -c aptss -n "__fish_seen_subcommand_from list" -s a -l all-versions -d '显示所有版本' +complete -c aptss -n "__fish_seen_subcommand_from list" -s t -l target-release -d '目标版本' + +# show 命令 +complete -c aptss -n "__fish_seen_subcommand_from show" -s a -l all-versions -d '显示所有版本' + +# depends 和 rdepends 命令(逐项添加各选项) +for opt in i important installed pre-depends depends recommends suggests replaces breaks conflicts enhances recurse implicit + complete -c aptss -n "__fish_seen_subcommand_from depends rdepends" -l $opt -d $opt +end +complete -c aptss -n "__fish_seen_subcommand_from depends rdepends" -s i -d '选项 -i' + +# search 命令 +complete -c aptss -n "__fish_seen_subcommand_from search" -s n -l names-only -d '仅匹配名称' +complete -c aptss -n "__fish_seen_subcommand_from search" -s f -l full -d '全文搜索' + +# showsrc 命令 +complete -c aptss -n "__fish_seen_subcommand_from showsrc" -l only-source -d '仅显示源代码' + +# source 命令 +complete -c aptss -n "__fish_seen_subcommand_from source" -s s -l simulate -d '模拟' +complete -c aptss -n "__fish_seen_subcommand_from source" -s b -l compile -d '编译/构建' +complete -c aptss -n "__fish_seen_subcommand_from source" -s P -l build-profiles -d '构建配置' +complete -c aptss -n "__fish_seen_subcommand_from source" -l diff-only -d '仅显示差异' +complete -c aptss -n "__fish_seen_subcommand_from source" -l debian-only -d '仅限 Debian' +complete -c aptss -n "__fish_seen_subcommand_from source" -l tar-only -d '仅打包 tar' +complete -c aptss -n "__fish_seen_subcommand_from source" -l dsc-only -d '仅下载 DSC' +complete -c aptss -n "__fish_seen_subcommand_from source" -s t -l target-release -d '目标版本' + +# build-dep 命令 +complete -c aptss -n "__fish_seen_subcommand_from build-dep" -s a -l host-architecture -d '主机架构' +complete -c aptss -n "__fish_seen_subcommand_from build-dep" -s s -l simulate -d '模拟' +complete -c aptss -n "__fish_seen_subcommand_from build-dep" -s P -l build-profiles -d '构建配置' +complete -c aptss -n "__fish_seen_subcommand_from build-dep" -s t -l target-release -d '目标版本' +complete -c aptss -n "__fish_seen_subcommand_from build-dep" -l purge -d '清除' +complete -c aptss -n "__fish_seen_subcommand_from build-dep" -l solver -d '求解依赖' + +# moo 命令 +complete -c aptss -n "__fish_seen_subcommand_from moo" -l color -d '彩蛋模式' + +# clean 和 autoclean 命令 +complete -c aptss -n "__fish_seen_subcommand_from clean autoclean" -s s -l simulate -d '模拟' + +### 针对 -t/--target-release 的特殊补全 +complete -c aptss -n ' + begin + set -l prev (commandline -poc | string trim) + test "$prev" = "-t" -o "$prev" = "--target-release" + end +' -a '(__fish_aptss_target_release)' -d '目标版本' + +### 软件包补全 +# 对于需要二进制软件包名称的子命令,调用 __fish_aptss_print_packages, +# 输出的每一行格式为 "包名简介",Fish 会将 TAB 后内容显示为注释。 +complete -c aptss -n "__fish_seen_subcommand_from $__aptss_pkg_subcmds" -a '(__fish_aptss_print_packages)' + +# 对于 remove、purge、autoremove 命令,补全已安装的软件包(使用 dpkg-query 输出) +complete -c aptss -n "__fish_seen_subcommand_from $__aptss_installed_pkg_subcmds" -a '(__fish_aptss_print_installed_packages)' -d '已安装软件包' + +# 对于 source、build-dep、showsrc、policy 命令,补全源代码包, +# 如果存在对应的 Sources 索引文件,则调用 __fish_aptss_print_source_packages, +# 否则可考虑默认使用二进制包的索引。 +complete -c aptss -n "__fish_seen_subcommand_from $__aptss_src_pkg_subcmds" -a '(__fish_aptss_print_source_packages)' -d '源代码包' diff --git a/src/assets/icon/logo.xcf b/src/assets/icon/logo.xcf new file mode 100644 index 0000000..7a02e0c Binary files /dev/null and b/src/assets/icon/logo.xcf differ diff --git a/src/pages/appintopage.cpp b/src/pages/appintopage.cpp index 63b0235..9ef148c 100644 --- a/src/pages/appintopage.cpp +++ b/src/pages/appintopage.cpp @@ -180,7 +180,19 @@ void AppIntoPage::openUrl(const QUrl &url) { if (isUpdated) { - ui->downloadButton->setText(tr("Reinstall")); + QProcess process; + QStringList arguments; + arguments << "check" << info["Pkgname"].toString(); + process.start("/opt/durapps/spark-store/bin/store-helper/ss-launcher", arguments); + if (process.waitForFinished()) { + exitCode = process.exitCode(); + exitStatus = process.exitStatus(); + if (exitCode != 0){ + ui->downloadButton->setText(tr("Reinstall")); + }else{ + ui->downloadButton->setText(tr("Launch")); + } + } ui->downloadButton->setEnabled(true); ui->downloadButton->show(); ui->pushButton_3->show(); @@ -357,14 +369,25 @@ void AppIntoPage::isDownloading(const QUrl &url) int exitCode = process.exitCode(); QProcess::ExitStatus exitStatus = process.exitStatus(); - process.close(); if (exitCode == 0 && exitStatus == QProcess::NormalExit) { + QStringList arguments; + arguments << "check" << info["Pkgname"].toString(); + process.start("/opt/durapps/spark-store/bin/store-helper/ss-launcher", arguments); + if (process.waitForFinished()) { + exitCode = process.exitCode(); + exitStatus = process.exitStatus(); + if (exitCode != 0){ + ui->downloadButton->setText(tr("Reinstall")); + }else{ + ui->downloadButton->setText(tr("Launch")); + } + } ui->downloadButton->setEnabled(true); - ui->downloadButton->setText(tr("Reinstall")); ui->downloadButton->show(); ui->pushButton_3->show(); + process.close(); } else { @@ -498,6 +521,15 @@ void AppIntoPage::on_downloadButton_clicked() return; } + else if (ui->downloadButton->text() == tr("Launch")) + { + QString scriptPath = "/opt/durapps/spark-store/bin/store-helper/ss-launcher"; + QStringList arguments; + arguments << "launch" << info["Pkgname"].toString(); + QProcess process; + process.startDetached(scriptPath, arguments); + return; + } emit clickedDownloadBtn(); @@ -506,7 +538,6 @@ void AppIntoPage::on_downloadButton_clicked() { return; } - if (ui->downloadButton->text() == tr("Reinstall")) { item->reinstall = true; diff --git a/tool/apt-fast-conf/aptss-apt.conf b/tool/apt-fast-conf/aptss-apt.conf index c7e4d07..a6e0d63 100644 --- a/tool/apt-fast-conf/aptss-apt.conf +++ b/tool/apt-fast-conf/aptss-apt.conf @@ -7,6 +7,8 @@ Dir::State::lists "/var/lib/aptss/lists/"; APT::Get::Fix-Broken true; APT::Get::List-Cleanup="0"; +Acquire::GzipIndexes "false"; + #clear APT::Update::Post-Invoke-Success; #clear DPkg::Post-Invoke; diff --git a/tool/apt-fast/ss-apt-fast b/tool/apt-fast/ss-apt-fast index 88c8838..1734187 100755 --- a/tool/apt-fast/ss-apt-fast +++ b/tool/apt-fast/ss-apt-fast @@ -1,21 +1,25 @@ #!/bin/bash -# -# apt-fast v1.9 +# +# apt-fast v1.10.0 # Use this just like aptitude or apt-get for faster package downloading. # # Copyright: 2008-2012 Matt Parnell, http://www.mattparnell.com -# Improvements, maintenance, revisions - 2012, 2017-2018 Dominique Lasserre +# Improvements, maintenance, revisions - 2012, 2017-2019 Dominique Lasserre # # You may distribute this file under the terms of the GNU General # Public License as published by the Free Software Foundation; either # version 3 of the License, or (at your option) any later version. # + +shopt -s nullglob [ -n "$DEBUG" ] && set -xv # Print colored messages. # Usage: msg "message text" "message type" "optional: err" # Message types are 'normal', 'hint' or 'warning'. Warnings and messages with a # third argument are piped to stderr. + +THREADS=$(nproc 2>/dev/null || echo 4) msg(){ msg_options=() case "$2" in @@ -34,7 +38,7 @@ msg(){ } # Search for known options and decide if root privileges are needed. -root=1 # default value: we need root privileges +root=$# option= for argument in "$@"; do case "$argument" in @@ -70,7 +74,6 @@ TMP__APTMGR="${_APTMGR-${TMP_RANDOM}}" TMP_APTCACHE="${APTCACHE-${TMP_RANDOM}}" TMP_DLDIR="${DLDIR-${TMP_RANDOM}}" TMP_DLLIST="${DLLIST-${TMP_RANDOM}}" -TMP_LISTDIR="${LISTDIR-${TMP_RANDOM}}" TMP__MAXNUM="${MAXNUM-${TMP_RANDOM}}" TMP__MAXCONPERSRV="${MAXCONPERSRV-${TMP_RANDOM}}" TMP__SPLITCON="${SPLITCON-${TMP_RANDOM}}" @@ -78,6 +81,7 @@ TMP__MINSPLITSZ=${MINSPLITSZ-${TMP_RANDOM}} TMP__PIECEALGO=${PIECEALGO-${TMP_RANDOM}} TMP_aptfast_prefix="${aptfast_prefix-${TMP_RANDOM}}" TMP_APT_FAST_TIMEOUT="${APT_FAST_TIMEOUT-${TMP_RANDOM}}" +TMP_APT_FAST_APT_AUTH="${APT_FAST_APT_AUTH-${TMP_RANDOM}}" TMP_VERBOSE_OUTPUT="${VERBOSE_OUTPUT-${TMP_RANDOM}}" TMP_ftp_proxy="${ftp_proxy-${TMP_RANDOM}}" TMP_http_proxy="${http_proxy-${TMP_RANDOM}}" @@ -85,7 +89,7 @@ TMP_https_proxy="${https_proxy-${TMP_RANDOM}}" # Check for proper privileges. # Call explicitly with environment variables to get them into root conext. -if [ "$root" = 1 ] && [ "$UID" != 0 ]; then +if [ "$root" -ne 0 ] && [ "$UID" != 0 ]; then exec sudo DEBUG="$DEBUG" \ LCK_FILE="$TMP_LCK_FILE" \ DOWNLOADBEFORE="$TMP_DOWNLOADBEFORE" \ @@ -93,7 +97,6 @@ if [ "$root" = 1 ] && [ "$UID" != 0 ]; then APTCACHE="$TMP_APTCACHE" \ DLDIR="$TMP_DLDIR" \ DLLIST="$TMP_DLLIST" \ - LISTDIR="$TMP_LISTDIR" \ _MAXNUM="$TMP__MAXNUM" \ _MAXCONPERSRV="$TMP__MAXCONPERSRV" \ _SPLITCON="$TMP__SPLITCON" \ @@ -101,6 +104,7 @@ if [ "$root" = 1 ] && [ "$UID" != 0 ]; then _PIECEALGO="$TMP__PIECEALGO" \ aptfast_prefix="$TMP_aptfast_prefix" \ APT_FAST_TIMEOUT="$TMP_APT_FAST_TIMEOUT" \ + APT_FAST_APT_AUTH="$TMP_APT_FAST_APT_AUTH" \ VERBOSE_OUTPUT="$TMP_VERBOSE_OUTPUT" \ ftp_proxy="$TMP_ftp_proxy" \ http_proxy="$TMP_http_proxy" \ @@ -108,7 +112,6 @@ if [ "$root" = 1 ] && [ "$UID" != 0 ]; then "$0" "$@" fi - # Define lockfile. # Use /tmp as directory because everybody (not only root) has to have write # permissions. @@ -123,27 +126,39 @@ LCK_FD=99 # Set default package manager, APT cache, temporary download dir, # temporary download list file, and maximal parallel downloads -_APTMGR=apt-get +_APTMGR=apt-get eval "$(apt-config shell APTCACHE Dir::Cache::archives/d)" # Check if APT config option Dir::Cache::archives::apt-fast-partial is set. eval "$(apt-config shell apt_fast_partial Dir::Cache::archives::apt-fast-partial/d)" if [ -z "$apt_fast_partial" ]; then - eval "$(apt-config -o Dir::Cache::archives::apt-fast-partial=apt-fast shell DLDIR Dir::Cache::archives::apt-fast-partial/d)" + DLDIR="$(realpath "${APTCACHE}/../apt-fast")" else - eval "$(apt-config shell DLDIR Dir::Cache::archives::apt-fast-partial/d)" + DLDIR="${apt_fast_partial}" fi -# Currently not needed. -eval "$(apt-config shell LISTDIR Dir::State::lists/d)" + +# Check for apt auth files +eval "$(apt-config shell NETRC Dir::Etc::netrc/f)" +eval "$(apt-config shell NETRCDIR Dir::Etc::netrcparts/d)" +APTAUTHFILES=() +if [ -f "$NETRC" ]; then + APTAUTHFILES=("$NETRC") +fi +APTAUTHFILES+=("$NETRCDIR"*) + if [ "$IS_ACE_ENV" != "" ];then DLLIST="/tmp/apt-fast-in-container.list" else DLLIST="/tmp/apt-fast.list" fi + + + _MAXNUM=5 _MAXCONPERSRV=10 _SPLITCON=8 _MINSPLITSZ="1M" _PIECEALGO="default" +MIRRORS=() # Prefix in front of apt-fast output: aptfast_prefix= @@ -162,6 +177,9 @@ APT_FAST_TIMEOUT=60 # Ask for download confirmation if unset DOWNLOADBEFORE= +# Enable APT authentication support +APT_FAST_APT_AUTH=1 + # Formatted package list in download confirmation if unset VERBOSE_OUTPUT= @@ -188,7 +206,6 @@ https_proxy= [ "$TMP_APTCACHE" = "$TMP_RANDOM" ] || APTCACHE="$TMP_APTCACHE" [ "$TMP_DLDIR" = "$TMP_RANDOM" ] || DLDIR="$TMP_DLDIR" [ "$TMP_DLLIST" = "$TMP_RANDOM" ] || DLLIST="$TMP_DLLIST" -[ "$TMP_LISTDIR" = "$TMP_RANDOM" ] || LISTDIR="$TMP_LISTDIR" [ "$TMP__MAXNUM" = "$TMP_RANDOM" ] || _MAXNUM="$TMP__MAXNUM" [ "$TMP__MAXCONPERSRV" = "$TMP_RANDOM" ] || _MAXCONPERSRV="$TMP__MAXCONPERSRV" [ "$TMP__SPLITCON" = "$TMP_RANDOM" ] || _SPLITCON="$TMP__SPLITCON" @@ -196,6 +213,7 @@ https_proxy= [ "$TMP__PIECEALGO" = "$TMP_RANDOM" ] || _PIECEALGO="$TMP__PIECEALGO" [ "$TMP_aptfast_prefix" = "$TMP_RANDOM" ] || aptfast_prefix="$TMP_aptfast_prefix" [ "$TMP_APT_FAST_TIMEOUT" = "$TMP_RANDOM" ] || APT_FAST_TIMEOUT="$TMP_APT_FAST_TIMEOUT" +[ "$TMP_APT_FAST_APT_AUTH" = "$TMP_RANDOM" ] || APT_FAST_APT_AUTH="$TMP_APT_FAST_APT_AUTH" [ "$TMP_VERBOSE_OUTPUT" = "$TMP_RANDOM" ] || VERBOSE_OUTPUT="$TMP_VERBOSE_OUTPUT" [ "$TMP_ftp_proxy" = "$TMP_RANDOM" ] || ftp_proxy="$TMP_ftp_proxy" [ "$TMP_http_proxy" = "$TMP_RANDOM" ] || http_proxy="$TMP_http_proxy" @@ -231,17 +249,25 @@ _create_lock() { eval "exec $LCK_FD>\"$LCK_FILE.lock\"" -# trap "cleanup_aptfast; exit_cleanup_state" EXIT -# This will hide the exit code + # 设置 trap 来清理资源 trap "cleanup_aptfast" EXIT trap "cleanup_aptfast; exit 1" INT TERM - timer=0 - until $(flock -xn $LCK_FD);do - msg_already_running - sleep 1 - let timer+=1 - done - unset timer + + timer=0 + max_wait=180 # 最大等待时间为180秒(3分钟) + + until $(flock -xn $LCK_FD); do + msg_already_running + sleep 1 + let timer+=1 + + if [ $timer -ge $max_wait ]; then + echo "timeout" + exit 1 + fi + done + + unset timer } # unlock and remove the lock file @@ -271,7 +297,8 @@ cleanup_dllist() cleanup_aptfast() { - [ "$CLEANUP_STATE" -eq 0 ] && CLEANUP_STATE=$? + local last_exit_code=$? + [ "$CLEANUP_STATE" -eq 0 ] && CLEANUP_STATE=$last_exit_code cleanup_dllist _remove_lock } @@ -300,7 +327,7 @@ get_mirrors(){ for mirror in "${mirrors[@]}"; do # Real expension. if [[ "$1" == "$mirror"* ]]; then - filepath=${1#${mirror}} + filepath="${1#"${mirror}"}" # Build list for aria download list. list="${mirrors[*]:1}" echo -e "${list// /${filepath}\\t}$filepath\n" @@ -311,67 +338,128 @@ get_mirrors(){ # No other mirrors found. echo "$1" } + ##########SPARK ADJUST: END + +AUTH_INFO_PARSED=() +# Parse apt authentication files. +# Undefined behavior on whitespaces in host, username or password. +prepare_auth(){ + if [ "$APT_FAST_APT_AUTH" -eq 0 ]; then + return + fi + for auth_file in "${APTAUTHFILES[@]}"; do + # auth files have netrc syntax, possible multiline entries starting with "machine" + auth_info="$(tr '\n' ' ' < "$auth_file" | sed 's/\(\\)/\n\1/g' | sed '1d')" + while IFS= read -r auth; do + machine="$(echo "$auth" | sed 's/.*\[ \t]\+\([^ \t]\+\).*/\1/')" + login="$(echo "$auth" | sed 's/.*\[ \t]\+\([^ \t]\+\).*/\1/')" + password="$(echo "$auth" | sed 's/.*\[ \t]\+\([^ \t]\+\).*/\1/')" + # if machine does not have protocol, try https:// + if ! [[ "$machine" =~ ^.*:// ]]; then + machine="https://$machine" + fi + if [ -z "$machine" ] || [ -z "$login" ] || [ -z "$password" ]; then + msg "Could not parse apt authentication (skipping): $auth ($auth_file)" "warning" + continue + fi + # use space separated string to convert back to array later + AUTH_INFO_PARSED+=("$machine $login $password") + done <<< "$auth_info" + done +} + +# Gets URI as parameter and tries to add basic http credentials. Will fail on +# credentials that contain characters that need URL-encoding. +get_auth(){ + if [ "$APT_FAST_APT_AUTH" -eq 0 ]; then + echo "$1" + return + fi + for auth_info in "${AUTH_INFO_PARSED[@]}"; do + # convert to array, don't escape variable here + auth_info_arr=($auth_info) + machine="${auth_info_arr[0]}" + # takes first match + if [[ "$1" == "$machine"* ]]; then + login="${auth_info_arr[1]}" + password="${auth_info_arr[2]}" + uri="$(echo "$1" | sed "s|^\([^:]\+://\)|\1$login:$password@|")" + echo "$uri" + return + fi + done + echo "$1" +} + # Globals to save package name, version, size and overall size. DOWNLOAD_DISPLAY= DOWNLOAD_SIZE=0 +# 获取包的URI # Get the package URLs. get_uris(){ - if [ ! -d "$(dirname "$DLLIST")" ] then if ! mkdir -p -- "$(dirname "$DLLIST")" then msg "Could not create download file directory." "warning" - msg "无法创建下载文件夹" "warning" - exit 1 + msg "无法创建下载目录" "warning" + CLEANUP_STATE=1 + exit fi elif [ -f "$DLLIST" ]; then if ! rm -f -- "$DLLIST" 2>/dev/null && ! touch -- "$DLLIST" 2>/dev/null then - msg "Unable to write to download file. Try restarting with root permissions or run 'aptss clean' first." "warning" + msg "Unable to write to download file. Try restarting with root permissions or run 'apt-fast clean' first." "warning" msg "无法下载文件。尝试使用root权限,或者运行 'aptss clean'" "warning" - exit 1 + CLEANUP_STATE=1 + exit fi fi # Add header to overwrite file. echo "# apt-fast mirror list: $(date)" > "$DLLIST" - #NOTE: aptitude doesn't have this functionality, so we use apt-get to get - # package URIs. -# case "$_APTMGR" in -# apt|apt-get) uri_mgr=$_APTMGR;; -# *) uri_mgr=apt-get;; -# esac - # NOTE:apt可能出现变动,不建议在脚本中使用,因此在此统一改用apt-get -uri_mgr=apt-get + # NOTE: "aptitude" doesn't have this functionality + # so we use "${_APTMGR}" to get package URI's + case "$(basename "${_APTMGR}")" in + 'apt'|'apt-get') uri_mgr="${_APTMGR}";; + *) uri_mgr='apt-get';; + esac uris_full="$("$uri_mgr" "${APT_SCRIPT_WARNING[@]}" -y --print-uris "$@")" - uris_full_ret="$?" - if [ "$uris_full_ret" -ne 0 ] + CLEANUP_STATE="$?" + if [ "$CLEANUP_STATE" -ne 0 ] then msg "Package manager quit with exit code.Here is the log" "warning" msg "包管理器以错误代码退出.日志如下" "warning" msg "${uris_full}" - exit "$uris_full_ret" + exit"$CLEANUP_STATE" fi - while read -r pkg_uri_info - do - [ -z "$pkg_uri_info" ] && continue - ## --print-uris format is: - # 'fileurl' filename filesize checksum_hint:filechecksum - uri="$(echo "$pkg_uri_info" | cut -d' ' -f1 | tr -d "'")" - filename="$(echo "$pkg_uri_info" | cut -d' ' -f2)" - filesize="$(echo "$pkg_uri_info" | cut -d' ' -f3)" - checksum_string="$(echo "$pkg_uri_info" | cut -d' ' -f4)" - hash_algo="$(echo "$checksum_string" | cut -d':' -f1)" - checksum="$(echo "$checksum_string" | cut -d':' -f2)" + prepare_auth + local tmpdir=$(mktemp -d) || { + msg "Failed to create tmp dir" "warning" + msg "无法创建临时目录" "warning" + exit 1 + } + ## --print-uris format is: + # 'fileurl' filename filesize checksum_hint:filechecksum + process_package() { + local pkg_uri_info="$@" + + local display_line="" # 添加局部变量并初始化为空 + + IFS=' ' read -r uri filename filesize checksum_string _ <<<"$pkg_uri_info" + [ -z "$uri" ] && continue + uri="$(get_auth "${uri//"'"/}")" + IFS=':' read -r hash_algo checksum _ <<<"$checksum_string" filename_decoded="$(urldecode "$filename")" - DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY}$(echo "$filename_decoded" | cut -d'_' -f1)" - DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY} $(echo "$filename_decoded" | cut -d'_' -f2)" - DOWNLOAD_DISPLAY="${DOWNLOAD_DISPLAY} $(echo "$filesize" | numfmt --to=iec-i --suffix=B)\n" - DOWNLOAD_SIZE=$((DOWNLOAD_SIZE + filesize)) + IFS='_' read -r pkg_name_decoded pkg_version_decoded _ <<<"$filename_decoded" + + + + display_line="${display_line}$pkg_name_decoded $pkg_version_decoded" + display_line="${display_line} $(echo "$filesize" | numfmt --to=iec-i --suffix=B)\n" ## whole uri comes encoded (urlencoded). Filename must NOT be decoded because # plain aptitude do not decode it when download and install it. Therefore, we @@ -389,40 +477,44 @@ uri_mgr=apt-get *) hash_algo= esac - # Using apt-cache show package=version to ensure recover single and + + # Using apt-cache show package=version to ensure recover single and # correct package version. # Warning: assuming that package naming uses '_' as field separator. - # Therefore, this code expects package-name_version_arch.deb Otherways + # Therefore, this code expects package-name_version_arch.deb Otherwise # below code will fail resoundingly if [ -z "$hash_algo" ]; then - pkg_name="$(echo "$filename" | cut -d'_' -f1)" - pkg_version="$(echo "$filename" | cut -d'_' -f2)" - pkg_version="$(urldecode "$pkg_version")" - package_info="$(apt-cache show "$pkg_name=$pkg_version")" + IFS='_' read -r pkg_name _ <<<"$filename" + pkg_version="$pkg_version_decoded" + # Transform multi-line field output from apt-cache to single line and sort checksums, strongest first + package_info="$(apt-cache show "$pkg_name=$pkg_version" | sed ':r;$!{N;br};s/\n / /g' | sort -r)" - patch_checksum= - if [ -n "$SHA512_SUPPORTED" ]; then - patch_checksum="$(echo "$package_info" | grep SHA512 | head -n 1)" - [ -n "$patch_checksum" ] && hash_algo="sha-512" - fi - if [ -z "$patch_checksum" ] && [ -n "$SHA256_SUPPORTED" ]; then - patch_checksum="$(echo "$package_info" | grep SHA256 | head -n 1)" - [ -n "$patch_checksum" ] && hash_algo="sha-256" - fi - if [ -z "$patch_checksum" ] && [ -n "$SHA1_SUPPORTED" ]; then - patch_checksum="$(echo "$package_info" | grep SHA1 | head -n 1)" - [ -n "$patch_checksum" ] && hash_algo="sha-1" - fi - if [ -z "$patch_checksum" ] && [ -n "$MD5sum_SUPPORTED" ]; then - patch_checksum="$(echo "$package_info" | grep MD5sum | head -n 1)" - [ -n "$patch_checksum" ] && hash_algo="md5" - fi + while IFS=': ' read -r field checksum _ + do + case "$field" in + SHA512) + [ -n "$SHA512_SUPPORTED" ] || continue + hash_algo="sha-512" + break ;; + SHA256) + [ -n "$SHA256_SUPPORTED" ] || continue + hash_algo="sha-256" + break ;; + SHA1) + [ -n "$SHA1_SUPPORTED" ] || continue + hash_algo="sha-1" + break ;; + MD5sum) + [ -n "$MD5sum_SUPPORTED" ] || continue + hash_algo="md5" + break ;; + esac + done <<<"$package_info" - if [ -n "$patch_checksum" ]; then - checksum="$(echo "$patch_checksum" | cut -d' ' -f2)" - else + if [ -z "$hash_algo" ]; then + checksum= msg "Couldn't get supported checksum for $pkg_name ($pkg_version)." "warning" - msg "无法获得 $pkg_name ($pkg_version) 的受支持的散列验证值" "warning" + msg "无法获得 $pkg_name ($pkg_version) 版本受到支持的散列验证值" "warning" REMOVE_WORKING_MESSAGE= fi fi @@ -430,21 +522,64 @@ uri_mgr=apt-get hash_algo= fi - { - get_mirrors "$uri" - #echo " dir=$DLDIR" - if [ -n "$hash_algo" ]; then - echo " checksum=$hash_algo=$checksum" - fi - echo " out=$filename" - } >> "$DLLIST" - done <<<"$(echo "$uris_full" | grep -E "^'(http(s|)|(s|)ftp)://")" + # 使用文件锁安全写入下载列表 + ( + flock -x 200 # 获取排他锁 + { + get_mirrors "$uri" + [ -n "$hash_algo" ] && echo " checksum=$hash_algo=$checksum" + echo " out=$filename" + } >> "$DLLIST" + ) 200>>"$DLLIST" # 使用文件描述符200关联锁文件 + + # 将显示信息和文件大小存入临时文件 + echo "$display_line" >> "$tmpdir/display" + echo "$filesize" >> "$tmpdir/sizes" + } + + # 主并行处理逻辑(新增线程控制) + mapfile -t pkg_uri_list < <(echo "$uris_full" | grep -E "^'(http(s|)|(s|)ftp)://") + total_pkgs=${#pkg_uri_list[@]} + threads=${THREADS:-4} # 默认4线程 + per_thread=$(( (total_pkgs + threads - 1) / threads )) # 向上取整 + + # 分割任务到不同线程 + for ((i=0; i/dev/null || exit 1 + cd "$DLDIR" &>/dev/null || { msg; msg "Not able to change into download directory." "warning"; CLEANUP_STATE=1; exit; } eval "${_DOWNLOADER}" # execute downloadhelper command if [ "$(find "$DLDIR" -printf . | wc -c)" -gt 1 ]; then @@ -616,22 +753,26 @@ if [ "$option" == "install" ]; then cd - &>/dev/null || msg "Failed to change back directory" "warning" fi else - exit 1 + CLEANUP_STATE=1 + exit fi else [ -t 1 ] && tput el fi - if [ -z "$DOWNLOAD_ONLY" ] || [ "$_APTMGR" == "aptitude" ]; then + # different problem resolving for aptitude + if [ -z "$DOWNLOAD_ONLY" ] || [ "$(basename "${_APTMGR}")" == 'aptitude' ]; then "${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@" fi elif [ "$option" == "clean" ]; then "${_APTMGR}" "${APT_SCRIPT_WARNING[@]}" "$@" && { - find "$DLDIR" -maxdepth 1 -type f -delete - CLEANUP_STATE="$?" - [ -f "$DLLIST" ] && rm -f -- "$DLLIST"* || true + if [ -d "$DLDIR" ]; then + find "$DLDIR" -maxdepth 1 -type f -delete + CLEANUP_STATE="$?" + [ -f "$DLLIST" ] && rm -f -- "$DLLIST"* || true + fi } elif [ "$option" == "download" ]; then @@ -649,7 +790,8 @@ elif [ "$option" == "download" ]; then eval "${_DOWNLOADER}" fi - if [ "$_APTMGR" == "aptitude" ]; then + # different problem resolving for aptitude + if [ "$(basename "${_APTMGR}")" == 'aptitude' ]; then "${_APTMGR}" "$@" fi diff --git a/tool/ssinstall b/tool/ssinstall index 20d6f90..45fcc1e 100755 --- a/tool/ssinstall +++ b/tool/ssinstall @@ -118,7 +118,7 @@ if [ ! -f "$1" ]; then PACKAGE_NAME=$(echo "$FILENAME" | sed -r 's/^([^_]+)_.*$/\1/') VERSION=$(echo "$FILENAME" | sed -r 's/^[^_]+_([^_]+)_.*$/\1/') pushd ${FILEPATH} - aptss download ${PACKAGE_NAME}=${VERSION} + aptss download ${PACKAGE_NAME} popd if [ ! -f "$1" ]; then echo "OMG-IT-GOES-WRONG" diff --git a/tool/store-helper/ss-launcher b/tool/store-helper/ss-launcher index a347a3d..563744b 100755 --- a/tool/store-helper/ss-launcher +++ b/tool/store-helper/ss-launcher @@ -41,12 +41,13 @@ function log.debug() { log.log "debug" $@; } function scan_desktop_file_log(){ unset desktop_file_path +package_name=$1 for desktop_file_path in $(dpkg -L "$1" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then log.info "$desktop_file_path is found." fi done - for desktop_file_path in $(dpkg -L "$1" |grep /opt/apps/$package_name/entries/applications | awk '/\.desktop$/ {print}'); do + for desktop_file_path in $(dpkg -L "$1" |grep /opt/apps/$package_name/entries/applications/ | awk '/\.desktop$/ {print}'); do if [ "$(cat $desktop_file_path | grep NoDisplay=true)" = "" ];then log.info "$desktop_file_path is found." fi @@ -100,7 +101,7 @@ function launch_app(){ log.info "Command is $exec_command" # 在默认终端执行命令 - eval "$exec_command" + bash -c $exec_command } if [ "$#" -lt 2 ];then diff --git a/tool/update-upgrade/ss-do-upgrade.sh b/tool/update-upgrade/ss-do-upgrade.sh index 80e6c90..474a777 100755 --- a/tool/update-upgrade/ss-do-upgrade.sh +++ b/tool/update-upgrade/ss-do-upgrade.sh @@ -1,16 +1,16 @@ #!/bin/bash + if [ "$(id -u)" != "0" ] ; then - if [ "$IS_ACE_ENV" = "1" ];then - /opt/durapps/spark-store/bin/store-helper/pass-auth.sh "$0" "$@" - else - xhost + - pkexec "$0" "$@" - exit - fi + if [ "$IS_ACE_ENV" = "1" ] ; then + /opt/durapps/spark-store/bin/store-helper/pass-auth.sh "$0" "$@" + else + xhost + + pkexec "$0" "$@" + exit + fi fi - - -trap "rm -f /tmp/spark-store/upgradeStatus.txt" EXIT +HERE=$(dirname $0) +trap "rm -f /tmp/spark-store/upgradeStatus.txt" EXIT source /opt/durapps/spark-store/bin/bashimport/transhell.amber load_transhell_debug @@ -20,57 +20,58 @@ function get_name_from_desktop_file() { local name_i18n local package_name package_name=$1 - for desktop_file_path in $(dpkg -L "$package_name" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}'); do -if [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "true" ] || [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "True" ];then - continue - else - name_orig=$(grep -m 1 '^Name=' "$desktop_file_path" | cut -d '=' -f 2) - name_i18n=$(grep -m 1 "^Name\[${LANGUAGE}\]\=" "$desktop_file_path" | cut -d '=' -f 2) - if [ -z "$name_i18n" ] ;then - app_name_in_desktop=$name_orig + for desktop_file_path in $(dpkg -L "$package_name" |grep /usr/share/applications/ | awk '/\.desktop$/ {print}') ; do + if [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "true" ] || [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "True" ] ; then + continue else - app_name_in_desktop=$name_i18n + name_orig=$(awk -F= '/^\[Desktop Entry\]$/ {found=1} found && /^Name=/ {print $2; exit} /^\[.*\]$/ && !/\[Desktop Entry\]/ {exit}' "$desktop_file_path") + name_i18n=$(awk -v lang="Name[$LANGUAGE]" -F= '/^\[Desktop Entry\]$/ {found=1} found && /^Name\[/ && $1 == lang {print $2; exit} /^\[.*\]$/ && !/\[Desktop Entry\]/ {exit}' "$desktop_file_path") + if [ -z "$name_i18n" ] ; then + app_name_in_desktop=$name_orig + else + app_name_in_desktop=$name_i18n + fi fi - - fi done - for desktop_file_path in $(dpkg -L "$package_name" |grep /opt/apps/$package_name/entries/applications | awk '/\.desktop$/ {print}'); do - if [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "true" ] || [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "True" ];then - continue - else - name_orig=$(grep -m 1 '^Name=' "$desktop_file_path" | cut -d '=' -f 2) - name_i18n=$(grep -m 1 "^Name\[${LANGUAGE}\]\=" "$desktop_file_path" | cut -d '=' -f 2) - if [ -z "$name_i18n" ] ;then - app_name_in_desktop=$name_orig - else - app_name_in_desktop=$name_i18n - fi - - fi - done -if [ -z "$app_name_in_desktop" ] ;then -app_name_in_desktop=${package_name} -fi -echo ${app_name_in_desktop} + for desktop_file_path in $(dpkg -L "$package_name" |grep /opt/apps/$package_name/entries/applications | awk '/\.desktop$/ {print}') ; do + if [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "true" ] || [ "$(grep -m 1 '^NoDisplay=' "$desktop_file_path" | cut -d '=' -f 2)" = "True" ] ; then + continue + else + name_orig=$(awk -F= '/^\[Desktop Entry\]$/ {found=1} found && /^Name=/ {print $2; exit} /^\[.*\]$/ && !/\[Desktop Entry\]/ {exit}' "$desktop_file_path") + name_i18n=$(awk -v lang="Name[$LANGUAGE]" -F= '/^\[Desktop Entry\]$/ {found=1} found && /^Name\[/ && $1 == lang {print $2; exit} /^\[.*\]$/ && !/\[Desktop Entry\]/ {exit}' "$desktop_file_path") + if [ -z "$name_i18n" ] ; then + app_name_in_desktop=$name_orig + else + app_name_in_desktop=$name_i18n + fi + fi + done + + if [ -z "$app_name_in_desktop" ] ; then + app_name_in_desktop=${package_name} + fi + + echo ${app_name_in_desktop} } + touch /tmp/spark-store/upgradeStatus.txt # 执行 apt update -pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh ssupdate 2>&1 > /dev/null | zenity --progress --auto-close --pulsate --no-cancel --text="${TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg +pkexec ${HERE}/ss-do-upgrade-worker.sh ssupdate 2>&1 > /dev/null | zenity --progress --auto-close --pulsate --no-cancel --text="${TRANSHELL_CONTENT_UPDATE_CHEKING_PLEASE_WAIT}" --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg if [ -z `cat /tmp/spark-store-app-ssupdate-status.txt` ] ; then - /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log + ${HERE}/ss-do-upgrade-worker.sh clean-log else zenity --error --text "${TRANSHELL_CONTENT_CHECK_UPDATE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --text-info --filename=/tmp/spark-store-app-ssupdate-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg - /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh clean-log + ${HERE}/ss-do-upgrade-worker.sh clean-log rm -f /tmp/spark-store/upgradeStatus.txt exit fi # 获取可更新应用列表 -PKG_LIST="$(/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgradable-list)" +PKG_LIST="$(${HERE}/ss-do-upgrade-worker.sh upgradable-list)" ## 如果没更新,就弹出不需要更新 if [ -z "$PKG_LIST" ] ; then zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg @@ -112,44 +113,60 @@ done) ## 如果没有应用需要更新,则直接退出 if [ -z "$PKG_UPGRADE_LIST" ] ; then - zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg - else - PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="${TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE}" --column="${TRANSHELL_CONTENT_CHOOSE}" --column="${TRANSHELL_CONTENT_APP_NAME}" --column="${TRANSHELL_CONTENT_NEW_VERSION}" --column="${TRANSHELL_CONTENT_UPGRADE_FROM}" --column="${TRANSHELL_CONTENT_PKG_NAME}" --separator=" " --checklist --multiple --print-column=5 --height 350 --width 650 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg) + zenity --info --text "${TRANSHELL_CONTENT_NO_NEED_TO_UPGRADE}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 + exit 0 + fi + + + while true;do + PKG_UPGRADE_LIST=$(echo "$PKG_UPGRADE_LIST" | zenity --list --text="${TRANSHELL_CONTENT_CHOOSE_APP_TO_UPGRADE}" --column="${TRANSHELL_CONTENT_CHOOSE}" --column="${TRANSHELL_CONTENT_APP_NAME}" --column="${TRANSHELL_CONTENT_NEW_VERSION}" --column="${TRANSHELL_CONTENT_UPGRADE_FROM}" --column="${TRANSHELL_CONTENT_PKG_NAME}" --separator=" " --checklist --multiple --print-column=5 --height 350 --width 650 ) ## 如果没有选择,则直接退出 if [ -z "$PKG_UPGRADE_LIST" ] ; then - zenity --info --text "${TRANSHELL_CONTENT_NO_APP_IS_CHOSEN}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg - else + zenity --info --text "${TRANSHELL_CONTENT_NO_APP_IS_CHOSEN}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 + exit 0 + fi + if [[ "$PKG_UPGRADE_LIST" == *"(null)"* ]]; then + zenity --error --text "${TRANSHELL_CONTENT_LIST_NOT_LOADED_PLEASE_WAIT}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 + else + break + fi +done ### 更新用户选择的应用 +# for PKG_UPGRADE in $PKG_UPGRADE_LIST;do +# APP_UPGRADE="$(get_name_from_desktop_file $PKG_UPGRADE)" +# update_transhell +( +total=$(echo "$PKG_UPGRADE_LIST" | wc -w) +count=0 -(for PKG_UPGRADE in $PKG_UPGRADE_LIST; do +for PKG_UPGRADE in $PKG_UPGRADE_LIST; do + count=$((count + 1)) APP_UPGRADE="$(get_name_from_desktop_file $PKG_UPGRADE)" update_transhell # 启动升级任务 - (pkexec /opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE -y 2>&1 > /dev/null ) & - cmd_pid=$! + (yes | pkexec ${HERE}/ss-do-upgrade-worker.sh upgrade-app $PKG_UPGRADE -y 2>&1 > /dev/null ) & + + # 计算进度百分比 + progress=$(( count * 100 / total - 1)) + # 动态修改zenity的文本 echo "# ${TRANSHELL_CONTENT_UPGRADING_PLEASE_WAIT}" + echo "$progress" wait -done) | zenity --progress --auto-close --no-cancel --pulsate --text="Preparing..." --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg - - - - +done +) | zenity --progress --auto-close --no-cancel --text="Preparing..." --height 70 --width 400 --title="${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg #### 更新成功 if [ -z "`cat /tmp/spark-store-app-upgrade-status.txt`" ] ; then zenity --info --text "${TRANSHELL_CONTENT_CHOSEN_APP_UPGRADE_FINISHED}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 150 --width 300 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg - else - #### 更新异常 + else #### 更新异常 zenity --error --text "${TRANSHELL_CONTENT_APP_UGRADE_PROCESS_ERROR_PRESS_CONFIRM_TO_CHECK}" --title "${TRANSHELL_CONTENT_SPARK_STORE_UPGRADE_MODEL}" --height 200 --width 350 --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg zenity --text-info --filename=/tmp/spark-store-app-upgrade-log.txt --checkbox="${TRANSHELL_CONTENT_I_ALREDY_COPIED_THE_LOG_HERE_AND_WILL_USE_IT_TO_FEEDBACK}" --title="${TRANSHELL_CONTENT_FEEDBACK_CAN_BE_FOUND_IN_THE_SETTINGS}" --window-icon=/usr/share/icons/hicolor/scalable/apps/spark-store.svg fi - fi - fi fi -rm -f /tmp/spark-store/upgradeStatus.txt +rm -f /tmp/spark-store/upgradeStatus.txt # 从最开头 diff --git a/translations/spark-store_en.ts b/translations/spark-store_en.ts index 85a0c7a..82075d7 100644 --- a/translations/spark-store_en.ts +++ b/translations/spark-store_en.ts @@ -126,10 +126,10 @@ - - - - + + + + Download and Install @@ -186,69 +186,76 @@ - - - + + + Reinstall - + + + + Launch + + + + Upgrade - - + + Install - + Installing - - - - + + + + Warning - + The current application does not support or tested on deepin, there may be problems - + The current application does not support or tested on UOS, there may be problems - + The current application does not support or tested on Ubuntu, there may be problems - + The current application does not support or tested on current platform, there may be problems - - + + Spark Store - + Uninstall succeeded - + The URL has been copied to the clipboard diff --git a/translations/spark-store_es.ts b/translations/spark-store_es.ts index ddebf5d..ea5688a 100644 --- a/translations/spark-store_es.ts +++ b/translations/spark-store_es.ts @@ -126,10 +126,10 @@ - - - - + + + + Download and Install Descargar e instalar @@ -186,69 +186,76 @@ Se ha desactivado el modo desarrollador - - - + + + Reinstall Reinstalación - + + + + Launch + + + + Upgrade Actualización - - + + Install Instalación - + Installing Se está instalando - - - - + + + + Warning Aviso - + The current application does not support or tested on deepin, there may be problems - + The current application does not support or tested on UOS, there may be problems - + The current application does not support or tested on Ubuntu, there may be problems - + The current application does not support or tested on current platform, there may be problems - - + + Spark Store SPARK Store - + Uninstall succeeded Desinstalación exitosa - + The URL has been copied to the clipboard La URL ha sido copiada al portapapeles diff --git a/translations/spark-store_fr.ts b/translations/spark-store_fr.ts index 1118bc7..f5b6d83 100644 --- a/translations/spark-store_fr.ts +++ b/translations/spark-store_fr.ts @@ -126,10 +126,10 @@ - - - - + + + + Download and Install Télécharger et installer @@ -186,69 +186,76 @@ Mode développeur désactivé - - - + + + Reinstall Réinstaller - + + + + Launch + + + + Upgrade Mise à niveau - - + + Install Installation - + Installing Installation en cours - - - - + + + + Warning Avertissement - + The current application does not support or tested on deepin, there may be problems - + The current application does not support or tested on UOS, there may be problems - + The current application does not support or tested on Ubuntu, there may be problems - + The current application does not support or tested on current platform, there may be problems - - + + Spark Store Le Spark store - + Uninstall succeeded Désinstallation réussie - + The URL has been copied to the clipboard L'URL a été copiée dans le presse - papiers diff --git a/translations/spark-store_zh_CN.ts b/translations/spark-store_zh_CN.ts index a63709a..bf7b0be 100644 --- a/translations/spark-store_zh_CN.ts +++ b/translations/spark-store_zh_CN.ts @@ -121,10 +121,10 @@ - - - - + + + + Download and Install 下载并安装 @@ -186,69 +186,76 @@ 开发者模式未开启 - - - + + + Reinstall 重新安装 - + + + + Launch + 启动应用 + + + Upgrade 升级 - - + + Install 安装 - + Installing 正在安装 - - - - + + + + Warning 警告 - + The current application does not support or tested on deepin, there may be problems 当前应用不支持或未在deepin上测试过,安装后可能会出现问题 - + The current application does not support or tested on UOS, there may be problems 当前应用不支持或未在UOS上测试过,安装后可能会出现问题 - + The current application does not support or tested on Ubuntu, there may be problems 当前应用不支持或未在Ubuntu上测试过,安装后可能会出现问题 - + The current application does not support or tested on current platform, there may be problems 当前应用不支持或未在您的平台上测试过,安装后可能会出现问题 - - + + Spark Store 星火应用商店 - + Uninstall succeeded 卸载成功 - + The URL has been copied to the clipboard 链接已复制到剪贴板 diff --git a/translations/spark-store_zh_TW.ts b/translations/spark-store_zh_TW.ts index 8a1d890..1490517 100644 --- a/translations/spark-store_zh_TW.ts +++ b/translations/spark-store_zh_TW.ts @@ -121,10 +121,10 @@ - - - - + + + + Download and Install 下載並安裝 @@ -186,69 +186,76 @@ 开发者模式未开启 - - - + + + Reinstall 重新安裝 - + + + + Launch + + + + Upgrade 升级 - - + + Install 安装 - + Installing 正在安装 - - - - + + + + Warning - + The current application does not support or tested on deepin, there may be problems - + The current application does not support or tested on UOS, there may be problems - + The current application does not support or tested on Ubuntu, there may be problems - + The current application does not support or tested on current platform, there may be problems - - + + Spark Store 星火应用商店 - + Uninstall succeeded 卸载成功 - + The URL has been copied to the clipboard 链接已复制到剪贴板