🎨 代码格式化
Hello from ImmortalWrt / say-hello (push) Successful in 0s
Details
Hello from ImmortalWrt / say-hello (push) Successful in 0s
Details
:fix: 修复识别`CHANGELOG`标题问题
This commit is contained in:
parent
84e2751668
commit
ec5785cc6a
|
|
@ -80,11 +80,11 @@ env:
|
||||||
# 需要忽略的提交模式(支持正则表达式)
|
# 需要忽略的提交模式(支持正则表达式)
|
||||||
# 这些提交不会被添加到 CHANGELOG 中
|
# 这些提交不会被添加到 CHANGELOG 中
|
||||||
# 使用 | 分隔多个模式
|
# 使用 | 分隔多个模式
|
||||||
#
|
#
|
||||||
# ⚠️ 重要说明:
|
# ⚠️ 重要说明:
|
||||||
# - 使用 ^ 表示行首匹配,$ 表示行尾匹配
|
# - 使用 ^ 表示行首匹配,$ 表示行尾匹配
|
||||||
# - [skip ci] 和 [ci skip] 仅匹配行尾,避免误过滤其他提交
|
# - [skip ci] 和 [ci skip] 仅匹配行尾,避免误过滤其他提交
|
||||||
# - 如果要完全匹配某个字符串,使用 ^...$
|
# - 如果要完全匹配某个字符串,使用 ^...$
|
||||||
IGNORE_PATTERNS: >-
|
IGNORE_PATTERNS: >-
|
||||||
^Merge |
|
^Merge |
|
||||||
^:memo: Auto update CHANGELOG|
|
^:memo: Auto update CHANGELOG|
|
||||||
|
|
@ -226,21 +226,21 @@ jobs:
|
||||||
# 检查仓库状态
|
# 检查仓库状态
|
||||||
if [ -d "$REPO_DIR" ]; then
|
if [ -d "$REPO_DIR" ]; then
|
||||||
echo "📂 目录已存在,检查 Git 仓库状态..."
|
echo "📂 目录已存在,检查 Git 仓库状态..."
|
||||||
|
|
||||||
if [ -d "$REPO_DIR/.git" ]; then
|
if [ -d "$REPO_DIR/.git" ]; then
|
||||||
# 目录存在且是有效的 Git 仓库
|
# 目录存在且是有效的 Git 仓库
|
||||||
echo "✓ 发现有效的 Git 仓库,执行增量更新..."
|
echo "✓ 发现有效的 Git 仓库,执行增量更新..."
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
|
|
||||||
# 清理工作区
|
# 清理工作区
|
||||||
git clean -fdx
|
git clean -fdx
|
||||||
git reset --hard
|
git reset --hard
|
||||||
|
|
||||||
# 获取最新代码和标签,同时清理远程已删除的 tag
|
# 获取最新代码和标签,同时清理远程已删除的 tag
|
||||||
echo "📥 拉取最新代码和标签..."
|
echo "📥 拉取最新代码和标签..."
|
||||||
git fetch --all --tags --force --prune --prune-tags
|
git fetch --all --tags --force --prune --prune-tags
|
||||||
echo "✓ 已同步远程状态(包括已删除的 tag)"
|
echo "✓ 已同步远程状态(包括已删除的 tag)"
|
||||||
|
|
||||||
echo "✓ 仓库已更新"
|
echo "✓ 仓库已更新"
|
||||||
else
|
else
|
||||||
# 目录存在但不是 Git 仓库(可能之前运行失败)
|
# 目录存在但不是 Git 仓库(可能之前运行失败)
|
||||||
|
|
@ -248,20 +248,20 @@ jobs:
|
||||||
echo "🧹 清理损坏的目录..."
|
echo "🧹 清理损坏的目录..."
|
||||||
rm -rf "$REPO_DIR"
|
rm -rf "$REPO_DIR"
|
||||||
echo "✓ 已清理"
|
echo "✓ 已清理"
|
||||||
|
|
||||||
# 重新克隆
|
# 重新克隆
|
||||||
echo "📥 克隆仓库..."
|
echo "📥 克隆仓库..."
|
||||||
mkdir -p "${{ env.WORKSPACE_DIR }}"
|
mkdir -p "${{ env.WORKSPACE_DIR }}"
|
||||||
|
|
||||||
git clone \
|
git clone \
|
||||||
https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \
|
https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \
|
||||||
"$REPO_DIR"
|
"$REPO_DIR"
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "❌ 克隆失败"
|
echo "❌ 克隆失败"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
echo "✓ 仓库已克隆"
|
echo "✓ 仓库已克隆"
|
||||||
fi
|
fi
|
||||||
|
|
@ -269,11 +269,11 @@ jobs:
|
||||||
# 目录不存在,首次克隆
|
# 目录不存在,首次克隆
|
||||||
echo "📥 克隆仓库(首次)..."
|
echo "📥 克隆仓库(首次)..."
|
||||||
mkdir -p "${{ env.WORKSPACE_DIR }}"
|
mkdir -p "${{ env.WORKSPACE_DIR }}"
|
||||||
|
|
||||||
git clone \
|
git clone \
|
||||||
https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \
|
https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \
|
||||||
"$REPO_DIR"
|
"$REPO_DIR"
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
echo "✓ 仓库已克隆"
|
echo "✓ 仓库已克隆"
|
||||||
|
|
@ -362,7 +362,7 @@ jobs:
|
||||||
else
|
else
|
||||||
CHANGELOG_VERSION="${{ env.CHANGELOG_VERSION }}"
|
CHANGELOG_VERSION="${{ env.CHANGELOG_VERSION }}"
|
||||||
echo "📝 检查版本: $CHANGELOG_VERSION"
|
echo "📝 检查版本: $CHANGELOG_VERSION"
|
||||||
|
|
||||||
if grep -q "## :bookmark: $CHANGELOG_VERSION" CHANGELOG.md; then
|
if grep -q "## :bookmark: $CHANGELOG_VERSION" CHANGELOG.md; then
|
||||||
echo "⚠️ 版本 $CHANGELOG_VERSION 已存在于 CHANGELOG.md"
|
echo "⚠️ 版本 $CHANGELOG_VERSION 已存在于 CHANGELOG.md"
|
||||||
echo "version_exists=true" >> $GITHUB_OUTPUT
|
echo "version_exists=true" >> $GITHUB_OUTPUT
|
||||||
|
|
@ -395,23 +395,23 @@ jobs:
|
||||||
# 查找前一个 tag
|
# 查找前一个 tag
|
||||||
# 排除所有属于当前 CHANGELOG 版本的 tag(例如 0.0.2-rc1, 0.0.2-rc2 都属于 0.0.2)
|
# 排除所有属于当前 CHANGELOG 版本的 tag(例如 0.0.2-rc1, 0.0.2-rc2 都属于 0.0.2)
|
||||||
echo "🔍 查找前一个版本的 tag..."
|
echo "🔍 查找前一个版本的 tag..."
|
||||||
|
|
||||||
# 获取所有 tag
|
# 获取所有 tag
|
||||||
ALL_TAGS=$(git tag --sort=-version:refname)
|
ALL_TAGS=$(git tag --sort=-version:refname)
|
||||||
|
|
||||||
# 遍历查找第一个不属于当前 CHANGELOG 版本的 tag
|
# 遍历查找第一个不属于当前 CHANGELOG 版本的 tag
|
||||||
PREVIOUS_TAG=""
|
PREVIOUS_TAG=""
|
||||||
while IFS= read -r tag; do
|
while IFS= read -r tag; do
|
||||||
# 跳过空行
|
# 跳过空行
|
||||||
[ -z "$tag" ] && continue
|
[ -z "$tag" ] && continue
|
||||||
|
|
||||||
# 对每个 tag 执行 strip 操作(去除 pre-release 后缀)
|
# 对每个 tag 执行 strip 操作(去除 pre-release 后缀)
|
||||||
if [[ "${{ env.CHANGELOG_VERSION_MODE }}" == "strip" ]]; then
|
if [[ "${{ env.CHANGELOG_VERSION_MODE }}" == "strip" ]]; then
|
||||||
tag_stripped=$(echo "$tag" | sed -E 's/-(alpha|beta|rc|pre|preview|dev|test)[0-9]*$//')
|
tag_stripped=$(echo "$tag" | sed -E 's/-(alpha|beta|rc|pre|preview|dev|test)[0-9]*$//')
|
||||||
else
|
else
|
||||||
tag_stripped="$tag"
|
tag_stripped="$tag"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 如果这个 tag 的 CHANGELOG 版本不等于当前版本,就是我们要找的
|
# 如果这个 tag 的 CHANGELOG 版本不等于当前版本,就是我们要找的
|
||||||
if [ "$tag_stripped" != "$CHANGELOG_VERSION" ]; then
|
if [ "$tag_stripped" != "$CHANGELOG_VERSION" ]; then
|
||||||
PREVIOUS_TAG="$tag"
|
PREVIOUS_TAG="$tag"
|
||||||
|
|
@ -424,13 +424,13 @@ jobs:
|
||||||
COMMIT_RANGE=""
|
COMMIT_RANGE=""
|
||||||
else
|
else
|
||||||
echo "📍 Previous tag: $PREVIOUS_TAG"
|
echo "📍 Previous tag: $PREVIOUS_TAG"
|
||||||
|
|
||||||
# 对 previous tag 也执行 strip,显示对应的 CHANGELOG 版本
|
# 对 previous tag 也执行 strip,显示对应的 CHANGELOG 版本
|
||||||
if [[ "${{ env.CHANGELOG_VERSION_MODE }}" == "strip" ]]; then
|
if [[ "${{ env.CHANGELOG_VERSION_MODE }}" == "strip" ]]; then
|
||||||
PREV_CHANGELOG_VERSION=$(echo "$PREVIOUS_TAG" | sed -E 's/-(alpha|beta|rc|pre|preview|dev|test)[0-9]*$//')
|
PREV_CHANGELOG_VERSION=$(echo "$PREVIOUS_TAG" | sed -E 's/-(alpha|beta|rc|pre|preview|dev|test)[0-9]*$//')
|
||||||
echo " (对应 CHANGELOG 版本: $PREV_CHANGELOG_VERSION)"
|
echo " (对应 CHANGELOG 版本: $PREV_CHANGELOG_VERSION)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
COMMIT_RANGE="${PREVIOUS_TAG}..${VERSION}"
|
COMMIT_RANGE="${PREVIOUS_TAG}..${VERSION}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -477,9 +477,9 @@ jobs:
|
||||||
line = line.strip()
|
line = line.strip()
|
||||||
if not line or '|' not in line:
|
if not line or '|' not in line:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
commit_hash, message = line.split('|', 1)
|
commit_hash, message = line.split('|', 1)
|
||||||
|
|
||||||
# 检查是否应该忽略
|
# 检查是否应该忽略
|
||||||
should_ignore = False
|
should_ignore = False
|
||||||
matched_pattern = None
|
matched_pattern = None
|
||||||
|
|
@ -488,7 +488,7 @@ jobs:
|
||||||
should_ignore = True
|
should_ignore = True
|
||||||
matched_pattern = pattern
|
matched_pattern = pattern
|
||||||
break
|
break
|
||||||
|
|
||||||
if should_ignore:
|
if should_ignore:
|
||||||
skipped_commits.append((message, matched_pattern))
|
skipped_commits.append((message, matched_pattern))
|
||||||
else:
|
else:
|
||||||
|
|
@ -549,11 +549,11 @@ jobs:
|
||||||
# 找到版本区块,在其中追加新的提交
|
# 找到版本区块,在其中追加新的提交
|
||||||
pattern = rf'(## :bookmark: {re.escape(changelog_version)}.*?\n{re.escape(section_title)}\n\n)(.*?)(\n---|\n## :bookmark: |\Z)'
|
pattern = rf'(## :bookmark: {re.escape(changelog_version)}.*?\n{re.escape(section_title)}\n\n)(.*?)(\n---|\n## :bookmark: |\Z)'
|
||||||
match = re.search(pattern, existing_content, re.DOTALL)
|
match = re.search(pattern, existing_content, re.DOTALL)
|
||||||
|
|
||||||
if match:
|
if match:
|
||||||
existing_commits = match.group(2).strip()
|
existing_commits = match.group(2).strip()
|
||||||
new_commits = changelog_content.split(f"{section_title}\n\n")[1].split("\n---")[0].strip()
|
new_commits = changelog_content.split(f"{section_title}\n\n")[1].split("\n---")[0].strip()
|
||||||
|
|
||||||
# 合并提交,去重
|
# 合并提交,去重
|
||||||
all_commits_text = existing_commits + "\n" + new_commits
|
all_commits_text = existing_commits + "\n" + new_commits
|
||||||
# 简单去重(基于完整行)
|
# 简单去重(基于完整行)
|
||||||
|
|
@ -563,36 +563,64 @@ jobs:
|
||||||
if line.strip() and line not in seen:
|
if line.strip() and line not in seen:
|
||||||
unique_lines.append(line)
|
unique_lines.append(line)
|
||||||
seen.add(line)
|
seen.add(line)
|
||||||
|
|
||||||
merged_commits = '\n'.join(unique_lines)
|
merged_commits = '\n'.join(unique_lines)
|
||||||
|
|
||||||
# 重新组装版本区块
|
# 重新组装版本区块
|
||||||
updated_section = match.group(1) + merged_commits + "\n\n---\n"
|
updated_section = match.group(1) + merged_commits + "\n\n---\n"
|
||||||
new_content = existing_content[:match.start()] + updated_section + existing_content[match.end():]
|
new_content = existing_content[:match.start()] + updated_section + existing_content[match.end():]
|
||||||
else:
|
else:
|
||||||
print("⚠️ Could not find version section, prepending new content")
|
print("⚠️ Could not find version section, prepending new content")
|
||||||
new_content = existing_content.replace(
|
# 尝试匹配各种可能的 CHANGELOG 标题格式
|
||||||
"# :memo: CHANGELOG\n\n",
|
header_pattern = r'^#\s*(?::[\w_]+:)?\s*CHANGELOG\s*\n'
|
||||||
f"# :memo: CHANGELOG\n\n{changelog_content}"
|
match = re.search(header_pattern, existing_content, re.IGNORECASE | re.MULTILINE)
|
||||||
)
|
|
||||||
|
if match:
|
||||||
|
insert_pos = match.end()
|
||||||
|
if not existing_content[insert_pos:insert_pos+1] == '\n':
|
||||||
|
new_content = existing_content[:insert_pos] + '\n' + changelog_content + existing_content[insert_pos:]
|
||||||
|
else:
|
||||||
|
new_content = existing_content[:insert_pos] + '\n' + changelog_content + existing_content[insert_pos+1:]
|
||||||
|
else:
|
||||||
|
# 没有找到标题,在开头插入
|
||||||
|
new_content = f"# :memo: CHANGELOG\n\n{changelog_content}{existing_content}"
|
||||||
else:
|
else:
|
||||||
# 插入新版本
|
# 插入新版本
|
||||||
new_content = existing_content.replace(
|
# 尝试匹配各种可能的 CHANGELOG 标题格式
|
||||||
"# :memo: CHANGELOG\n\n",
|
# 支持: # CHANGELOG, # :memo: CHANGELOG, # Changelog 等
|
||||||
f"# :memo: CHANGELOG\n\n{changelog_content}"
|
|
||||||
)
|
# 尝试找到 CHANGELOG 标题(不区分大小写,可选 emoji)
|
||||||
|
header_pattern = r'^#\s*(?::[\w_]+:)?\s*CHANGELOG\s*\n'
|
||||||
|
match = re.search(header_pattern, existing_content, re.IGNORECASE | re.MULTILINE)
|
||||||
|
|
||||||
|
if match:
|
||||||
|
# 找到了 CHANGELOG 标题,在其后插入
|
||||||
|
insert_pos = match.end()
|
||||||
|
# 确保标题后有空行
|
||||||
|
if not existing_content[insert_pos:insert_pos+1] == '\n':
|
||||||
|
new_content = existing_content[:insert_pos] + '\n' + changelog_content + existing_content[insert_pos:]
|
||||||
|
else:
|
||||||
|
new_content = existing_content[:insert_pos] + '\n' + changelog_content + existing_content[insert_pos+1:]
|
||||||
|
else:
|
||||||
|
# 没有找到 CHANGELOG 标题,在文件开头插入标题和内容
|
||||||
|
if existing_content.strip():
|
||||||
|
# 文件有内容但没有 CHANGELOG 标题
|
||||||
|
new_content = f"# :memo: CHANGELOG\n\n{changelog_content}{existing_content}"
|
||||||
|
else:
|
||||||
|
# 文件为空
|
||||||
|
new_content = f"# :memo: CHANGELOG\n\n{changelog_content}"
|
||||||
|
|
||||||
# 检查内容是否真的改变
|
# 检查内容是否真的改变
|
||||||
content_changed = (new_content != existing_content)
|
content_changed = (new_content != existing_content)
|
||||||
version_exists = f"## :bookmark: {changelog_version}" in existing_content
|
version_exists = f"## :bookmark: {changelog_version}" in existing_content
|
||||||
|
|
||||||
if content_changed:
|
if content_changed:
|
||||||
with open(changelog_file, 'w', encoding='utf-8') as f:
|
with open(changelog_file, 'w', encoding='utf-8') as f:
|
||||||
f.write(new_content)
|
f.write(new_content)
|
||||||
|
|
||||||
print(f"✅ CHANGELOG updated successfully")
|
print(f"✅ CHANGELOG updated successfully")
|
||||||
print(f" Added {len(commits)} commits to version {changelog_version}")
|
print(f" Added {len(commits)} commits to version {changelog_version}")
|
||||||
|
|
||||||
with open('/tmp/changelog_updated.txt', 'w') as f:
|
with open('/tmp/changelog_updated.txt', 'w') as f:
|
||||||
f.write('true')
|
f.write('true')
|
||||||
with open('/tmp/content_changed.txt', 'w') as f:
|
with open('/tmp/content_changed.txt', 'w') as f:
|
||||||
|
|
@ -605,7 +633,7 @@ jobs:
|
||||||
print(f" Version {changelog_version} already contains all {len(commits)} commits")
|
print(f" Version {changelog_version} already contains all {len(commits)} commits")
|
||||||
print(f" This usually happens when recreating a deleted tag")
|
print(f" This usually happens when recreating a deleted tag")
|
||||||
print(f" Will still create Release from existing CHANGELOG content")
|
print(f" Will still create Release from existing CHANGELOG content")
|
||||||
|
|
||||||
with open('/tmp/changelog_updated.txt', 'w') as f:
|
with open('/tmp/changelog_updated.txt', 'w') as f:
|
||||||
f.write('true') # 返回 true 以触发 Release 创建
|
f.write('true') # 返回 true 以触发 Release 创建
|
||||||
with open('/tmp/content_changed.txt', 'w') as f:
|
with open('/tmp/content_changed.txt', 'w') as f:
|
||||||
|
|
@ -613,7 +641,7 @@ jobs:
|
||||||
else:
|
else:
|
||||||
# 既没有新内容,版本也不存在(不应该发生)
|
# 既没有新内容,版本也不存在(不应该发生)
|
||||||
print(f"⚠️ Unexpected state: no content change and version doesn't exist")
|
print(f"⚠️ Unexpected state: no content change and version doesn't exist")
|
||||||
|
|
||||||
with open('/tmp/changelog_updated.txt', 'w') as f:
|
with open('/tmp/changelog_updated.txt', 'w') as f:
|
||||||
f.write('false')
|
f.write('false')
|
||||||
with open('/tmp/content_changed.txt', 'w') as f:
|
with open('/tmp/content_changed.txt', 'w') as f:
|
||||||
|
|
@ -622,7 +650,7 @@ jobs:
|
||||||
|
|
||||||
UPDATED=$(cat /tmp/changelog_updated.txt)
|
UPDATED=$(cat /tmp/changelog_updated.txt)
|
||||||
CONTENT_CHANGED=$(cat /tmp/content_changed.txt 2>/dev/null || echo "false")
|
CONTENT_CHANGED=$(cat /tmp/content_changed.txt 2>/dev/null || echo "false")
|
||||||
|
|
||||||
echo "changelog_updated=$UPDATED" >> $GITHUB_OUTPUT
|
echo "changelog_updated=$UPDATED" >> $GITHUB_OUTPUT
|
||||||
echo "content_changed=$CONTENT_CHANGED" >> $GITHUB_OUTPUT
|
echo "content_changed=$CONTENT_CHANGED" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
|
@ -660,10 +688,10 @@ jobs:
|
||||||
else
|
else
|
||||||
echo "📝 提交 CHANGELOG 更新..."
|
echo "📝 提交 CHANGELOG 更新..."
|
||||||
git commit -m "${{ env.COMMIT_MSG }}"
|
git commit -m "${{ env.COMMIT_MSG }}"
|
||||||
|
|
||||||
echo "📤 推送到远程 ${{ env.MAIN_BRANCH }} 分支..."
|
echo "📤 推送到远程 ${{ env.MAIN_BRANCH }} 分支..."
|
||||||
git push https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git ${{ env.MAIN_BRANCH }}
|
git push https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git ${{ env.MAIN_BRANCH }}
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
echo "✅ 推送成功"
|
echo "✅ 推送成功"
|
||||||
else
|
else
|
||||||
|
|
@ -944,7 +972,7 @@ jobs:
|
||||||
- ℹ️ CHANGELOG.md 无需更新(内容已存在)
|
- ℹ️ CHANGELOG.md 无需更新(内容已存在)
|
||||||
- ✅ Release 已创建
|
- ✅ Release 已创建
|
||||||
- ✅ CHANGELOG.md 已作为附件上传
|
- ✅ CHANGELOG.md 已作为附件上传
|
||||||
|
|
||||||
💡 **说明**: 检测到这是重建已删除的 tag,CHANGELOG 中已包含所有提交内容,因此直接从现有内容创建 Release。
|
💡 **说明**: 检测到这是重建已删除的 tag,CHANGELOG 中已包含所有提交内容,因此直接从现有内容创建 Release。
|
||||||
EOFREBUILD
|
EOFREBUILD
|
||||||
fi
|
fi
|
||||||
|
|
@ -963,7 +991,7 @@ jobs:
|
||||||
可能的原因:
|
可能的原因:
|
||||||
- 在标签之间未找到有效的提交记录
|
- 在标签之间未找到有效的提交记录
|
||||||
- 或者版本 \`${{ env.CHANGELOG_VERSION }}\` 已包含所有相关提交(常见于重新创建已删除的 tag)
|
- 或者版本 \`${{ env.CHANGELOG_VERSION }}\` 已包含所有相关提交(常见于重新创建已删除的 tag)
|
||||||
|
|
||||||
💡 如果你删除了 tag 后重新创建,CHANGELOG 中的内容已经存在,无需重复添加。
|
💡 如果你删除了 tag 后重新创建,CHANGELOG 中的内容已经存在,无需重复添加。
|
||||||
EOFNOCOMMIT
|
EOFNOCOMMIT
|
||||||
fi
|
fi
|
||||||
|
|
@ -1017,7 +1045,7 @@ jobs:
|
||||||
echo " - Release 标题: ${{ env.RELEASE_TITLE_PROCESSED }}"
|
echo " - Release 标题: ${{ env.RELEASE_TITLE_PROCESSED }}"
|
||||||
echo " - Pre-release: ${{ env.RELEASE_IS_PRERELEASE }}"
|
echo " - Pre-release: ${{ env.RELEASE_IS_PRERELEASE }}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
if [ "${{ steps.changelog.outputs.content_changed }}" = "true" ]; then
|
if [ "${{ steps.changelog.outputs.content_changed }}" = "true" ]; then
|
||||||
echo "✅ 已完成的操作:"
|
echo "✅ 已完成的操作:"
|
||||||
echo " - CHANGELOG.md 已更新并推送到 ${{ env.MAIN_BRANCH }} 分支"
|
echo " - CHANGELOG.md 已更新并推送到 ${{ env.MAIN_BRANCH }} 分支"
|
||||||
|
|
@ -1054,4 +1082,4 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "🧹 清理临时文件..."
|
echo "🧹 清理临时文件..."
|
||||||
rm -rf /tmp/commits.txt /tmp/changelog_updated.txt /tmp/content_changed.txt /tmp/release-body.txt /tmp/payload.json /tmp/release_response.json /tmp/upload_response_*.json
|
rm -rf /tmp/commits.txt /tmp/changelog_updated.txt /tmp/content_changed.txt /tmp/release-body.txt /tmp/payload.json /tmp/release_response.json /tmp/upload_response_*.json
|
||||||
echo "✅ 清理完成"
|
echo "✅ 清理完成"
|
||||||
|
|
|
||||||
|
|
@ -142,7 +142,7 @@ jobs:
|
||||||
if [ ${#MISSING_TOOLS[@]} -gt 0 ]; then
|
if [ ${#MISSING_TOOLS[@]} -gt 0 ]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo "📦 安装缺失的工具: ${MISSING_TOOLS[*]}"
|
echo "📦 安装缺失的工具: ${MISSING_TOOLS[*]}"
|
||||||
|
|
||||||
# 🔧 智能判断是否需要 sudo
|
# 🔧 智能判断是否需要 sudo
|
||||||
# Docker 环境通常以 root 运行,不需要 sudo
|
# Docker 环境通常以 root 运行,不需要 sudo
|
||||||
if [ "$EUID" -eq 0 ] || [ "$(id -u)" -eq 0 ]; then
|
if [ "$EUID" -eq 0 ] || [ "$(id -u)" -eq 0 ]; then
|
||||||
|
|
@ -166,7 +166,7 @@ jobs:
|
||||||
echo " RUN apt-get update && apt-get install -y bc jq"
|
echo " RUN apt-get update && apt-get install -y bc jq"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "installed=true" >> $GITHUB_OUTPUT
|
echo "installed=true" >> $GITHUB_OUTPUT
|
||||||
echo "✅ 工具安装完成"
|
echo "✅ 工具安装完成"
|
||||||
else
|
else
|
||||||
|
|
@ -196,20 +196,20 @@ jobs:
|
||||||
# 检查仓库状态
|
# 检查仓库状态
|
||||||
if [ -d "$REPO_DIR" ]; then
|
if [ -d "$REPO_DIR" ]; then
|
||||||
echo "📂 目录已存在,检查 Git 仓库状态..."
|
echo "📂 目录已存在,检查 Git 仓库状态..."
|
||||||
|
|
||||||
if [ -d "$REPO_DIR/.git" ]; then
|
if [ -d "$REPO_DIR/.git" ]; then
|
||||||
# 目录存在且是有效的 Git 仓库
|
# 目录存在且是有效的 Git 仓库
|
||||||
echo "✓ 发现有效的 Git 仓库,执行增量更新..."
|
echo "✓ 发现有效的 Git 仓库,执行增量更新..."
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
|
|
||||||
# 清理工作区
|
# 清理工作区
|
||||||
git clean -fdx
|
git clean -fdx
|
||||||
git reset --hard
|
git reset --hard
|
||||||
|
|
||||||
# 获取最新代码
|
# 获取最新代码
|
||||||
echo "📥 拉取最新代码..."
|
echo "📥 拉取最新代码..."
|
||||||
git fetch --all --tags --force
|
git fetch --all --tags --force
|
||||||
|
|
||||||
echo "✓ 仓库已更新"
|
echo "✓ 仓库已更新"
|
||||||
else
|
else
|
||||||
# 目录存在但不是 Git 仓库(可能之前运行失败)
|
# 目录存在但不是 Git 仓库(可能之前运行失败)
|
||||||
|
|
@ -217,20 +217,20 @@ jobs:
|
||||||
echo "🧹 清理损坏的目录..."
|
echo "🧹 清理损坏的目录..."
|
||||||
rm -rf "$REPO_DIR"
|
rm -rf "$REPO_DIR"
|
||||||
echo "✓ 已清理"
|
echo "✓ 已清理"
|
||||||
|
|
||||||
# 重新克隆
|
# 重新克隆
|
||||||
echo "📥 克隆仓库..."
|
echo "📥 克隆仓库..."
|
||||||
mkdir -p "${{ env.WORKSPACE_DIR }}"
|
mkdir -p "${{ env.WORKSPACE_DIR }}"
|
||||||
|
|
||||||
git clone \
|
git clone \
|
||||||
https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \
|
https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \
|
||||||
"$REPO_DIR"
|
"$REPO_DIR"
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "❌ 克隆失败"
|
echo "❌ 克隆失败"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
echo "✓ 仓库已克隆"
|
echo "✓ 仓库已克隆"
|
||||||
fi
|
fi
|
||||||
|
|
@ -238,16 +238,16 @@ jobs:
|
||||||
# 目录不存在,首次克隆
|
# 目录不存在,首次克隆
|
||||||
echo "📥 克隆仓库(首次)..."
|
echo "📥 克隆仓库(首次)..."
|
||||||
mkdir -p "${{ env.WORKSPACE_DIR }}"
|
mkdir -p "${{ env.WORKSPACE_DIR }}"
|
||||||
|
|
||||||
git clone \
|
git clone \
|
||||||
https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \
|
https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git \
|
||||||
"$REPO_DIR"
|
"$REPO_DIR"
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo "❌ 克隆失败"
|
echo "❌ 克隆失败"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cd "$REPO_DIR"
|
cd "$REPO_DIR"
|
||||||
echo "✓ 仓库已克隆"
|
echo "✓ 仓库已克隆"
|
||||||
fi
|
fi
|
||||||
|
|
@ -294,17 +294,17 @@ jobs:
|
||||||
# 检查统计分支是否存在
|
# 检查统计分支是否存在
|
||||||
if git ls-remote --heads origin ${{ env.BADGE_BRANCH }} | grep -q ${{ env.BADGE_BRANCH }}; then
|
if git ls-remote --heads origin ${{ env.BADGE_BRANCH }} | grep -q ${{ env.BADGE_BRANCH }}; then
|
||||||
echo "✅ 统计分支 '${{ env.BADGE_BRANCH }}' 已存在"
|
echo "✅ 统计分支 '${{ env.BADGE_BRANCH }}' 已存在"
|
||||||
|
|
||||||
# 检出统计分支
|
# 检出统计分支
|
||||||
git fetch origin ${{ env.BADGE_BRANCH }}:${{ env.BADGE_BRANCH }}
|
git fetch origin ${{ env.BADGE_BRANCH }}:${{ env.BADGE_BRANCH }}
|
||||||
git checkout ${{ env.BADGE_BRANCH }}
|
git checkout ${{ env.BADGE_BRANCH }}
|
||||||
|
|
||||||
echo "📂 当前分支内容:"
|
echo "📂 当前分支内容:"
|
||||||
ls -la
|
ls -la
|
||||||
|
|
||||||
# 返回主分支
|
# 返回主分支
|
||||||
git checkout ${{ github.ref_name }}
|
git checkout ${{ github.ref_name }}
|
||||||
|
|
||||||
echo "branch_exists=true" >> $GITHUB_OUTPUT
|
echo "branch_exists=true" >> $GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
echo "🆕 统计分支 '${{ env.BADGE_BRANCH }}' 不存在,将创建"
|
echo "🆕 统计分支 '${{ env.BADGE_BRANCH }}' 不存在,将创建"
|
||||||
|
|
@ -348,7 +348,7 @@ jobs:
|
||||||
# - stats 分支是独立的数据存储分支,不需要主分支的代码文件
|
# - stats 分支是独立的数据存储分支,不需要主分支的代码文件
|
||||||
# - 只需要存储徽章 JSON 文件和统计报告
|
# - 只需要存储徽章 JSON 文件和统计报告
|
||||||
# - 保持分支干净,避免混淆
|
# - 保持分支干净,避免混淆
|
||||||
#
|
#
|
||||||
# ✅ 能否复用仓库?
|
# ✅ 能否复用仓库?
|
||||||
# - 可以!.git 目录包含所有分支的完整信息
|
# - 可以!.git 目录包含所有分支的完整信息
|
||||||
# - 切换到主分支时,主分支的文件会恢复
|
# - 切换到主分支时,主分支的文件会恢复
|
||||||
|
|
@ -381,7 +381,7 @@ jobs:
|
||||||
# 📊 代码统计徽章数据
|
# 📊 代码统计徽章数据
|
||||||
|
|
||||||
> 此分支由 GitHub Actions 自动生成和维护
|
> 此分支由 GitHub Actions 自动生成和维护
|
||||||
>
|
>
|
||||||
> ⚠️ **请勿手动修改此分支的内容!**
|
> ⚠️ **请勿手动修改此分支的内容!**
|
||||||
|
|
||||||
## 📁 目录结构
|
## 📁 目录结构
|
||||||
|
|
@ -517,12 +517,12 @@ jobs:
|
||||||
# 读取语言配置并统计
|
# 读取语言配置并统计
|
||||||
echo "${{ env.LANGUAGE_GROUPS }}" | while IFS= read -r line; do
|
echo "${{ env.LANGUAGE_GROUPS }}" | while IFS= read -r line; do
|
||||||
[ -z "$line" ] && continue
|
[ -z "$line" ] && continue
|
||||||
|
|
||||||
# 解析配置行: 组名:后缀列表:显示名称:颜色:图标
|
# 解析配置行: 组名:后缀列表:显示名称:颜色:图标
|
||||||
IFS=':' read -r lang_id extensions display_name color icon <<< "$line"
|
IFS=':' read -r lang_id extensions display_name color icon <<< "$line"
|
||||||
|
|
||||||
echo "🔍 统计 $display_name..."
|
echo "🔍 统计 $display_name..."
|
||||||
|
|
||||||
# 构建扩展名查找条件
|
# 构建扩展名查找条件
|
||||||
FIND_CONDITIONS=""
|
FIND_CONDITIONS=""
|
||||||
IFS=',' read -ra EXTS <<< "$extensions"
|
IFS=',' read -ra EXTS <<< "$extensions"
|
||||||
|
|
@ -533,21 +533,21 @@ jobs:
|
||||||
FIND_CONDITIONS="$FIND_CONDITIONS -o -name '*.$ext'"
|
FIND_CONDITIONS="$FIND_CONDITIONS -o -name '*.$ext'"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# 统计文件数
|
# 统计文件数
|
||||||
FILE_COUNT=$(eval "find . -type f \( $FIND_CONDITIONS \) $EXCLUDE_PARAMS" | wc -l)
|
FILE_COUNT=$(eval "find . -type f \( $FIND_CONDITIONS \) $EXCLUDE_PARAMS" | wc -l)
|
||||||
|
|
||||||
if [ "$FILE_COUNT" -gt 0 ]; then
|
if [ "$FILE_COUNT" -gt 0 ]; then
|
||||||
# 统计代码行数
|
# 统计代码行数
|
||||||
CODE_LINES=$(eval "find . -type f \( $FIND_CONDITIONS \) $EXCLUDE_PARAMS -exec grep -cHv '^[[:space:]]*$' {} + 2>/dev/null" | awk -F: '{sum+=$2} END {print sum+0}')
|
CODE_LINES=$(eval "find . -type f \( $FIND_CONDITIONS \) $EXCLUDE_PARAMS -exec grep -cHv '^[[:space:]]*$' {} + 2>/dev/null" | awk -F: '{sum+=$2} END {print sum+0}')
|
||||||
|
|
||||||
# 只保存超过阈值的语言
|
# 只保存超过阈值的语言
|
||||||
if [ "$CODE_LINES" -ge "${{ env.MIN_LINES_THRESHOLD }}" ]; then
|
if [ "$CODE_LINES" -ge "${{ env.MIN_LINES_THRESHOLD }}" ]; then
|
||||||
FORMATTED_LINES=$(printf "%'d" $CODE_LINES)
|
FORMATTED_LINES=$(printf "%'d" $CODE_LINES)
|
||||||
|
|
||||||
echo " - 文件数: $FILE_COUNT"
|
echo " - 文件数: $FILE_COUNT"
|
||||||
echo " - 代码行: $FORMATTED_LINES"
|
echo " - 代码行: $FORMATTED_LINES"
|
||||||
|
|
||||||
# 保存到临时文件
|
# 保存到临时文件
|
||||||
echo "$lang_id|$display_name|$CODE_LINES|$FORMATTED_LINES|$FILE_COUNT|$color|$icon" >> /tmp/lang_stats/${lang_id}.txt
|
echo "$lang_id|$display_name|$CODE_LINES|$FORMATTED_LINES|$FILE_COUNT|$color|$icon" >> /tmp/lang_stats/${lang_id}.txt
|
||||||
LANGUAGE_COUNT=$((LANGUAGE_COUNT + 1))
|
LANGUAGE_COUNT=$((LANGUAGE_COUNT + 1))
|
||||||
|
|
@ -619,12 +619,12 @@ jobs:
|
||||||
if [ -f /tmp/lang_summary.txt ] && [ -s /tmp/lang_summary.txt ]; then
|
if [ -f /tmp/lang_summary.txt ] && [ -s /tmp/lang_summary.txt ]; then
|
||||||
echo ""
|
echo ""
|
||||||
echo "🌐 生成语言徽章..."
|
echo "🌐 生成语言徽章..."
|
||||||
|
|
||||||
while IFS='|' read -r lang_id display_name code_lines formatted_lines file_count color icon; do
|
while IFS='|' read -r lang_id display_name code_lines formatted_lines file_count color icon; do
|
||||||
[ -z "$lang_id" ] && continue
|
[ -z "$lang_id" ] && continue
|
||||||
|
|
||||||
echo " - $display_name"
|
echo " - $display_name"
|
||||||
|
|
||||||
# 生成代码行数徽章(使用 heredoc)
|
# 生成代码行数徽章(使用 heredoc)
|
||||||
if [ -n "$icon" ]; then
|
if [ -n "$icon" ]; then
|
||||||
# 带图标的徽章
|
# 带图标的徽章
|
||||||
|
|
@ -651,7 +651,7 @@ jobs:
|
||||||
EOFJSON
|
EOFJSON
|
||||||
fi
|
fi
|
||||||
GENERATED_COUNT=$((GENERATED_COUNT + 1))
|
GENERATED_COUNT=$((GENERATED_COUNT + 1))
|
||||||
|
|
||||||
# 生成文件数徽章
|
# 生成文件数徽章
|
||||||
cat > ${{ env.BADGE_DIR }}/${lang_id}-files.json << EOFJSON
|
cat > ${{ env.BADGE_DIR }}/${lang_id}-files.json << EOFJSON
|
||||||
{
|
{
|
||||||
|
|
@ -689,7 +689,7 @@ jobs:
|
||||||
# 📊 代码统计详细报告
|
# 📊 代码统计详细报告
|
||||||
|
|
||||||
> 🤖 由 GitHub Actions 自动生成
|
> 🤖 由 GitHub Actions 自动生成
|
||||||
>
|
>
|
||||||
> 📅 更新时间: TIMESTAMP_PLACEHOLDER
|
> 📅 更新时间: TIMESTAMP_PLACEHOLDER
|
||||||
|
|
||||||
## 📈 总体统计
|
## 📈 总体统计
|
||||||
|
|
@ -720,17 +720,17 @@ jobs:
|
||||||
| 语言 | 代码行数 | 文件数 | 占比 | 徽章 |
|
| 语言 | 代码行数 | 文件数 | 占比 | 徽章 |
|
||||||
|------|----------|--------|------|------|
|
|------|----------|--------|------|------|
|
||||||
EOFTABLE
|
EOFTABLE
|
||||||
|
|
||||||
TOTAL_CODE=${{ steps.total.outputs.total_code }}
|
TOTAL_CODE=${{ steps.total.outputs.total_code }}
|
||||||
while IFS='|' read -r lang_id display_name code_lines formatted_lines file_count color icon; do
|
while IFS='|' read -r lang_id display_name code_lines formatted_lines file_count color icon; do
|
||||||
[ -z "$lang_id" ] && continue
|
[ -z "$lang_id" ] && continue
|
||||||
|
|
||||||
if [ "$TOTAL_CODE" -gt 0 ]; then
|
if [ "$TOTAL_CODE" -gt 0 ]; then
|
||||||
PERCENT=$(echo "scale=1; $code_lines * 100 / $TOTAL_CODE" | bc)
|
PERCENT=$(echo "scale=1; $code_lines * 100 / $TOTAL_CODE" | bc)
|
||||||
else
|
else
|
||||||
PERCENT="0.0"
|
PERCENT="0.0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
cat >> ${{ env.BADGE_DIR }}/README.md << EOFLANG
|
cat >> ${{ env.BADGE_DIR }}/README.md << EOFLANG
|
||||||
| **${display_name}** | ${formatted_lines} | ${file_count} | ${PERCENT}% |  |
|
| **${display_name}** | ${formatted_lines} | ${file_count} | ${PERCENT}% |  |
|
||||||
EOFLANG
|
EOFLANG
|
||||||
|
|
@ -807,7 +807,7 @@ jobs:
|
||||||
echo ""
|
echo ""
|
||||||
else
|
else
|
||||||
echo "📝 准备提交..."
|
echo "📝 准备提交..."
|
||||||
|
|
||||||
# 生成提交信息
|
# 生成提交信息
|
||||||
COMMIT_MSG="chore: 更新代码统计 [$(date '+%Y-%m-%d %H:%M')]
|
COMMIT_MSG="chore: 更新代码统计 [$(date '+%Y-%m-%d %H:%M')]
|
||||||
|
|
||||||
|
|
@ -821,12 +821,12 @@ jobs:
|
||||||
🤖 由 GitHub Actions 自动生成"
|
🤖 由 GitHub Actions 自动生成"
|
||||||
|
|
||||||
git commit -m "$COMMIT_MSG"
|
git commit -m "$COMMIT_MSG"
|
||||||
|
|
||||||
echo "📤 推送到远程 ${{ env.BADGE_BRANCH }} 分支..."
|
echo "📤 推送到远程 ${{ env.BADGE_BRANCH }} 分支..."
|
||||||
|
|
||||||
# 推送到远程(使用 TOKEN)
|
# 推送到远程(使用 TOKEN)
|
||||||
git push https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git ${{ env.BADGE_BRANCH }}
|
git push https://oauth2:${{ env.ACCESS_TOKEN }}@${GITHUB_SERVER_URL#https://}/${{ github.repository }}.git ${{ env.BADGE_BRANCH }}
|
||||||
|
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
echo "✅ 推送成功"
|
echo "✅ 推送成功"
|
||||||
echo "changed=true" >> $GITHUB_OUTPUT
|
echo "changed=true" >> $GITHUB_OUTPUT
|
||||||
|
|
@ -873,17 +873,17 @@ jobs:
|
||||||
| 语言 | 代码行数 | 文件数 | 占比 |
|
| 语言 | 代码行数 | 文件数 | 占比 |
|
||||||
|------|----------|--------|------|
|
|------|----------|--------|------|
|
||||||
EOFTABLE
|
EOFTABLE
|
||||||
|
|
||||||
TOTAL_CODE=${{ steps.total.outputs.total_code }}
|
TOTAL_CODE=${{ steps.total.outputs.total_code }}
|
||||||
sort -t'|' -k3 -nr /tmp/lang_summary.txt | head -10 | while IFS='|' read -r lang_id display_name code_lines formatted_lines file_count color icon; do
|
sort -t'|' -k3 -nr /tmp/lang_summary.txt | head -10 | while IFS='|' read -r lang_id display_name code_lines formatted_lines file_count color icon; do
|
||||||
[ -z "$lang_id" ] && continue
|
[ -z "$lang_id" ] && continue
|
||||||
|
|
||||||
if [ "$TOTAL_CODE" -gt 0 ]; then
|
if [ "$TOTAL_CODE" -gt 0 ]; then
|
||||||
PERCENT=$(echo "scale=1; $code_lines * 100 / $TOTAL_CODE" | bc)
|
PERCENT=$(echo "scale=1; $code_lines * 100 / $TOTAL_CODE" | bc)
|
||||||
else
|
else
|
||||||
PERCENT="0.0"
|
PERCENT="0.0"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "| **${display_name}** | ${formatted_lines} | ${file_count} | ${PERCENT}% |" >> $GITHUB_STEP_SUMMARY
|
echo "| **${display_name}** | ${formatted_lines} | ${file_count} | ${PERCENT}% |" >> $GITHUB_STEP_SUMMARY
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue