Skip to content

Commit 7479038

Browse files
committed
refactor: simplify release fetching and harden nightly git diagnostics
1 parent 75357d1 commit 7479038

5 files changed

Lines changed: 56 additions & 59 deletions

File tree

.github/workflows/release.yml

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,11 @@ jobs:
7777
elif [ -n "$dispatch_tag" ]; then
7878
tag="$dispatch_tag"
7979
else
80-
tag="$(git describe --tags --abbrev=0)"
80+
if ! tag="$(git describe --tags --abbrev=0 2>/tmp/git_describe_error.log)"; then
81+
echo "Failed to resolve tag via git describe. Ensure repository history and tags are available." >&2
82+
cat /tmp/git_describe_error.log >&2 || true
83+
exit 1
84+
fi
8185
fi
8286
if [ -z "$tag" ]; then
8387
echo "Failed to resolve tag." >&2
@@ -203,7 +207,11 @@ jobs:
203207
run: |
204208
tag="${{ needs.resolve-release-context.outputs.tag }}"
205209
if [ "$tag" = "nightly" ]; then
206-
short_sha="$(git rev-parse --short=8 HEAD)"
210+
if ! short_sha="$(git rev-parse --short=8 HEAD 2>/tmp/git_rev_parse_error.log)"; then
211+
echo "Failed to resolve HEAD short SHA for nightly title." >&2
212+
cat /tmp/git_rev_parse_error.log >&2 || true
213+
exit 1
214+
fi
207215
base_version="$(git tag --list 'v*' --sort=-version:refname | grep -E '^v[0-9]+(\.[0-9]+)*$' | head -n1)"
208216
if [ -z "$base_version" ]; then
209217
base_version="v0.0.0"
@@ -222,7 +230,11 @@ jobs:
222230
GH_TOKEN: ${{ github.token }}
223231
shell: bash
224232
run: |
225-
current_sha="$(git rev-parse HEAD)"
233+
if ! current_sha="$(git rev-parse HEAD 2>/tmp/git_rev_parse_error.log)"; then
234+
echo "Failed to resolve HEAD SHA before updating nightly tag." >&2
235+
cat /tmp/git_rev_parse_error.log >&2 || true
236+
exit 1
237+
fi
226238
git tag -f nightly "${current_sha}"
227239
git push --force origin refs/tags/nightly
228240

astrbot/core/updator.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ async def check_update(
147147
consider_prerelease,
148148
)
149149

150-
async def get_releases(self, latest: bool = True) -> list:
151-
return await self.fetch_release_info(self.ASTRBOT_RELEASE_API, latest)
150+
async def get_releases(self) -> list:
151+
return await self.fetch_release_info(self.ASTRBOT_RELEASE_API)
152152

153153
@staticmethod
154154
def _is_expected_nightly_fetch_error(exc: BaseException) -> bool:
@@ -185,8 +185,8 @@ async def get_nightly_release(self) -> dict | None:
185185
return None
186186
return nightly_releases[0]
187187

