-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathrelease.sh
More file actions
191 lines (164 loc) · 5.67 KB
/
release.sh
File metadata and controls
191 lines (164 loc) · 5.67 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
#!/usr/bin/env bash
cd "$(dirname "$0")"
set -e
THIS_DIR=$(realpath .)
# 简要说明:
# 1) 默认先执行 update-libs.sh -f 强制下载最新包并更新本地文件(可用 -s 跳过)。
# 2) 检查 git 工作目录是否干净,若有未提交的修改则报错退出。
# 3) 从 version.txt 读取版本号并创建发布目录 `ege-<version>`。
# 4) 将要发布的目录与文件复制到发布目录(.vscode,demo,include,man,lib 等)。
# 5) 优先使用 7z/7za 打包成 .7z;若不可用且存在 PowerShell 则退回到 ZIP(使用 Compress-Archive)。
# 6) 最终会在仓库根生成 ege-<version>.7z 或 ege-<version>.zip。
# 解析参数
SKIP_UPDATE=0
while [[ $# -gt 0 ]]; do
case "$1" in
-s | --skip-update)
SKIP_UPDATE=1
shift
;;
*)
echo "Warning: ignoring unknown argument: $1"
shift
;;
esac
done
# Step 1: 执行 update-libs.sh -f 强制下载最新包(除非指定 -s 跳过)
if [[ $SKIP_UPDATE -eq 1 ]]; then
echo "=== Skipping update-libs.sh (--skip-update) ==="
else
echo "=== Running update-libs.sh -f to fetch latest release ==="
if [[ -x "$THIS_DIR/update-libs.sh" ]]; then
"$THIS_DIR/update-libs.sh" -f
else
echo "Error: update-libs.sh not found or not executable."
exit 1
fi
fi
# Step 2: 检查 git 工作目录是否干净
echo ""
echo "=== Checking git working directory ==="
if ! command -v git >/dev/null 2>&1; then
echo "Warning: git not found, skipping working directory check."
elif [[ -n $(git status --porcelain) ]]; then
echo "Error: Git working directory is not clean. Please commit or stash your changes before releasing."
git status --short
exit 1
else
echo "Git working directory is clean."
fi
# Step 3: 从 version.txt 读取版本号
VERSION_FILE="$THIS_DIR/version.txt"
if [[ ! -f "$VERSION_FILE" ]]; then
echo "Error: version.txt not found. Please run update-libs.sh first."
exit 1
fi
## 从 version.txt 读取并去除所有空白字符(包括空格、制表符、换行)
EGE_VERSION=$(tr -d '[:space:]' <"$VERSION_FILE")
if [[ -z "$EGE_VERSION" ]]; then
echo "Error: version.txt is empty."
exit 1
fi
echo "EGE Version: $EGE_VERSION"
# 创建发布目录
RELEASE_DIR_NAME="ege-${EGE_VERSION}"
RELEASE_DIR="$THIS_DIR/$RELEASE_DIR_NAME"
RELEASE_ARCHIVE="$THIS_DIR/${RELEASE_DIR_NAME}.7z"
# 清理旧的发布目录和压缩包
rm -rf "$RELEASE_DIR"
rm -f "$RELEASE_ARCHIVE"
mkdir -p "$RELEASE_DIR"
echo "Creating release directory: $RELEASE_DIR"
# 复制目录
declare -a DIRS_TO_COPY=(
.vscode
demo
include
man
lib
)
for dir in "${DIRS_TO_COPY[@]}"; do
if [[ -d "$THIS_DIR/$dir" ]]; then
echo "Copying directory: $dir"
cp -r "$THIS_DIR/$dir" "$RELEASE_DIR/$dir"
else
echo "Warning: Directory '$dir' not found, skipping."
fi
done
# 复制文件
declare -a FILES_TO_COPY=(
egelogo.jpg
CMakeLists.txt
)
for file in "${FILES_TO_COPY[@]}"; do
if [[ -f "$THIS_DIR/$file" ]]; then
echo "Copying file: $file"
cp "$THIS_DIR/$file" "$RELEASE_DIR/$file"
else
echo "Warning: File '$file' not found, skipping."
fi
done
# 复制 README.md 为 说明.txt
if [[ -f "$THIS_DIR/README.md" ]]; then
echo "Copying README.md as 说明.txt"
cp "$THIS_DIR/README.md" "$RELEASE_DIR/说明.txt"
else
echo "Warning: README.md not found, skipping."
fi
# 复制 doc 目录下的文件到根目录,后缀改为 .txt
if [[ -d "$THIS_DIR/doc" ]]; then
echo "Copying doc files to release root (with .txt extension)..."
for doc_file in "$THIS_DIR/doc"/*; do
if [[ -f "$doc_file" ]]; then
# 获取文件名(不含路径)
base_name=$(basename "$doc_file")
# 去掉原有后缀,加上 .txt
name_without_ext="${base_name%.*}"
new_name="${name_without_ext}.txt"
echo " $base_name -> $new_name"
cp "$doc_file" "$RELEASE_DIR/$new_name"
fi
done
else
echo "Warning: doc directory not found, skipping."
fi
# 打包(优先 7z/7za;如果没有,尝试使用 PowerShell 生成 ZIP)
echo ""
RELEASE_ARCHIVE_7Z="$THIS_DIR/${RELEASE_DIR_NAME}.7z"
RELEASE_ARCHIVE_ZIP="$THIS_DIR/${RELEASE_DIR_NAME}.zip"
# 使用 7z/7za 创建压缩包的函数
create_archives_with_7z() {
local cmd="$1"
echo "Using $cmd to create archives..."
echo "Creating 7z archive: $RELEASE_ARCHIVE_7Z"
"$cmd" a -t7z -mx=9 "$RELEASE_ARCHIVE_7Z" "$RELEASE_DIR"
echo "Creating zip archive: $RELEASE_ARCHIVE_ZIP"
"$cmd" a -tzip -mx=9 "$RELEASE_ARCHIVE_ZIP" "$RELEASE_DIR"
}
if command -v 7z >/dev/null 2>&1; then
create_archives_with_7z 7z
elif command -v 7za >/dev/null 2>&1; then
create_archives_with_7z 7za
else
# fallback: try powershell
if command -v powershell >/dev/null 2>&1; then
# 只能生成 zip
echo "7z not found — using PowerShell to create ZIP: $RELEASE_ARCHIVE_ZIP"
powershell -NoProfile -Command "Set-Location -LiteralPath '$THIS_DIR'; if (Test-Path -Path '$RELEASE_ARCHIVE_ZIP') { Remove-Item -Force -Path '$RELEASE_ARCHIVE_ZIP' } ; Compress-Archive -LiteralPath '$RELEASE_DIR_NAME' -DestinationPath '$RELEASE_ARCHIVE_ZIP' -Force"
else
echo "Error: Neither 7z/7za nor PowerShell is available to create archive."
exit 1
fi
fi
# 保留发布目录方便检查, 发布目录已被忽略
echo ""
echo "=== Release completed ==="
# 显示生成的压缩包
if [[ -f "$RELEASE_ARCHIVE_7Z" ]]; then
echo "7z Archive: $RELEASE_ARCHIVE_7Z"
ls -lh "$RELEASE_ARCHIVE_7Z"
fi
if [[ -f "$RELEASE_ARCHIVE_ZIP" ]]; then
echo "ZIP Archive: $RELEASE_ARCHIVE_ZIP"
ls -lh "$RELEASE_ARCHIVE_ZIP"
fi