aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author苏向夜 <fu050409@163.com>2024-03-28 19:30:43 +0800
committer苏向夜 <fu050409@163.com>2024-03-28 19:30:43 +0800
commitcc7779d8821210dcc358992e43a667822afd14db (patch)
treed02e9c500937f30157dedd0deda5618803e9e8d3 /src
parent7e7dbff71bcf05e757c26d621ef2d58679fbf537 (diff)
downloadipm-cc7779d8821210dcc358992e43a667822afd14db.tar.gz
ipm-cc7779d8821210dcc358992e43a667822afd14db.zip
feat(ipk): add methods for global package lock
Diffstat (limited to 'src')
-rw-r--r--src/ipm/models/ipk.py19
-rw-r--r--src/ipm/models/lock.py35
2 files changed, 46 insertions, 8 deletions
diff --git a/src/ipm/models/ipk.py b/src/ipm/models/ipk.py
index 5b327a1..325c7a9 100644
--- a/src/ipm/models/ipk.py
+++ b/src/ipm/models/ipk.py
@@ -4,12 +4,15 @@ from tomlkit.toml_document import TOMLDocument
from ipm.const import INDEX
from ipm.models.index import Yggdrasil
+from ipm.models.lock import PackageLock
from ipm.typing import List, Dict, Literal, StrPath
from ipm.exceptions import ProjectError, TomlLoadFailed
import tomlkit
import abc
+global_lock = PackageLock()
+
class Author:
name: str
@@ -45,10 +48,13 @@ class Requirement:
path: Optional[str] = None,
yggdrasil: Optional[Yggdrasil] = None,
) -> None:
+ yggdrasil = yggdrasil or global_lock.get_yggdrasil_by_index(INDEX)
+ if not yggdrasil:
+ raise ProjectError("未能找到任何世界树地址,请先添加一个世界树地址。")
self.name = name
self.version = version
self.path = path
- self.yggdrasil = yggdrasil or Yggdrasil(INDEX)
+ self.yggdrasil = yggdrasil
def is_local(self) -> bool:
return bool(self.path)
@@ -67,7 +73,7 @@ class Requirements(List[Requirement]):
else:
for key, value in dependency.items():
if key == "index":
- yggdrasil = Yggdrasil(key)
+ yggdrasil = global_lock.get_yggdrasil_by_index(value)
elif key == "yggdrasil":
yggdrasil = (yggdrasils or {}).get(value)
if not yggdrasil:
@@ -228,11 +234,10 @@ class InfiniProject(InfiniPackage):
)
@property
- def yggdrasils(self) -> Dict[str, Yggdrasil]:
- return {
- name: Yggdrasil(index)
- for name, index in self._data.get("yggdrasils", {}).items()
- } or {}
+ def yggdrasils(self) -> Dict[str, str]:
+ res = {name: index for name, index in self._data.get("yggdrasils", {}).items()}
+ res.update({"official": INDEX})
+ return res
@property
def topics(self) -> List[str]:
diff --git a/src/ipm/models/lock.py b/src/ipm/models/lock.py
index 08c02fa..5a41aaf 100644
--- a/src/ipm/models/lock.py
+++ b/src/ipm/models/lock.py
@@ -1,6 +1,6 @@
from pathlib import Path
from abc import ABCMeta
-from typing import Optional
+from typing import List, Optional
from ipm.typing import Dict, StrPath
from ipm.const import IPM_PATH, ATTENTIONS
from tomlkit import TOMLDocument
@@ -10,6 +10,7 @@ import tomlkit
if TYPE_CHECKING:
from ipm.models import ipk
+ from ipm.models.index import Yggdrasil
class IPMLock(metaclass=ABCMeta):
@@ -46,6 +47,38 @@ class PackageLock(IPMLock):
def __init__(self, source_path: Optional[StrPath] = None) -> None:
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", [])
+ for i in indexes:
+ if i["uuid"] == uuid:
+ i["url"] = index
+ i["lock"] = lock_path
+ else:
+ aot = tomlkit.aot()
+ aot.append(tomlkit.item({"url": index, "uuid": uuid, "lock": lock_path}))
+ self._data.append("index", aot)
+ self._data["index"] = indexes
+ return True
+
+ def get_all(self) -> List["Yggdrasil"]:
+ from ipm.models.index import Yggdrasil
+
+ if "index" not in self._data.keys():
+ return []
+ res = []
+ for index in self._data["index"]: # type: ignore
+ res.append(Yggdrasil(index["url"], index["uuid"]))
+ return res
+
+ def get_yggdrasil_by_index(self, index: str) -> Optional["Yggdrasil"]:
+ from ipm.models.index import Yggdrasil
+
+ indexes = self._data.get("index", [])
+ for i in indexes:
+ if i["url"] == index:
+ return Yggdrasil(i["url"], i["uuid"])
+ return None
+
class ProjectLock(IPMLock):
"""IPM 项目锁"""