188-
async def get_releases_with_nightly(self, latest: bool = True) -> list:
189-
releases = await self.get_releases(latest=latest)
188+
async def get_releases_with_nightly(self) -> list:
189+
releases = await self.get_releases()
190190
nightly_release = await self.get_nightly_release()
191191
if nightly_release and all(
192192
item.get("tag_name") != self.NIGHTLY_TAG for item in releases
@@ -195,7 +195,7 @@ async def get_releases_with_nightly(self, latest: bool = True) -> list:
195195
return releases
196196

197197
async def _resolve_latest_target(self) -> tuple[str, str]:
198-
releases = await self.get_releases(latest=True)
198+
releases = await self.get_releases()
199199
latest_release = next(
200200
(
201201
item
@@ -218,7 +218,7 @@ def _resolve_nightly_target(self) -> tuple[str, str]:
218218
)
219219

220220
async def _resolve_tag_target(self, version_str: str) -> tuple[str, str]:
221-
releases = await self.get_releases(latest=False)
221+
releases = await self.get_releases()
222222
for data in releases:
223223
if data["tag_name"] == version_str:
224224
return version_str, data["zipball_url"]

astrbot/core/zip_updator.py

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ def __init__(self, repo_mirror: str = "") -> None:
4848
self.repo_mirror = repo_mirror
4949
self.rm_on_error = on_error
5050

51-
async def fetch_release_info(self, url: str, latest: bool = True) -> list:
51+
async def fetch_release_info(self, url: str) -> list:
5252
"""请求版本信息。
5353
返回一个列表,每个元素是一个字典,包含版本号、发布时间、更新内容、commit hash等信息。
5454
"""
@@ -84,10 +84,6 @@ async def fetch_release_info(self, url: str, latest: bool = True) -> list:
8484
result = [result]
8585
if not result:
8686
return []
87-
# if latest:
88-
# ret = self.github_api_release_parser([result[0]])
89-
# else:
90-
# ret = self.github_api_release_parser(result)
9187
ret = []
9288
for release in result:
9389
ret.append(
@@ -101,23 +97,6 @@ async def fetch_release_info(self, url: str, latest: bool = True) -> list:
10197
)
10298
return ret
10399

104-
def github_api_release_parser(self, releases: list) -> list:
105-
"""解析 GitHub API 返回的 releases 信息。
106-
返回一个列表,每个元素是一个字典,包含版本号、发布时间、更新内容、commit hash等信息。
107-
"""
108-
ret = []
109-
for release in releases:
110-
ret.append(
111-
{
112-
"version": release["name"],
113-
"published_at": release["published_at"],
114-
"body": release["body"],
115-
"tag_name": release["tag_name"],
116-
"zipball_url": release["zipball_url"],
117-
},
118-
)
119-
return ret
120-
121100
def unzip(self) -> NoReturn:
122101
raise NotImplementedError
123102

scripts/release/generate_nightly_release_notes.py

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,18 @@
99

1010

1111
def _run_git(*args: str) -> str:
12-
result = subprocess.run(
13-
["git", *args],
14-
capture_output=True,
15-
text=True,
16-
check=True,
17-
)
12+
try:
13+
result = subprocess.run(
14+
["git", *args],
15+
capture_output=True,
16+
text=True,
17+
check=True,
18+
)
19+
except subprocess.CalledProcessError as e:
20+
stderr = (e.stderr or "").strip()
21+
stdout = (e.stdout or "").strip()
22+
detail = stderr or stdout or "no output"
23+
raise RuntimeError(f"git {' '.join(args)} failed: {detail}") from e
1824
return result.stdout.strip()
1925

2026

@@ -59,14 +65,14 @@ def generate_notes(base_tag: str, repo: str, output_path: Path) -> None:
5965
_write_fallback(output_path)
6066
return
6167

62-
result = subprocess.run(
63-
["git", "log", "--no-merges", "--pretty=format:%h%x1f%s", f"{base_tag}..HEAD"],
64-
capture_output=True,
65-
text=True,
66-
check=True,
68+
log_output = _run_git(
69+
"log",
70+
"--no-merges",
71+
"--pretty=format:%h%x1f%s",
72+
f"{base_tag}..HEAD",
6773
)
6874
sections: dict[str, list[str]] = defaultdict(list)
69-
for line in result.stdout.splitlines():
75+
for line in log_output.splitlines():
7076
if not line.strip() or "\x1f" not in line:
7177
continue
7278
short_sha, subject = line.split("\x1f", 1)
@@ -98,7 +104,10 @@ def main() -> None:
98104
parser.add_argument("--output", required=True, help="Output markdown path.")
99105
args = parser.parse_args()
100106

101-
generate_notes(args.base_tag.strip(), args.repo.strip(), Path(args.output))
107+
try:
108+
generate_notes(args.base_tag.strip(), args.repo.strip(), Path(args.output))
109+
except Exception as e:
110+
raise SystemExit(f"Failed to generate nightly release notes: {e}") from e
102111

103112

104113
if __name__ == "__main__":

tests/unit/test_updator.py

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@ async def test_get_releases_includes_nightly_tag(monkeypatch):
5454
"zipball_url": "https://example.com/nightly.zip",
5555
}
5656

57-
async def mock_fetch_release_info(url: str, latest: bool = True):
58-
_ = latest
57+
async def mock_fetch_release_info(url: str):
5958
if url == updator.ASTRBOT_RELEASE_API:
6059
return [stable_release]
6160
if url == f"{updator.GITHUB_RELEASE_API}/tags/{updator.NIGHTLY_TAG}":
@@ -89,8 +88,7 @@ async def test_get_releases_deduplicates_nightly_when_already_in_stable(monkeypa
8988
"zipball_url": "https://example.com/github-nightly.zip",
9089
}
9190

92-
async def mock_fetch_release_info(url: str, latest: bool = True):
93-
_ = latest
91+
async def mock_fetch_release_info(url: str):
9492
if url == updator.ASTRBOT_RELEASE_API:
9593
return [stable_nightly_release]
9694
if url == f"{updator.GITHUB_RELEASE_API}/tags/{updator.NIGHTLY_TAG}":
@@ -117,15 +115,14 @@ async def test_get_releases_returns_stable_only(monkeypatch):
117115
"zipball_url": "https://example.com/stable.zip",
118116
}
119117

120-
async def mock_fetch_release_info(url: str, latest: bool = True):
121-
_ = latest
118+
async def mock_fetch_release_info(url: str):
122119
if url == updator.ASTRBOT_RELEASE_API:
123120
return [stable_release]
124121
raise AssertionError(f"unexpected URL: {url}")
125122

126123
monkeypatch.setattr(updator, "fetch_release_info", mock_fetch_release_info)
127124

128-
releases = await updator.get_releases(latest=True)
125+
releases = await updator.get_releases()
129126
assert len(releases) == 1
130127
assert releases[0]["tag_name"] == "v9.9.9"
131128

@@ -134,8 +131,8 @@ async def mock_fetch_release_info(url: str, latest: bool = True):
134131
async def test_get_nightly_release_returns_none_for_expected_fetch_error(monkeypatch):
135132
updator = AstrBotUpdator()
136133

137-
async def mock_fetch_release_info(url: str, latest: bool = True):
138-
_ = url, latest
134+
async def mock_fetch_release_info(url: str):
135+
_ = url
139136
raise FetchReleaseError("请求失败,状态码: 404")
140137

141138
monkeypatch.setattr(updator, "fetch_release_info", mock_fetch_release_info)
@@ -148,8 +145,8 @@ async def mock_fetch_release_info(url: str, latest: bool = True):
148145
async def test_get_nightly_release_raises_for_unexpected_error(monkeypatch):
149146
updator = AstrBotUpdator()
150147

151-
async def mock_fetch_release_info(url: str, latest: bool = True):
152-
_ = url, latest
148+
async def mock_fetch_release_info(url: str):
149+
_ = url
153150
raise KeyError("unexpected")
154151

155152
monkeypatch.setattr(updator, "fetch_release_info", mock_fetch_release_info)
@@ -162,8 +159,8 @@ async def mock_fetch_release_info(url: str, latest: bool = True):
162159
async def test_check_update_skips_nightly_when_prerelease_disabled(monkeypatch):
163160
updator = RepoZipUpdator()
164161

165-
async def mock_fetch_release_info(url: str, latest: bool = True):
166-
_ = url, latest
162+
async def mock_fetch_release_info(url: str):
163+
_ = url
167164
return [
168165
{
169166
"version": "nightly",
@@ -197,8 +194,8 @@ async def mock_fetch_release_info(url: str, latest: bool = True):
197194
async def test_check_update_returns_none_when_only_prerelease_and_disabled(monkeypatch):
198195
updator = RepoZipUpdator()
199196

200-
async def mock_fetch_release_info(url: str, latest: bool = True):
201-
_ = url, latest
197+
async def mock_fetch_release_info(url: str):
198+
_ = url
202199
return [
203200
{
204201
"version": "nightly",

0 commit comments

Comments
 (0)