perf: 优化更新速度和更新流程
This commit is contained in:
@@ -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
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user