-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathupdate.sh
More file actions
executable file
·208 lines (182 loc) · 6.1 KB
/
Copy pathupdate.sh
File metadata and controls
executable file
·208 lines (182 loc) · 6.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
#!/bin/bash
# AI Admin System - 用户更新脚本 v2.0
# 用于已安装用户更新到最新版本
set -e
# 获取脚本所在目录(如果在 dev-tools 中运行,需要调整路径)
if [ -f "dev-tools/lib/common.sh" ]; then
LIB_DIR="dev-tools/lib"
elif [ -f "lib/common.sh" ]; then
LIB_DIR="lib"
else
# 回退到基本功能
LIB_DIR=""
fi
# 如果找到函数库,加载它
if [ -n "$LIB_DIR" ] && [ -f "$LIB_DIR/common.sh" ]; then
source "$LIB_DIR/common.sh"
source "$LIB_DIR/version.sh"
source "$LIB_DIR/git-utils.sh"
HAS_LIB=true
else
# 基本的颜色定义(回退方案)
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m'
HAS_LIB=false
log_info() { echo -e "${BLUE}ℹ${NC} $1"; }
log_success() { echo -e "${GREEN}✓${NC} $1"; }
log_warning() { echo -e "${YELLOW}⚠${NC} $1"; }
log_error() { echo -e "${RED}✗${NC} $1" >&2; }
print_separator() { echo -e "${BLUE}========================================${NC}"; }
print_title() { print_separator; echo -e "${BLUE} $1${NC}"; print_separator; echo ""; }
fi
# 显示帮助信息
show_help() {
cat << EOF
用法: $0 [选项]
选项:
-h, --help 显示此帮助信息
-f, --force 强制更新(丢弃本地更改)
--no-backup 不备份本地更改
示例:
$0 # 正常更新
$0 --force # 强制更新(危险)
EOF
}
# 解析命令行参数
FORCE_UPDATE=false
NO_BACKUP=false
while [[ $# -gt 0 ]]; do
case $1 in
-h|--help)
show_help
exit 0
;;
-f|--force)
FORCE_UPDATE=true
shift
;;
--no-backup)
NO_BACKUP=true
shift
;;
*)
log_error "未知选项: $1"
show_help
exit 1
;;
esac
done
# 主函数
main() {
print_title "AI Admin System - 更新工具"
# 检查是否在 Git 仓库中
if [ ! -d .git ]; then
log_error "当前目录不是 Git 仓库"
log_info "请在 AI-Admin-System 目录下运行此脚本"
exit 1
fi
# 获取当前版本
CURRENT_VERSION=$(cat VERSION 2>/dev/null || echo "未知")
log_info "当前版本: ${GREEN}v${CURRENT_VERSION}${NC}"
echo ""
# 检查是否有未提交的更改
if [[ -n $(git status -s) ]]; then
log_warning "检测到未提交的更改:"
git status -s
echo ""
if [ "$FORCE_UPDATE" = true ]; then
log_warning "强制更新模式:将丢弃所有本地更改"
read -p "确认继续? [y/N]: " confirm
if [[ ! $confirm =~ ^[Yy]$ ]]; then
log_info "已取消"
exit 0
fi
git reset --hard HEAD
log_success "已丢弃本地更改"
elif [ "$NO_BACKUP" = true ]; then
log_error "存在未提交的更改,且禁用了备份"
log_info "请先提交更改或使用 --force 强制更新"
exit 1
else
# 使用 git stash 备份
read -p "是否暂存当前更改? [Y/n]: " backup
if [[ ! $backup =~ ^[Nn]$ ]]; then
STASH_MESSAGE="更新前的自动备份 - $(date '+%Y-%m-%d %H:%M:%S')"
git stash push -m "$STASH_MESSAGE"
log_success "已暂存更改: $STASH_MESSAGE"
STASHED=true
else
log_error "存在未提交的更改"
log_info "请先提交更改或使用 --force 强制更新"
exit 1
fi
fi
fi
# 获取远程信息
REMOTE=$(git remote 2>/dev/null | head -1 || echo "origin")
BRANCH=$(git branch --show-current 2>/dev/null || echo "main")
# 确保 push 已禁用(用户端只能拉取,不能推送到上游仓库)
PUSH_URL=$(git remote get-url --push "$REMOTE" 2>/dev/null || echo "")
if [[ "$PUSH_URL" != "PUSH_DISABLED_USE_UPDATE_SH_INSTEAD" ]]; then
git remote set-url --push "$REMOTE" PUSH_DISABLED_USE_UPDATE_SH_INSTEAD
fi
# 拉取最新代码
log_info "正在从 $REMOTE/$BRANCH 拉取最新版本..."
echo ""
if git fetch "$REMOTE" && git pull "$REMOTE" "$BRANCH"; then
log_success "拉取成功"
else
log_error "拉取失败"
# 如果有暂存的更改,尝试恢复
if [ "$STASHED" = true ]; then
log_info "正在恢复暂存的更改..."
if git stash pop; then
log_success "已恢复暂存的更改"
else
log_warning "恢复暂存的更改时出现冲突"
log_info "请手动解决冲突后运行: git stash drop"
fi
fi
exit 1
fi
# 获取新版本
NEW_VERSION=$(cat VERSION 2>/dev/null || echo "未知")
# 如果有暂存的更改,询问是否恢复
if [ "$STASHED" = true ]; then
echo ""
read -p "是否恢复暂存的更改? [Y/n]: " restore
if [[ ! $restore =~ ^[Nn]$ ]]; then
if git stash pop; then
log_success "已恢复暂存的更改"
else
log_warning "恢复暂存的更改时出现冲突"
log_info "请手动解决冲突"
fi
else
log_info "暂存的更改已保留,可以稍后恢复: git stash pop"
fi
fi
# 显示完成信息
echo ""
print_separator
echo -e " ${GREEN}更新完成!${NC}"
print_separator
echo -e " 旧版本: ${YELLOW}v${CURRENT_VERSION}${NC}"
echo -e " 新版本: ${GREEN}v${NEW_VERSION}${NC}"
print_separator
echo ""
# 显示最新的更新日志 (截取 CHANGELOG 中最新的一个块)
if [ -f "CHANGELOG.md" ]; then
echo -e "${CYAN}📜 最新更新内容 (v${NEW_VERSION}):${NC}"
# 打印匹配 ## [ 版本 的下一个直到下一个 ## 之间的内容
awk '/^## \[/{if (p) exit; p=1; print; next} p' CHANGELOG.md
else
log_info "查看更新日志: cat CHANGELOG.md"
fi
echo ""
}
# 运行主函数
main