complete pkg_system basic design and impl

This commit is contained in:
Liu Zhicong
2023-08-16 20:06:09 -07:00
parent 3d8f6fd5c8
commit 6b39379d7c
10 changed files with 554 additions and 76 deletions
+50 -38
View File
@@ -7,7 +7,6 @@ from .installer import pkg_installer
logger = logging.getLogger(__name__)
#pkg_env_mgr,以cfg_path为key管理多个pkg_env,是个单件
class pkg_env_mgr:
_instance = None
def __new__(cls):
@@ -17,6 +16,7 @@ class pkg_env_mgr:
def __init__(self) -> None:
self._pkg_envs = {}
pass
def get_env(self,cfg_path:str) -> pkg_env:
@@ -34,60 +34,70 @@ class pkg_env_mgr:
pass
class pkg_env:
def __init__(self,cfg_path:str,inheritance = True) -> None:
self.prefixs : list[str]= []
def __init__(self,cfg_path:str) -> None:
self.pkg_dir : str = ""
self.pkg_obj_dir : str = ""
self.is_strict : bool = True
self.parent_envs : list[pkg_env] = [pkg_env_mgr().get_user_env()]
self.parent_envs : list[pkg_env] = None
self.index_dbs = None
self.cfg_path = cfg_path
self._load_pkg_cfg(cfg_path)
pass
def load(self,pkg_name:str,cid:None) -> pkg_media_info:
def load(self,pkg_name:str,search_parent=True) -> pkg_media_info:
pkg_path = None
pkg_id,verion_str,cid = pkg_info.parse_pkg_name(pkg_name)
if cid is None:
#lookup pkg's cid from indexDb
pkg_id,verion_str,cid = pkg_info.parse_pkg_name(pkg_name)
if cid is None:
#lookup include pkg-index-db search
pkg_info = self.lookup(pkg_id,verion_str)
if pkg_info is not None:
return self.load(pkg_id,pkg_info.cid)
if self.is_strict is False:
#load pkg not in index-db, easy for debug
for prefix in self.prefixs:
fullpath = prefix + pkg_name
logger.debug("try load {pkg_name} at {fullpath} ...")
if pkg_env.is_valied_media(fullpath):
return self.load_pkg_media_info(fullpath)
logger.warn(f"load {pkg_name} failed: pkg not found in index-db and pkg_dirs")
return None
if verion_str is None:
channel = self.get_pkg_channel_from_version(verion_str)
if channel is None:
pkg_path = f"{self.pkg_dir}{pkg_id}"
else:
pkg_path = f"{self.pkg_dir}{pkg_id}#{channel}"
else:
#got cid here~
return self.load(pkg_id,cid)
channel = self.get_pkg_channel_from_version(verion_str)
the_version = self.get_exact_version_from_installed(verion_str)
if the_version is None:
logger.warn(f"load {pkg_name} failed: no match version from {verion_str}")
return None
if channel is None:
pkg_path = f"{self.pkg_dir}{pkg_id}#{the_version}"
else:
pkg_path = f"{self.pkg_dir}{pkg_id}#{channel}#{the_version}"
else:
#search pkg_id#cid and load pkg_media_info
for prefix in self.prefixs:
fullpath =f"{prefix}{pkg_id}#{cid}"
logger.debug(f"try load {pkg_name} from {fullpath}")
if pkg_env.is_valied_media(fullpath):
media_info = self.load_pkg_media_info(fullpath)
return media_info
logger.warn(f"load {pkg_id}#{cid} error,not found")
pkg_path = f"{self.pkg_obj_dir}.{pkg_id}/{cid}"
media_info = self.try_load_pkg_media_info(pkg_id,pkg_path)
if media_info is None:
if search_parent:
for parent_env in self.parent_envs:
media_info = parent_env.load(pkg_id,cid,False)
if media_info is not None:
return media_info
logger.warn(f"load {pkg_id}#{cid} error,not found ,search_parent={search_parent}")
return None
def get_exact_version_from_installed(self,verion_str:str) -> str:
pass
def get_pkg_channel_from_version(self,pkg_version:str) -> str:
pass
def get_pkg_media_info(self,pkg_name:str)->pkg_media_info:
pass
def load_pkg_media_info(self,pkg_full_path:str) -> pkg_media_info:
def try_load_pkg_media_info(self,pkg_full_path:str) -> pkg_media_info:
pass
def get_installed_pkg_info(self,pkg_name:str) -> pkg_info:
pass
def lookup(self,pkg_id:str,version_str:str) -> pkg_info:
# to make sure pkg.cid is correct, we MUST verfiy eveything here
pass
def get_installer(self) -> pkg_installer:
@@ -96,7 +106,9 @@ class pkg_env:
@classmethod
def is_valied_media(pkg_full_path:str) -> bool:
pass
def do_pkg_media_trans(self,pkg_info:pkg_info,source_path:str,target_path:str) -> bool:
pass
def _load_pkg_cfg(self,cfg_path:str):
if cfg_path is None: