175 lines
5.0 KiB
Bash
Executable File
175 lines
5.0 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Jackery HACS 发布准备脚本
|
||
# 此脚本帮助你准备发布到 HACS 并支持自动创建 GitHub Release
|
||
|
||
set -e
|
||
|
||
# 配置路径
|
||
COMPONENT_PATH="custom_components/jackery"
|
||
MANIFEST_FILE="$COMPONENT_PATH/manifest.json"
|
||
|
||
echo "🚀 准备发布 Jackery 到 HACS"
|
||
echo ""
|
||
|
||
# 检查是否在正确的目录
|
||
if [ ! -f "hacs.json" ]; then
|
||
echo "❌ 错误:未找到 hacs.json 文件"
|
||
echo "请确保在项目根目录运行此脚本"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查 manifest 文件是否存在
|
||
if [ ! -f "$MANIFEST_FILE" ]; then
|
||
echo "❌ 错误:未找到 $MANIFEST_FILE"
|
||
echo "请确认文件路径是否正确"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查是否有未提交的更改
|
||
if ! git diff-index --quiet HEAD --; then
|
||
echo "⚠️ 检测到未提交的更改"
|
||
echo ""
|
||
git status --short
|
||
echo ""
|
||
read -p "是否要提交这些更改?(y/n) " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
read -p "请输入提交信息: " commit_msg
|
||
git add .
|
||
git commit -m "$commit_msg"
|
||
echo "✅ 更改已提交"
|
||
else
|
||
echo "❌ 请先提交或暂存你的更改"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# 获取当前版本
|
||
if [ -f "$MANIFEST_FILE" ]; then
|
||
CURRENT_VERSION=$(python3 -c "import json; print(json.load(open('$MANIFEST_FILE'))['version'])")
|
||
else
|
||
echo "❌ 无法读取文件: $MANIFEST_FILE"
|
||
exit 1
|
||
fi
|
||
|
||
echo "📦 当前版本: $CURRENT_VERSION"
|
||
echo ""
|
||
|
||
# 询问新版本
|
||
read -p "请输入新版本号 (当前: $CURRENT_VERSION): " NEW_VERSION
|
||
|
||
if [ -z "$NEW_VERSION" ]; then
|
||
NEW_VERSION=$CURRENT_VERSION
|
||
echo "使用当前版本: $NEW_VERSION"
|
||
fi
|
||
|
||
# 更新 manifest.json 中的版本号
|
||
if [ "$NEW_VERSION" != "$CURRENT_VERSION" ]; then
|
||
echo "📝 更新 manifest.json 中的版本号..."
|
||
# 使用正则匹配替换,更稳健
|
||
sed -i.bak "s/\"version\": \".*\"/\"version\": \"$NEW_VERSION\"/" "$MANIFEST_FILE"
|
||
rm "$MANIFEST_FILE.bak"
|
||
|
||
git add "$MANIFEST_FILE"
|
||
|
||
# 仅在有变更时提交
|
||
if ! git diff-index --quiet HEAD --; then
|
||
git commit -m "版本更新至 v$NEW_VERSION"
|
||
echo "✅ 版本号已更新"
|
||
else
|
||
echo "⚠️ 版本号未发生实际变化或无法提交"
|
||
fi
|
||
fi
|
||
|
||
# 推送到 GitHub
|
||
echo ""
|
||
echo "📤 推送到 GitHub..."
|
||
git push origin main
|
||
|
||
# 处理 Tag
|
||
TAG_NAME="v$NEW_VERSION"
|
||
|
||
# 检查本地 tag 是否存在
|
||
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
|
||
echo "⚠️ Tag $TAG_NAME 本地已存在"
|
||
read -p "是否删除旧 Tag 并重新创建? (y/n) " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
git tag -d "$TAG_NAME"
|
||
# 尝试删除远程 tag (如果存在)
|
||
git push origin :refs/tags/"$TAG_NAME" 2>/dev/null || true
|
||
echo "🗑️ 旧 Tag 已清除"
|
||
else
|
||
echo "❌ 停止发布:Tag 已存在且未选择覆盖"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
echo "🏷️ 创建 Git tag: $TAG_NAME"
|
||
git tag -a "$TAG_NAME" -m "Release $TAG_NAME"
|
||
git push origin "$TAG_NAME"
|
||
|
||
echo ""
|
||
echo "✅ 代码和 Tag 推送完成!"
|
||
echo ""
|
||
|
||
# GitHub Release 自动化
|
||
RELEASE_CREATED=false
|
||
|
||
if command -v gh &> /dev/null; then
|
||
echo "🤖 检测到 GitHub CLI (gh)"
|
||
read -p "是否使用 gh 立即创建 GitHub Release? (y/n) " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
|
||
RELEASE_TITLE="$TAG_NAME"
|
||
read -p "请输入 Release 标题 (默认: $TAG_NAME): " input_title
|
||
if [ -n "$input_title" ]; then
|
||
RELEASE_TITLE="$input_title"
|
||
fi
|
||
|
||
echo "您可以选择 Release Notes 来源:"
|
||
echo "1) 自动生成 (gh --generate-notes)"
|
||
echo "2) 使用简单的 'Release v...'"
|
||
echo "3) 取消自动发布"
|
||
read -p "请选择 (1/2/3, 默认 1): " note_choice
|
||
note_choice=${note_choice:-1}
|
||
|
||
case $note_choice in
|
||
1)
|
||
echo "⏳ 正在创建 Release (自动生成日志)..."
|
||
if gh release create "$TAG_NAME" --title "$RELEASE_TITLE" --generate-notes; then
|
||
RELEASE_CREATED=true
|
||
fi
|
||
;;
|
||
2)
|
||
echo "⏳ 正在创建 Release..."
|
||
if gh release create "$TAG_NAME" --title "$RELEASE_TITLE" --notes "Release $TAG_NAME"; then
|
||
RELEASE_CREATED=true
|
||
fi
|
||
;;
|
||
*)
|
||
echo "已取消 gh 发布。"
|
||
;;
|
||
esac
|
||
|
||
if [ "$RELEASE_CREATED" = true ]; then
|
||
echo "🎉 GitHub Release 创建成功!"
|
||
# 尝试获取 release url
|
||
gh release view "$TAG_NAME" --json url --template '{{.url}}' || echo ""
|
||
echo ""
|
||
fi
|
||
fi
|
||
fi
|
||
|
||
if [ "$RELEASE_CREATED" = false ]; then
|
||
echo "📋 下一步操作 (手动发布):"
|
||
echo "1. 访问 GitHub 创建 Release:"
|
||
echo " https://github.com/ht-it-lab/jackery/releases/new?tag=$TAG_NAME"
|
||
echo ""
|
||
echo "2. 如果尚未安装,推荐安装 GitHub CLI (gh) 以便下次自动发布。"
|
||
fi
|
||
|
||
echo "✅ 流程结束" |