From c5949de543bbf201c0e935ef81024deca8024e3c Mon Sep 17 00:00:00 2001 From: Peter Eisenmann Date: Fri, 29 Mar 2024 01:52:53 +0100 Subject: [PATCH] gir: only initialize search paths once --- blueprintcompiler/gir.py | 47 ++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/blueprintcompiler/gir.py b/blueprintcompiler/gir.py index a33bb26..f4bf4e3 100644 --- a/blueprintcompiler/gir.py +++ b/blueprintcompiler/gir.py @@ -35,6 +35,10 @@ _namespace_cache: T.Dict[str, "Namespace"] = {} _xml_cache = {} _user_search_paths = [] +_typelib_search_paths_initalized: bool = False +_typelib_search_paths: list[str] = [] +_gir_search_paths_initalized: bool = False +_gir_search_paths: list[str] = [] def add_user_typelib_paths(paths: list): @@ -42,13 +46,39 @@ def add_user_typelib_paths(paths: list): _user_search_paths += paths +def collect_typelib_search_paths(): + global _typelib_search_paths_initalized + if _typelib_search_paths_initalized: + return + + global _typelib_search_paths + _typelib_search_paths += [ + *_user_search_paths, + *GIRepository.Repository.get_search_path(), + ] + _typelib_search_paths_initalized = True + + +def collect_gir_search_paths(): + global _gir_search_paths_initalized + if _gir_search_paths_initalized: + return + + global _gir_search_paths + if data_paths := os.environ.get("XDG_DATA_DIRS"): + _gir_search_paths += [ + os.path.join(path, "gir-1.0") for path in data_paths.split(os.pathsep) + ] + _gir_search_paths_initalized = True + + def get_namespace(namespace: str, version: str) -> "Namespace": - search_paths = [*GIRepository.Repository.get_search_path(), *_user_search_paths] + collect_typelib_search_paths() filename = f"{namespace}-{version}.typelib" if filename not in _namespace_cache: - for search_path in search_paths: + for search_path in _typelib_search_paths: path = os.path.join(search_path, filename) if os.path.exists(path) and os.path.isfile(path): @@ -61,7 +91,7 @@ def get_namespace(namespace: str, version: str) -> "Namespace": if filename not in _namespace_cache: raise CompileError( f"Namespace {namespace}-{version} could not be found", - hints=["search path: " + os.pathsep.join(search_paths)], + hints=["search path: " + os.pathsep.join(_typelib_search_paths)], ) return _namespace_cache[filename] @@ -94,17 +124,12 @@ def get_available_namespaces() -> T.List[T.Tuple[str, str]]: def get_xml(namespace: str, version: str): - search_paths = [] - - if data_paths := os.environ.get("XDG_DATA_DIRS"): - search_paths += [ - os.path.join(path, "gir-1.0") for path in data_paths.split(os.pathsep) - ] + collect_gir_search_paths() filename = f"{namespace}-{version}.gir" if filename not in _xml_cache: - for search_path in search_paths: + for search_path in _gir_search_paths: path = os.path.join(search_path, filename) if os.path.exists(path) and os.path.isfile(path): @@ -114,7 +139,7 @@ def get_xml(namespace: str, version: str): if filename not in _xml_cache: raise CompileError( f"GObject introspection file '{namespace}-{version}.gir' could not be found", - hints=["search path: " + os.pathsep.join(search_paths)], + hints=["search path: " + os.pathsep.join(_gir_search_paths)], ) return _xml_cache[filename]