diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipm/api.py | 24 | ||||
| -rw-r--r-- | src/ipm/models/ipk.py | 34 | ||||
| -rw-r--r-- | src/ipm/models/lock.py | 10 | ||||
| -rw-r--r-- | src/ipm/utils/freeze.py | 10 | ||||
| -rw-r--r-- | src/ipm/utils/loader.py | 26 |
5 files changed, 67 insertions, 37 deletions
diff --git a/src/ipm/api.py b/src/ipm/api.py index 47f83d2..82f9aae 100644 --- a/src/ipm/api.py +++ b/src/ipm/api.py @@ -1,7 +1,7 @@ from pathlib import Path from .typing import StrPath from .utils import freeze, urlparser, loader -from .models.ipk import InfiniPackage, InfiniFrozenPackage +from .models.ipk import InfiniProject, InfiniFrozenPackage from .models.lock import PackageLock from .exceptions import FileTypeMismatch, TomlLoadFailed, FileNotFoundError from .const import INDEX, STORAGE, SRC_HOME @@ -49,7 +49,7 @@ def new(dist_path: StrPath, echo: bool = False) -> None: def build(source_path: StrPath, echo: bool = False) -> InfiniFrozenPackage: info("检查构建环境...", echo) try: - ipk = InfiniPackage(source_path) + ipk = InfiniProject(source_path) info(f"包[{ipk.name}]构建环境载入完毕.", echo) except TomlLoadFailed as e: return error(f"环境存在异常: {e}", echo) @@ -58,7 +58,7 @@ def build(source_path: StrPath, echo: bool = False) -> InfiniFrozenPackage: def extract( source_path: StrPath, dist_path: StrPath | None = None, echo: bool = False -) -> InfiniPackage: +) -> InfiniProject: dist_path = ( Path(dist_path).resolve() if dist_path else Path(source_path).resolve().parent ) @@ -77,7 +77,7 @@ def install(uri: str, index: str = "", echo: bool = False) -> None: ... elif urlparser.is_valid_url(uri): filename = uri.rstrip("/").split("/")[-1] - temp_ipk = loader.load_from_remote( + ifp = loader.load_from_remote( "temp", uri.rstrip("/").rsplit("/")[0], filename, @@ -89,21 +89,21 @@ def install(uri: str, index: str = "", echo: bool = False) -> None: raise FileNotFoundError("给定的 URI 路径不存在!") if uri.endswith(".ipk"): - temp_ipk = loader.load_from_local(path) + ifp = loader.load_from_local(path) else: raise FileTypeMismatch("文件类型与预期[.ipk]不匹配.") - if lock.has_ipk(temp_ipk.name): + if lock.has_ipk(ifp.name): raise # TODO - info(f"开始安装[{temp_ipk.name}]中...", echo) - ipk = extract(STORAGE / temp_ipk.name / temp_ipk.default_name, SRC_HOME, echo) - info("正在处理全局包锁...") - lock.add(ipk, dump=True) - info("全局锁已处理完毕.") + info(f"开始安装[{ifp.name}]中...", echo) + ipk = extract(STORAGE / ifp.name / ifp.default_name, SRC_HOME, echo) + info("正在处理全局包锁...", echo) + lock.add(ifp, dump=True) + info("全局锁已处理完毕.", echo) success(f"包[{ipk.name}]成功安装在[{ipk.source_path}].", echo) -def uninstall(ipk: str | InfiniPackage): +def uninstall(ipk: str | InfiniProject): ... diff --git a/src/ipm/models/ipk.py b/src/ipm/models/ipk.py index ef6f649..24cc24e 100644 --- a/src/ipm/models/ipk.py +++ b/src/ipm/models/ipk.py @@ -30,6 +30,19 @@ class Authors: class InfiniPackage: source_path: Path + name: str | None + version: str | None + + @property + def default_name(self) -> str: + return f"{self.name}-{self.version}.ipk" + + @property + def hash_name(self) -> str: + return f"{self.name}-{self.version}.ipk.hash" + + +class InfiniProject(InfiniPackage): name: str version: str description: str @@ -64,14 +77,6 @@ class InfiniPackage: self.dependencies = data_load["dependencies"] # self.lock = ProjectLock - @property - def default_name(self) -> str: - return f"{self.name}-{self.version}.ipk" - - @property - def hash_name(self) -> str: - return f"{self.name}-{self.version}.ipk.hash" - def export_dict(self) -> dict: return { "infini": { @@ -89,12 +94,21 @@ class InfiniPackage: } -class InfiniFrozenPackage: - source_path: Path +class InfiniFrozenPackage(InfiniPackage): + name: str | None + version: str | None + hash: str def __init__(self, source_path: str | Path, **kwargs) -> None: self.source_path = Path(source_path).resolve() + self.hash = ( + (self.source_path.parent / (source_path.name + ".hash")).read_bytes().hex() + ) + + self.name = kwargs.get("name") + self.version = kwargs.get("version") + @property def hash_name(self) -> str: return f"{self.source_path.name}.hash" diff --git a/src/ipm/models/lock.py b/src/ipm/models/lock.py index 97928a7..6a4437f 100644 --- a/src/ipm/models/lock.py +++ b/src/ipm/models/lock.py @@ -50,8 +50,14 @@ class PackageLock(IpmLock): def __init__(self) -> None: super().__init__() - def add(self, ipk: "ipk.InfiniPackage", dump: bool = False) -> str: - self.packages.append({"name": ipk.name, "version": ipk.version}) + def add(self, ipk: "ipk.InfiniFrozenPackage", dump: bool = False) -> str: + self.packages.append( + { + "name": ipk.name, + "version": ipk.version, + "hash": ipk.hash, + } + ) return self.dump() if dump else "" def remove(self, name: str) -> None: diff --git a/src/ipm/utils/freeze.py b/src/ipm/utils/freeze.py index 5c6951c..db9f508 100644 --- a/src/ipm/utils/freeze.py +++ b/src/ipm/utils/freeze.py @@ -1,6 +1,6 @@ from pathlib import Path from ..exceptions import FileNotFoundError, VerifyFailed -from ..models.ipk import InfiniPackage, InfiniFrozenPackage +from ..models.ipk import InfiniProject, InfiniFrozenPackage from ..typing import StrPath from ..logging import logger, info, success from .hash import ifp_hash, ifp_verify @@ -10,7 +10,7 @@ import tempfile import shutil -def build_ipk(ipk: InfiniPackage, echo: bool = False) -> InfiniFrozenPackage: +def build_ipk(ipk: InfiniProject, echo: bool = False) -> InfiniFrozenPackage: info("正在初始化开发环境...", echo) build_dir = ipk.source_path / "build" src_path = ipk.source_path / "src" @@ -47,7 +47,7 @@ def build_ipk(ipk: InfiniPackage, echo: bool = False) -> InfiniFrozenPackage: def extract_ipk( source_path: StrPath, dist_path: StrPath, echo: bool = False -) -> InfiniPackage: +) -> InfiniProject: ifp_path = Path(source_path).resolve() dist_path = Path(dist_path).resolve() hash_path = ifp_path.parent / (ifp_path.name + ".hash") @@ -63,7 +63,7 @@ def extract_ipk( temp_path = Path(temp_dir.name).resolve() / "ifp" info(f"创建临时目录[{temp_dir}], 开始解压...", echo) _freeze.extract_tar_gz(str(ifp_path), str(temp_path)) - temp_pkg = InfiniPackage(temp_path) + temp_pkg = InfiniProject(temp_path) dist_pkg_path = dist_path / temp_pkg.name success(f"包[{temp_pkg.name}]解压完成.", echo) @@ -80,4 +80,4 @@ def extract_ipk( info(f"任务完成, 开始清理临时文件...", echo) temp_dir.cleanup() info(f"临时文件清理完毕.", echo) - return InfiniPackage(dist_pkg_path) + return InfiniProject(dist_pkg_path) diff --git a/src/ipm/utils/loader.py b/src/ipm/utils/loader.py index 18d98ac..d06a0e2 100644 --- a/src/ipm/utils/loader.py +++ b/src/ipm/utils/loader.py @@ -1,14 +1,16 @@ from pathlib import Path from .freeze import extract_ipk -from ..const import SRC_HOME, STORAGE -from ..models.ipk import InfiniPackage +from ..const import STORAGE +from ..models.ipk import InfiniFrozenPackage import requests import tempfile import shutil -def load_from_remote(name: str, baseurl: str = "", filename: str = "") -> InfiniPackage: +def load_from_remote( + name: str, baseurl: str = "", filename: str = "" +) -> InfiniFrozenPackage: ipk_bytes = requests.get(baseurl.rstrip("/") + "/" + filename).content hash_bytes = requests.get(baseurl.rstrip("/") + "/" + filename + ".hash").content @@ -29,14 +31,18 @@ def load_from_remote(name: str, baseurl: str = "", filename: str = "") -> Infini move_to = STORAGE / temp_ipk.name move_to.mkdir(parents=True, exist_ok=True) - shutil.copy2(ipk_file, move_to) - shutil.copy2(hash_file, move_to) + shutil.copy2(ipk_file, move_to / temp_ipk.default_name) + shutil.copy2(hash_file, move_to / (temp_ipk.default_name + ".hash")) + + ifp = InfiniFrozenPackage( + move_to / temp_ipk.default_name, name=temp_ipk.name, version=temp_ipk.version + ) temp_dir.cleanup() - return temp_ipk + return ifp -def load_from_local(source_path: Path) -> InfiniPackage: +def load_from_local(source_path: Path) -> InfiniFrozenPackage: temp_dir = tempfile.TemporaryDirectory() temp_path = Path(temp_dir.name).resolve() @@ -47,5 +53,9 @@ def load_from_local(source_path: Path) -> InfiniPackage: shutil.copy2(source_path, move_to) shutil.copy2(source_path.parent / (source_path.name + ".hash"), move_to) + ifp = InfiniFrozenPackage( + move_to / temp_ipk.default_name, name=temp_ipk.name, version=temp_ipk.version + ) + temp_dir.cleanup() - return temp_ipk + return ifp |
