summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-01-21 18:32:41 +0800
committer苏向夜 <fu050409@163.com>2024-01-21 18:32:41 +0800
commit97ad5ab780f5ac310a27d43e684f8965bc77414b (patch)
treeea614e2387391990e1d3271975706d4a91c01c40
parent2be84aba417375d62a038aef03df4f94e9a0044c (diff)
downloadipm-97ad5ab780f5ac310a27d43e684f8965bc77414b.tar.gz
ipm-97ad5ab780f5ac310a27d43e684f8965bc77414b.zip
:sparkles: feat(api): use infini frozen package as infini.lock document and add hash parament
-rw-r--r--src/ipm/api.py24
-rw-r--r--src/ipm/models/ipk.py34
-rw-r--r--src/ipm/models/lock.py10
-rw-r--r--src/ipm/utils/freeze.py10
-rw-r--r--src/ipm/utils/loader.py26
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