feat(plugin): 实现插件更新功能

- PluginRegistry 新增 _update_requested 信号与 do_update slot
- 待处理清单扩展支持 tool_name|remote_path 更新行格式
- 启动时 _process_pending_uninstalls 删旧 .pyd 后从服务器复制新文件
- PluginsCard 新增 parse_version 版本比较与 on_update_event
- 更新链路复用卸载的自重启机制,一次重启完成更新
This commit is contained in:
2026-07-20 14:25:18 +08:00
parent 51e30d41c6
commit ca6c538060
2 changed files with 133 additions and 37 deletions
+31 -6
View File
@@ -10,6 +10,29 @@ from .plugins_card_ui import Ui_FramePluginsCard
logger = logging.getLogger(__name__)
def parse_version(version: str) -> tuple:
"""将版本字符串解析为可比较的元组,如 '1.10.0' -> (1, 10, 0)。
非数字段保持原样(字符串与整数混排时按元组规则比较,足够覆盖
常见的 '1.0.0' / '1.10.3' 场景)。None/空值/解析失败返回 (0,),
视为最低版本。
"""
if not version:
return (0,)
try:
parts = []
for seg in str(version).split('.'):
seg = seg.strip()
if seg.isdigit():
parts.append(int(seg))
else:
parts.append(seg)
return tuple(parts) if parts else (0,)
except Exception:
return (0,)
class PluginsCard(QFrame, Ui_FramePluginsCard):
"""工具卡片类
@@ -27,9 +50,9 @@ class PluginsCard(QFrame, Ui_FramePluginsCard):
self.initUI()
def initUI(self):
self.textBrowser.setReadOnly(True)
self.refresh()
self.textBrowser.setReadOnly(True)
self.pushButtonUpdate.clicked.connect(self.on_update_event)
self.pushButtonInstall.clicked.connect(self.on_install_event)
self.pushButtonUninstall.clicked.connect(self.on_uninstall_event)
@@ -40,9 +63,9 @@ class PluginsCard(QFrame, Ui_FramePluginsCard):
self.pushButtonInstall.setEnabled(not installed)
self.pushButtonUninstall.setEnabled(installed)
if installed:
self.pushButtonUpdate.setEnabled(
self.info['remote version'] > self.info['local version']
)
remote = parse_version(self.info.get('remote version'))
local = parse_version(self.info.get('local version'))
self.pushButtonUpdate.setEnabled(remote > local)
else:
self.pushButtonUpdate.setEnabled(False)
@@ -61,4 +84,6 @@ class PluginsCard(QFrame, Ui_FramePluginsCard):
def on_uninstall_event(self):
self.send_event_signal.emit(Event.Uninstall, self.name)
pass
def on_update_event(self):
self.send_event_signal.emit(Event.Update, self.name)