Skip to content

Commit aa51c81

Browse files
committed
automatically update files for weasel when needed
1 parent 7dea819 commit aa51c81

File tree

3 files changed

+166
-70
lines changed

3 files changed

+166
-70
lines changed

.github/workflows/gh-pages.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ jobs:
3636
3737
- run: npm ci
3838

39-
- run: python ./weasel_testing_appcast.py
39+
- run: |
40+
pip install ruamel.yaml
41+
python ./update_weasel_appcast.py
4042
4143
- name: Deploy luna pinyin and stroke
4244
uses: rimeinn/deploy-schema@master

blog/update_weasel_appcast.py

Lines changed: 163 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,163 @@
1+
import requests
2+
import time
3+
from datetime import datetime, timedelta, timezone
4+
5+
datas = []
6+
for url in ["https://api.github.com/repos/rime/weasel/releases/tags/latest", "https://api.github.com/repos/rime/weasel/releases/latest"]:
7+
response = requests.get(url)
8+
if response.ok:
9+
datas.append(response.json())
10+
filenames = []
11+
urls = []
12+
update_time = []
13+
tags_name = []
14+
for data in datas:
15+
if data["prerelease"] == False:
16+
release_json = data
17+
for asset in data['assets']:
18+
if asset['name'].endswith('.exe'):
19+
filenames.append(asset['name'])
20+
urls.append(asset['browser_download_url'])
21+
update_time.append(data['published_at'])
22+
tags_name.append(data['tag_name'])
23+
# compare update_time and get the latest one
24+
latest_time = update_time[0]
25+
latest_index = 0
26+
for i in range(1, len(update_time)):
27+
if update_time[i] > latest_time:
28+
latest_time = update_time[i]
29+
latest_index = i
30+
# get version number
31+
version = filenames[latest_index].replace("-installer.exe", "")
32+
version = version.replace("weasel-", "")
33+
# download url
34+
download_url = urls[latest_index]
35+
# get local time in format like "Thu, 01 Jan 1970 00:00:00 +0000"
36+
# define a function to format time
37+
def format_time(time_str):
38+
utc_offset_sec = -time.timezone if time.localtime().tm_isdst == 0 else -time.altzone
39+
utc_offset = timedelta(seconds=utc_offset_sec)
40+
current_tz = timezone(utc_offset)
41+
utc_time = datetime.strptime(time_str, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc)
42+
local_time = utc_time.astimezone(current_tz)
43+
formatted_time = local_time.strftime("%a, %d %b %Y %H:%M:%S %z")
44+
return formatted_time
45+
formatted_time = format_time(update_time[latest_index])
46+
47+
# get release notes link
48+
if tags_name[latest_index] == "latest":
49+
releaseNotesLink = "https://github.com/rime/weasel/releases/tag/latest"
50+
else:
51+
releaseNotesLink = "http://rime.github.io/testing/weasel/"
52+
# format xml file content
53+
template = f"""<?xml version="1.0" encoding="utf-8"?>
54+
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
55+
<channel>
56+
<title>【小狼毫】輸入法測試頻道</title>
57+
<link>http://rime.github.io/testing/weasel/appcast.xml</link>
58+
<description>小狼毫測試版 Appcast 更新頻道</description>
59+
<language>zh</language>
60+
<item>
61+
<title>小狼毫 {version}</title>
62+
<sparkle:releaseNotesLink>{releaseNotesLink}</sparkle:releaseNotesLink>
63+
<pubDate>{formatted_time}</pubDate>
64+
<enclosure url="{download_url}"
65+
sparkle:version="{version}"
66+
type="application/octet-stream"/>
67+
</item>
68+
</channel>
69+
</rss>
70+
"""
71+
print(f"./source/testing/weasel/appcast.xml:\n{template}")
72+
# write template to ./source/testing/weasel/appcast.xml
73+
with open("./source/testing/weasel/appcast.xml", "w", encoding='utf-8') as f:
74+
f.write(template)
75+
f.close()
76+
print("./source/testing/weasel/appcast.xml updated\n")
77+
# update release appcast.xml automatically, and update other files if needed
78+
if 'release_json' in locals() or 'release_json' in globals():
79+
import re
80+
release_formatted_time = format_time(release_json['published_at'])
81+
# get release url
82+
for asset in release_json['assets']:
83+
if asset['name'].endswith('.exe'):
84+
release_url = asset['browser_download_url']
85+
break
86+
if 'release_url' not in locals():
87+
print("release_url not found, using default url")
88+
release_url = f"https://github.com/rime/weasel/releases/download/{release_json["tag_name"]}/weasel-{release_json["tag_name"]}.0-installer.exe"
89+
# update appcast.xml
90+
template_release = f"""<?xml version="1.0" encoding="utf-8"?>
91+
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle">
92+
<channel>
93+
<title>【小狼毫】輸入法更新頻道</title>
94+
<link>http://rime.github.io/release/weasel/appcast.xml</link>
95+
<description>小狼毫 Appcast 更新頻道</description>
96+
<language>zh</language>
97+
<item>
98+
<title>小狼毫 {release_json["tag_name"]}</title>
99+
<sparkle:releaseNotesLink>http://rime.github.io/release/weasel/</sparkle:releaseNotesLink>
100+
<pubDate>{release_formatted_time}</pubDate>
101+
<enclosure url="{release_url}"
102+
sparkle:version="{release_json["tag_name"]}"
103+
type="application/octet-stream"/>
104+
</item>
105+
</channel>
106+
</rss>"""
107+
print(f"./source/release/weasel/appcast.xml:\n{template_release}")
108+
with open("./source/release/weasel/appcast.xml", "w", encoding='utf-8') as f:
109+
f.write(template_release)
110+
f.close()
111+
print("./source/release/weasel/appcast.xml updated\n")
112+
# get changelog.md
113+
changelog_url = f"https://raw.githubusercontent.com/rime/weasel/refs/tags/{release_json['tag_name']}/CHANGELOG.md"
114+
changelog_txt = requests.get(changelog_url).text
115+
match = re.search(r'(\d+\.\d+\.\d+)', changelog_txt)
116+
if not match:
117+
print("No version number found in CHANGELOG.md")
118+
exit(0)
119+
changelog_version = match.group(1)
120+
121+
if changelog_version != release_json['tag_name']:
122+
print("latest version in CHANGELOG.md is not released yet")
123+
exit(0)
124+
# version tag in CHANGELOG.md has been released
125+
print("latest version in CHANGELOG.md has been released")
126+
index_md = f"""title: 【小狼毫】更新日誌\ncomments: false\ndate: {release_formatted_time}\n---\n\n{changelog_txt}"""
127+
# update ./source/release/weasel/index.md
128+
with open("./source/release/weasel/index.md", "w", encoding='utf-8') as f:
129+
f.write(index_md)
130+
f.close()
131+
print("./source/release/weasel/index.md updated")
132+
# update ./source/testing/weasel/index.md
133+
with open("./source/testing/weasel/index.md", "w", encoding='utf-8') as f:
134+
f.write(index_md)
135+
f.close()
136+
print("./source/testing/weasel/index.md updated")
137+
# modify ./source/_data/downloads.yaml, key weasel/version and weasel/url
138+
from ruamel.yaml import YAML
139+
yaml = YAML()
140+
yaml.preserve_quotes = True
141+
yaml.indent(mapping=2, sequence=2, offset=2)
142+
# this will be like this until there is some change in the yaml file not in this format/rule
143+
with open("./source/_data/downloads.yaml", "r", encoding='utf-8') as f:
144+
downloads_yaml = yaml.load(f)
145+
f.close()
146+
with open("./source/_data/downloads.yaml", "w", encoding='utf-8') as f:
147+
downloads_yaml['weasel']['version'] = release_json['tag_name']
148+
downloads_yaml['weasel']['url'] = release_url
149+
yaml.dump(downloads_yaml, f)
150+
print("./source/_data/downloads.yaml updated")
151+
f.close()
152+
# update source/download/index.md
153+
pattern = r"\* \[小狼毫 \d+\.\d+\.\d+\]\(https://github\.com/rime/weasel/releases/latest\)〔\[下載\]\(https://github\.com/rime/weasel/releases/download/\d+\.\d+\.\d+/weasel-\d+\.\d+\.\d+\.0-installer\.exe\)〕〔\[更新日誌\]\(/release/weasel/\)〕〔\[歷史版本\]\(https://github\.com/rime/weasel/releases\)〕"
154+
new_str = f"* [小狼毫 {release_json['tag_name']}](https://github.com/rime/weasel/releases/latest)〔[下載](https://github.com/rime/weasel/releases/download/{release_json['tag_name']}/weasel-{release_json['tag_name']}.0-installer.exe)〕〔[更新日誌](/release/weasel/)〕〔[歷史版本](https://github.com/rime/weasel/releases)〕"
155+
# replace pattern with new_str in ./source/download/index.md
156+
with open("./source/download/index.md", "r", encoding='utf-8') as f:
157+
download_md = f.read()
158+
f.close()
159+
download_md = re.sub(pattern, new_str, download_md)
160+
with open("./source/download/index.md", "w", encoding='utf-8') as f:
161+
f.write(download_md)
162+
f.close()
163+
print("./source/download/index.md updated")

blog/weasel_testing_appcast.py

Lines changed: 0 additions & 69 deletions
This file was deleted.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy