Clean up download progress monitor

This commit is contained in:
Storm Dragon
2026-04-21 19:25:35 -04:00
parent c6a182a47a
commit b7473e99fe

View File

@@ -115,7 +115,8 @@ monitor_download_progress() {
local doneFile="$3"
local currentBytes=0
local percent=0
local lastAnnouncedPercent=-10
local lastAnnouncedPercent=0
local lastAnnouncedBytes=0
local tickCount=0
while [[ ! -e "$doneFile" ]]; do
@@ -130,16 +131,17 @@ monitor_download_progress() {
if [[ "$percent" -gt 100 ]]; then
percent=100
fi
if [[ "$percent" -ge $((lastAnnouncedPercent + 10)) ]]; then
if [[ "$percent" -gt 0 && "$percent" -ge $((lastAnnouncedPercent + 10)) ]]; then
printf 'Downloaded %s%% (%s/%s bytes)\n' "$percent" "$currentBytes" "$totalBytes" >&2
beep_download_progress "$percent"
lastAnnouncedPercent="$percent"
fi
else
tickCount="$((tickCount + 1))"
if [[ "$tickCount" -ge 5 ]]; then
if [[ "$currentBytes" -gt "$lastAnnouncedBytes" && "$tickCount" -ge 5 ]]; then
printf 'Downloaded %s bytes\n' "$currentBytes" >&2
beep_download_progress 50
lastAnnouncedBytes="$currentBytes"
tickCount=0
fi
fi
@@ -147,11 +149,29 @@ monitor_download_progress() {
done
}
stop_download_processes() {
local doneFile="$1"
local monitorPid="$2"
local downloadPid="${3:-}"
touch "$doneFile" 2> /dev/null || true
if [[ -n "$downloadPid" ]] && kill -0 "$downloadPid" 2> /dev/null; then
kill "$downloadPid" 2> /dev/null || true
wait "$downloadPid" 2> /dev/null || true
fi
if [[ -n "$monitorPid" ]] && kill -0 "$monitorPid" 2> /dev/null; then
kill "$monitorPid" 2> /dev/null || true
wait "$monitorPid" 2> /dev/null || true
fi
rm -f "$doneFile"
}
run_download_command() {
local outputPath="$1"
local totalBytes="$2"
local errorFile="$3"
local doneFile
local downloadPid=""
local monitorPid
local commandStatus=0
shift 3
@@ -160,13 +180,18 @@ run_download_command() {
rm -f "$doneFile"
monitor_download_progress "$outputPath" "$totalBytes" "$doneFile" &
monitorPid="$!"
trap 'stop_download_processes "$doneFile" "$monitorPid" "$downloadPid"; trap - INT TERM HUP; exit 130' INT TERM HUP
"$@" 2> >(tee -a "$errorFile" >&2)
commandStatus="$?"
"$@" 2> >(tee -a "$errorFile" >&2) &
downloadPid="$!"
if wait "$downloadPid"; then
commandStatus=0
else
commandStatus="$?"
fi
touch "$doneFile"
wait "$monitorPid" 2> /dev/null || true
rm -f "$doneFile"
stop_download_processes "$doneFile" "$monitorPid"
trap - INT TERM HUP
return "$commandStatus"
}