1
0
mirror of https://github.com/tw93/Mole.git synced 2026-02-04 17:24:45 +00:00

Solve the problem of update update exit stuck

This commit is contained in:
Tw93
2025-11-27 07:51:23 +09:00
parent 0bf13ab9b7
commit 36341369b6
3 changed files with 50 additions and 24 deletions

View File

@@ -37,7 +37,7 @@ is_cache_valid() {
return 1
fi
local cache_age=$(($(date +%s) - $(stat -f%m "$cache_file" 2> /dev/null || echo 0)))
local cache_age=$(($(date +%s) - $(get_file_mtime "$cache_file")))
[[ $cache_age -lt $ttl ]]
}

View File

@@ -670,12 +670,14 @@ update_via_homebrew() {
# Set up cleanup trap to kill background process on interruption
local brew_pid=""
local brew_tmp_file=""
local brew_exit_file=""
cleanup_brew_update() {
if [[ -n "$brew_pid" ]] && kill -0 "$brew_pid" 2>/dev/null; then
kill -TERM "$brew_pid" 2>/dev/null || true
wait "$brew_pid" 2>/dev/null || true
fi
[[ -n "$brew_tmp_file" ]] && rm -f "$brew_tmp_file"
[[ -n "$brew_exit_file" ]] && rm -f "$brew_exit_file"
[[ -t 1 ]] && stop_inline_spinner
}
trap cleanup_brew_update INT TERM
@@ -683,7 +685,7 @@ update_via_homebrew() {
if [[ -t 1 ]]; then
start_inline_spinner "Updating Homebrew..."
else
echo "Updating Homebrew..."
echo "Updating Homebrew..." >&2
fi
# Run brew update with timeout to prevent hanging
@@ -691,7 +693,10 @@ update_via_homebrew() {
local brew_update_timeout="${MO_BREW_UPDATE_TIMEOUT:-300}"
brew_tmp_file=$(mktemp -t mole-brew-update 2> /dev/null || echo "/tmp/mole-brew-update.$$")
(brew update > "$brew_tmp_file" 2>&1) &
# Redirect brew output to temp file to avoid interfering with spinner
# Store exit code in a separate file to avoid wait issues with zsh
brew_exit_file="${brew_tmp_file}.exit"
(brew update > "$brew_tmp_file" 2>&1 </dev/null; echo $? > "$brew_exit_file") &
brew_pid=$!
local elapsed=0
@@ -699,9 +704,9 @@ update_via_homebrew() {
while kill -0 $brew_pid 2> /dev/null; do
if [[ $elapsed -ge $brew_update_timeout ]]; then
kill -TERM $brew_pid 2> /dev/null || true
wait $brew_pid 2> /dev/null || true
sleep 0.5
if [[ -t 1 ]]; then stop_inline_spinner; fi
rm -f "$brew_tmp_file"
rm -f "$brew_tmp_file" "$brew_exit_file"
trap - INT TERM
log_error "Homebrew update timed out (${brew_update_timeout}s)"
return 1
@@ -710,26 +715,45 @@ update_via_homebrew() {
((elapsed++))
done
# Give the subshell a moment to write exit code
sleep 0.1
trap - INT TERM
# Get brew update exit code, but don't fail immediately
# brew update can fail for network reasons but we can still check current version
wait $brew_pid 2> /dev/null
local brew_exit=$?
# Get brew update exit code from file instead of wait
local brew_exit=0
if [[ -f "$brew_exit_file" ]]; then
brew_exit=$(cat "$brew_exit_file" 2>/dev/null || echo "0")
fi
rm -f "$brew_exit_file"
if [[ -t 1 ]]; then
stop_inline_spinner
fi
# Check if update failed with a real error (not just "already up-to-date")
if [[ $brew_exit -ne 0 ]]; then
local update_output=""
[[ -f "$brew_tmp_file" ]] && update_output=$(cat "$brew_tmp_file" 2>/dev/null)
local brew_update_success=true
local update_output=""
# Only warn if it's a real error, not just "already up-to-date"
if [[ -n "$update_output" ]] && ! echo "$update_output" | grep -qi "up-to-date"; then
echo -e "${YELLOW}${ICON_WARNING}${NC} Homebrew update skipped (check network)"
fi
if [[ -f "$brew_tmp_file" ]]; then
update_output=$(cat "$brew_tmp_file" 2>/dev/null)
fi
# Check for errors in output (brew update may return 0 even on failure)
if [[ -n "$update_output" ]] && echo "$update_output" | grep -qiE "(^Error:|fatal:)"; then
brew_update_success=false
fi
if [[ $brew_exit -ne 0 ]]; then
brew_update_success=false
fi
# Show appropriate message
if [[ "$brew_update_success" == "false" ]]; then
echo -e "${YELLOW}${ICON_WARNING}${NC} Homebrew update skipped (check network or proxy)" >&2
else
# Only show success if there were no errors
echo -e "${GREEN}${ICON_SUCCESS}${NC} Homebrew formulae updated" >&2
fi
rm -f "$brew_tmp_file"
@@ -737,7 +761,7 @@ update_via_homebrew() {
if [[ -t 1 ]]; then
start_inline_spinner "Upgrading Mole..."
else
echo "Upgrading Mole..."
echo "Upgrading Mole..." >&2
fi
local upgrade_output
upgrade_output=$(brew upgrade mole 2>&1) || true
@@ -749,18 +773,18 @@ update_via_homebrew() {
# Get current version
local current_version
current_version=$(brew list --versions mole 2> /dev/null | awk '{print $2}')
echo -e "${GREEN}${ICON_SUCCESS}${NC} Already on latest version (${current_version:-$version})"
echo -e "${GREEN}${ICON_SUCCESS}${NC} Already on latest version (${current_version:-$version})" >&2
elif echo "$upgrade_output" | grep -q "Error:"; then
log_error "Homebrew upgrade failed"
echo "$upgrade_output" | grep "Error:" >&2
return 1
else
# Show relevant output, filter noise
echo "$upgrade_output" | grep -Ev "^(==>|Updating Homebrew|Warning:)" || true
echo "$upgrade_output" | grep -Ev "^(==>|Updating Homebrew|Warning:)" >&2 || true
# Get new version
local new_version
new_version=$(brew list --versions mole 2> /dev/null | awk '{print $2}')
echo -e "${GREEN}${ICON_SUCCESS}${NC} Updated to latest version (${new_version:-$version})"
echo -e "${GREEN}${ICON_SUCCESS}${NC} Updated to latest version (${new_version:-$version})" >&2
fi
# Clear version check cache
@@ -797,7 +821,8 @@ start_inline_spinner() {
local i=0
while true; do
local c="${chars:$((i % ${#chars})):1}"
printf "\r${MOLE_SPINNER_PREFIX:-}${BLUE}%s${NC} %s" "$c" "$message" 2> /dev/null || exit 0
# Output to stderr to avoid interfering with stdout
printf "\r${MOLE_SPINNER_PREFIX:-}${BLUE}%s${NC} %s" "$c" "$message" >&2 || exit 0
((i++))
# macOS supports decimal sleep, this is the primary target
sleep 0.1 2> /dev/null || sleep 1 2> /dev/null || exit 0
@@ -806,7 +831,7 @@ start_inline_spinner() {
INLINE_SPINNER_PID=$!
disown 2> /dev/null || true
else
echo -n " ${BLUE}|${NC} $message"
echo -n " ${BLUE}|${NC} $message" >&2
fi
}
@@ -816,7 +841,8 @@ stop_inline_spinner() {
kill "$INLINE_SPINNER_PID" 2> /dev/null || true
wait "$INLINE_SPINNER_PID" 2> /dev/null || true
INLINE_SPINNER_PID=""
[[ -t 1 ]] && printf "\r\033[K"
# Clear the line - use \033[2K to clear entire line, not just to end
[[ -t 1 ]] && printf "\r\033[2K" >&2
fi
}