aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-03-28 22:24:29 +0800
committer苏向夜 <fu050409@163.com>2024-03-28 22:24:29 +0800
commit4cedc7b331f100b7dd04c98bc50a681a24389682 (patch)
tree273ebd43029b09d57c5cd4a1853d4bf0222bcc5f
parentabbcddf3fababd59f60193eaa7d787f32f5060e7 (diff)
downloadipm-4cedc7b331f100b7dd04c98bc50a681a24389682.tar.gz
ipm-4cedc7b331f100b7dd04c98bc50a681a24389682.zip
feat(lock): fix lock file path
-rw-r--r--src/ipm/models/index.py27
-rw-r--r--src/ipm/models/lock.py15
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 项目锁"""