chore(workflow): follow stable toolchain channels

This commit is contained in:
InfinityPacer
2026-08-28 10:21:01 +08:00
parent 3f8d5990e7
commit 18a0fd3e1c
21 changed files with 446 additions and 160 deletions
+29 -6
View File
@@ -16,7 +16,7 @@ SUPERUSER=""
SUPERUSER_PASSWORD=""
OS_NAME="Unknown"
PYTHON_BIN=""
UV_VERSION="0.12.5"
MIN_UV_VERSION="0.12.5"
BREW_BIN=""
PACKAGE_MANAGER=""
PACKAGE_INDEX_UPDATED="false"
@@ -384,20 +384,43 @@ ensure_base_tools() {
fi
}
uv_version_supported() {
local actual="$1"
local minimum="$2"
local -a actual_parts minimum_parts
local index actual_part minimum_part
IFS=. read -r -a actual_parts <<< "$actual"
IFS=. read -r -a minimum_parts <<< "$minimum"
for index in 0 1 2; do
actual_part="${actual_parts[$index]:-0}"
minimum_part="${minimum_parts[$index]:-0}"
[[ "$actual_part" =~ ^[0-9]+$ ]] || return 1
[[ "$minimum_part" =~ ^[0-9]+$ ]] || return 1
if (( 10#$actual_part > 10#$minimum_part )); then
return 0
fi
if (( 10#$actual_part < 10#$minimum_part )); then
return 1
fi
done
return 0
}
ensure_uv() {
if command -v uv >/dev/null 2>&1 \
&& [[ "$(uv --version 2>/dev/null | awk '{print $2}')" == "${UV_VERSION}" ]]; then
&& uv_version_supported "$(uv --version 2>/dev/null | awk '{print $2}')" "${MIN_UV_VERSION}"; then
return 0
fi
echo "==> 自动安装 uv ${UV_VERSION}"
env UV_INSTALL_DIR="$HOME/.local/bin" sh -c "$(curl -LsSf "https://astral.sh/uv/${UV_VERSION}/install.sh")"
echo "==> 自动安装最新稳定版 uv"
env UV_INSTALL_DIR="$HOME/.local/bin" sh -c "$(curl -LsSf https://astral.sh/uv/install.sh)"
export PATH="$HOME/.local/bin:$PATH"
hash -r
if ! command -v uv >/dev/null 2>&1 \
|| [[ "$(uv --version 2>/dev/null | awk '{print $2}')" != "${UV_VERSION}" ]]; then
echo "uv ${UV_VERSION} 安装失败,无法继续自动安装 Python。" >&2
|| ! uv_version_supported "$(uv --version 2>/dev/null | awk '{print $2}')" "${MIN_UV_VERSION}"; then
echo "uv ${MIN_UV_VERSION}+ 安装失败,无法继续自动安装 Python。" >&2
return 1
fi
}
+16 -6
View File
@@ -9,8 +9,8 @@ import importlib.util
import json
import os
import platform
import secrets
import re
import secrets
import shlex
import shutil
import subprocess
@@ -36,7 +36,8 @@ NODE_DIR = RUNTIME_DIR / "node"
INSTALL_ENV_FILE = ROOT / ".moviepilot.env"
MIN_PYTHON_VERSION = (3, 14)
SUPPORTED_PYTHON_TEXT = "Python 3.14+"
UV_VERSION = "0.12.5"
MIN_UV_VERSION = (0, 12, 5)
MIN_UV_VERSION_TEXT = ".".join(str(part) for part in MIN_UV_VERSION)
CONFIG_DIR = LEGACY_CONFIG_DIR
LOG_DIR = CONFIG_DIR / "logs"
@@ -618,18 +619,27 @@ def get_venv_bin_dir(venv_dir: Path) -> Path:
return venv_dir / "bin"
def parse_uv_version(output: str) -> tuple[int, int, int] | None:
"""从 uv 版本输出中提取稳定版三段版本号。"""
match = re.match(r"^uv\s+(\d+)\.(\d+)\.(\d+)(?:\s|$)", output.strip())
if not match:
return None
return tuple(int(part) for part in match.groups())
def require_uv() -> Path:
"""返回仓库要求版本的 uv,避免不同安装入口使用不同解析器"""
"""返回满足仓库最低版本要求的 uv"""
uv_command = shutil.which("uv")
if not uv_command:
raise RuntimeError(
f"未找到 uv {UV_VERSION},请先安装后重新执行。"
f"未找到 uv {MIN_UV_VERSION_TEXT}+,请先安装后重新执行。"
)
uv_bin = Path(uv_command).expanduser().resolve()
version = capture([str(uv_bin), "--version"])
if version.split()[:2] != ["uv", UV_VERSION]:
parsed_version = parse_uv_version(version)
if parsed_version is None or parsed_version < MIN_UV_VERSION:
raise RuntimeError(
f"MoviePilot 需要 uv {UV_VERSION},当前为 {version or '未知版本'}"
f"MoviePilot 需要 uv {MIN_UV_VERSION_TEXT}+,当前为 {version or '未知版本'}"
)
return uv_bin