perf: 优化更新速度和更新流程

This commit is contained in:
Soulter
2024-02-06 19:18:53 +08:00
parent 6c0bda8feb
commit 30862bb82f
2 changed files with 41 additions and 20 deletions
+13 -5
View File
@@ -324,7 +324,7 @@ class Command:
if len(l) == 1:
try:
update_info = util.updator.check_update()
update_info += "\nTips:\n输入「update latest」更新到最新版本\n输入「update r」重启机器人\n"
update_info += "\nTips:\n输入「update latest」更新到最新版本\n输入「update <版本号如v3.1.3>」切换到指定版本\n输入「update r」重启机器人\n"
return True, update_info, "update"
except BaseException as e:
return False, "检查更新失败: "+str(e), "update"
@@ -336,8 +336,18 @@ class Command:
return True, "更新成功,重启生效。可输入「update r」重启", "update"
except BaseException as e:
return False, "更新失败: "+str(e), "update"
if l[1] == "r":
elif l[1] == "r":
util.updator._reboot()
else:
if l[1].lower().startswith('v'):
try:
release_data = util.updator.request_release_info(latest=False)
util.updator.update_project(release_data, latest=False, version=l[1])
return True, "更新成功,重启生效。可输入「update r」重启", "update"
except BaseException as e:
return False, "更新失败: "+str(e), "update"
else:
return False, "版本号格式错误", "update"
def reset(self):
return False
@@ -364,6 +374,4 @@ class Command:
return False
def draw(self):
return False
return False
+28 -15
View File
@@ -33,12 +33,19 @@ def request_release_info(latest: bool = True) -> list:
请求版本信息。
返回一个列表,每个元素是一个字典,包含版本号、发布时间、更新内容、commit hash等信息。
'''
api_url = "https://api.github.com/repos/Soulter/AstrBot/releases"
result = requests.get(api_url).json()
if latest:
ret = github_api_release_parser([result[0]])
else:
ret = github_api_release_parser(result)
api_url1 = "https://api.github.com/repos/Soulter/AstrBot/releases"
api_url2 = "https://api.soulter.top/releases" # 0-10 分钟的缓存时间
try:
result = requests.get(api_url2).json()
except BaseException as e:
result = requests.get(api_url1).json()
try:
if latest:
ret = github_api_release_parser([result[0]])
else:
ret = github_api_release_parser(result)
except BaseException as e:
raise Exception(f"解析版本信息失败: {result}")
return ret
def github_api_release_parser(releases: list) -> list:
@@ -48,7 +55,7 @@ def github_api_release_parser(releases: list) -> list:
'''
ret = []
for release in releases:
version = release['tag_name']
version = release['name']
commit_hash = ''
# 规范是: v3.0.7.xxxxxx,其中xxxxxx为 commit hash
_t = version.split(".")
@@ -58,19 +65,25 @@ def github_api_release_parser(releases: list) -> list:
"version": release['name'],
"published_at": release['published_at'],
"body": release['body'],
"commit_hash": commit_hash
"commit_hash": commit_hash,
"tag_name": release['tag_name']
})
return ret
def check_update() -> str:
repo = find_repo()
curr_commit = repo.head.commit.hexsha[:6]
curr_commit = repo.commit().hexsha
update_data = request_release_info()
new_commit = update_data[0]['commit_hash']
if curr_commit == new_commit:
print(f"当前版本: {curr_commit}")
print(f"最新版本: {new_commit}")
if curr_commit.startswith(new_commit):
return "当前已经是最新版本。"
else:
update_info = f"""有新版本可用。
=== 当前版本 ===
{curr_commit}
=== 新版本 ===
{update_data[0]['version']}
@@ -89,17 +102,17 @@ def update_project(update_data: list,
# update_data = request_release_info(latest)
if latest:
# 检查本地commit和最新commit是否一致
curr_commit = repo.head.commit.hexsha[:6]
curr_commit = repo.head.commit.hexsha
new_commit = update_data[0]['commit_hash']
if curr_commit == '':
raise Exception("无法获取当前版本号对应的版本位置。请联系项目维护者。")
if curr_commit == new_commit:
if curr_commit.startswith(new_commit):
raise Exception("当前已经是最新版本。")
else:
# 更新到最新版本对应的commit
try:
repo.remotes.origin.fetch()
repo.git.checkout(new_commit)
repo.git.checkout(update_data[0]['tag_name'])
if reboot: _reboot()
except BaseException as e:
raise e
@@ -107,10 +120,10 @@ def update_project(update_data: list,
# 更新到指定版本
flag = False
for data in update_data:
if data['version'] == version:
if data['tag_name'] == version:
try:
repo.remotes.origin.fetch()
repo.git.checkout(data['commit_hash'])
repo.git.checkout(data['tag_name'])
flag = True
if reboot: _reboot()
except BaseException as e: