fix(update): recover from incomplete git clean

This commit is contained in:
云服务部-叶林立
2026-08-28 15:08:42 +08:00
parent f3a2abe1e4
commit 29ea39f9b1
4 changed files with 228 additions and 5 deletions
+64 -3
View File
@@ -59,6 +59,49 @@ select_updated_bundle_config() {
fi
}
recover_incomplete_bundle_update() {
recovery_applicable=0
case $PACKAGE_SOURCE in
git:git@bitbucket.org:siakitem/my-pi.git) ;;
*) return 1 ;;
esac
agent_dir=${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}
recovery_target=$agent_dir/git/bitbucket.org/siakitem/my-pi
recovery_marker=$agent_dir/git/bitbucket.org/siakitem/.my-pi.pi-update-incomplete
if [ ! -f "$recovery_marker" ] || [ -L "$recovery_marker" ]; then
return 1
fi
if ! command -v git >/dev/null 2>&1 || [ ! -d "$recovery_target/.git" ]; then
warn "检测到 Pi Git 升级中断标记,但无法验证已安装 checkout,已跳过自动恢复。"
return 1
fi
recovery_target=$(CDPATH=; cd "$recovery_target" 2>/dev/null && pwd -P) || return 1
recovery_top=$(git -C "$recovery_target" rev-parse --show-toplevel 2>/dev/null) || return 1
recovery_top=$(CDPATH=; cd "$recovery_top" 2>/dev/null && pwd -P) || return 1
recovery_origin=$(git -C "$recovery_target" remote get-url origin 2>/dev/null) || return 1
if [ "$recovery_top" != "$recovery_target" ] || \
[ "$recovery_origin" != "git@bitbucket.org:siakitem/my-pi.git" ]; then
warn "检测到 Pi Git 升级中断标记,但 checkout 身份校验失败,拒绝自动清理。"
return 1
fi
recovery_applicable=1
say "检测到默认组合包的 Pi Git 升级中断,正在有限重试依赖清理。"
recovery_attempt=1
while [ "$recovery_attempt" -le 4 ]; do
if git -C "$recovery_target" clean -fdx; then
say "✓ Pi Git 缓存清理在第 ${recovery_attempt} 次尝试后完成。"
return 0
fi
warn "Pi Git 缓存第 ${recovery_attempt} 次清理未完成。"
recovery_attempt=$((recovery_attempt + 1))
done
warn "Pi Git 缓存清理在 4 次尝试后仍未完成;将交由最后一次 pi update 恢复依赖并报告结果。"
return 1
}
migrate_tool_search_settings() {
settings_file=${PI_CODING_AGENT_DIR:-$HOME/.pi/agent}/settings.json
if [ ! -e "$settings_file" ]; then
@@ -430,9 +473,27 @@ if ! command -v pi >/dev/null 2>&1; then
fi
say "正在升级 Pi 组合包:$PACKAGE_SOURCE"
if ! pi update "$PACKAGE_SOURCE"; then
warn "pi update 执行失败,已停止后续升级。"
exit 1
if pi update "$PACKAGE_SOURCE"; then
:
else
recovery_applicable=0
recovery_cleaned=0
if recover_incomplete_bundle_update; then
recovery_cleaned=1
fi
if [ "$recovery_applicable" -ne 1 ]; then
warn "pi update 执行失败,已停止后续升级。"
exit 1
fi
if [ "$recovery_cleaned" -eq 1 ]; then
say "正在重试 Pi 组合包升级,由 Pi 完成依赖安装并清除中断标记。"
else
warn "正在执行最后一次 pi update,以恢复可能被部分清理的依赖。"
fi
if ! pi update "$PACKAGE_SOURCE"; then
warn "pi update 自动恢复后仍然失败,已停止后续升级。"
exit 1
fi
fi
select_updated_bundle_config || exit 1
migrate_tool_search_settings || record_update_failure "Tool Search 用户配置"