diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ipm/models/index.py | 27 | ||||
| -rw-r--r-- | src/ipm/models/lock.py | 15 |
2 files changed, 28 insertions, 14 deletions
diff --git a/src/ipm/models/index.py b/src/ipm/models/index.py index 607f7a2..774da1f 100644 --- a/src/ipm/models/index.py +++ b/src/ipm/models/index.py @@ -1,5 +1,5 @@ from pathlib import Path -from typing import Any, List, Literal, Optional +from typing import Any, Literal, Optional from ipm.const import INDEX_PATH from ipm.exceptions import LockLoadFailed from ipm.models.lock import PackageLock @@ -14,14 +14,16 @@ import json class Yggdrasil: def __init__(self, index: str, uuid: str) -> None: self.index = index.rstrip("/") + "/" - self._source_path = INDEX_PATH / uuid + self._source_path = INDEX_PATH.joinpath(uuid) self._data = self.read() def read(self) -> Dict: if not self._source_path.exists(): self._source_path.parent.mkdir(parents=True, exist_ok=True) return {} - return json.load(self._source_path.open("r", encoding="utf-8")) + return json.load( + self._source_path.joinpath("packages.json").open("r", encoding="utf-8") + ) def dump(self) -> None: json.dump(self._data, self._source_path.open("w", encoding="utf-8")) @@ -63,8 +65,9 @@ class Yggdrasil: raise LockLoadFailed(f"地址[{index}]不是合法的世界树服务器.") uuid = packages["metadata"]["uuid"] - source_path = INDEX_PATH / uuid - shutil.copy2(temp_lock_path, source_path) + source_path = INDEX_PATH.joinpath(uuid) + source_path.mkdir(parents=True, exist_ok=True) + shutil.copy2(temp_lock_path, source_path.joinpath("packages.json")) temp_dir.cleanup() lock = PackageLock() @@ -76,20 +79,24 @@ class Yggdrasil: self._source_path = yggdrasil._source_path self._data = yggdrasil._data - def get_url(self, name: str, version: str) -> Optional[str]: + def get_url(self, name: str, version: Optional[str]) -> Optional[str]: """从本地读取规则包下载链接""" if name not in self.packages: return None - for distribution in self.packages[name]["distributions"]: - if distribution["version"] == version: + package = self.packages[name] + match_version = version or package["latestVersion"] + for distribution in package["distributions"]: + if distribution["version"] == match_version: return distribution["download_url"] def get_hash(self, name: str, version: str) -> Optional[str]: """从本地获取规则包哈希值""" if name not in self.packages: return None - for distribution in self.packages[name]["distributions"]: - if distribution["version"] == version: + package = self.packages[name] + match_version = version or package["latestVersion"] + for distribution in package["distributions"]: + if distribution["version"] == match_version: return distribution["hash"] @property diff --git a/src/ipm/models/lock.py b/src/ipm/models/lock.py index 5a41aaf..af61464 100644 --- a/src/ipm/models/lock.py +++ b/src/ipm/models/lock.py @@ -11,6 +11,7 @@ import tomlkit if TYPE_CHECKING: from ipm.models import ipk from ipm.models.index import Yggdrasil + from ipm.models.ipk import InfiniFrozenPackage class IPMLock(metaclass=ABCMeta): @@ -48,16 +49,18 @@ class PackageLock(IPMLock): super().__init__(source_path=source_path or IPM_PATH) def update_index(self, index: str, uuid: str, lock_path: str) -> bool: - indexes = self._data.get("index", []) + indexes = self._data.get("index", tomlkit.aot()) for i in indexes: if i["uuid"] == uuid: i["url"] = index i["lock"] = lock_path + break else: - aot = tomlkit.aot() - aot.append(tomlkit.item({"url": index, "uuid": uuid, "lock": lock_path})) - self._data.append("index", aot) + indexes.append( + tomlkit.item({"url": index, "uuid": uuid, "lock": lock_path}) + ) self._data["index"] = indexes + self.dump() return True def get_all(self) -> List["Yggdrasil"]: @@ -79,6 +82,10 @@ class PackageLock(IPMLock): return Yggdrasil(i["url"], i["uuid"]) return None + def has_package(self, filename: str): ... + + def add_frozen_package(self, ifp: "InfiniFrozenPackage"): ... + class ProjectLock(IPMLock): """IPM 项目锁""" |
