From 54c2fdc37d4bc00f999fb12c4e8bc4a77b8bec6b Mon Sep 17 00:00:00 2001 From: wep21 Date: Fri, 23 Jan 2026 22:13:55 +0900 Subject: [PATCH 1/2] use cache for additional packages xml Signed-off-by: wep21 --- vinca/distro.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/vinca/distro.py b/vinca/distro.py index 83e25d6..c70c8aa 100644 --- a/vinca/distro.py +++ b/vinca/distro.py @@ -38,6 +38,10 @@ def __init__( self._python_version = index.distributions[distro_name]["python_version"] self.build_packages = set() + # simple caches to avoid repeatedly fetching/processing the same data + self._additional_xml_cache = {} + self._depends_cache = {} + os.environ["ROS_VERSION"] = "1" if self.check_ros1() else "2" @property @@ -50,6 +54,10 @@ def add_packages(self, packages): def get_depends(self, pkg, ignore_pkgs=None): dependencies = set() + cache_key = (pkg, tuple(sorted(ignore_pkgs)) if ignore_pkgs else None) + if cache_key in self._depends_cache: + return set(self._depends_cache[cache_key]) + if not self.check_package(pkg): print(f"{pkg} not in available packages anymore") return dependencies @@ -89,6 +97,7 @@ def get_depends(self, pkg, ignore_pkgs=None): if ignore_pkgs and dep in ignore_pkgs: continue dependencies |= self.get_depends(dep, ignore_pkgs=ignore_pkgs) + self._depends_cache[cache_key] = set(dependencies) return dependencies # If the package is from upstream rosdistro, use the walker to get dependencies @@ -106,6 +115,7 @@ def get_depends(self, pkg, ignore_pkgs=None): ros_packages_only=True, ignore_pkgs=ignore_pkgs, ) + self._depends_cache[cache_key] = set(dependencies) return dependencies def get_released_repo(self, pkg_name): @@ -195,8 +205,13 @@ def get_package_xml_for_additional_package(self, pkg_info): if additional_folder != "": additional_folder = additional_folder + "/" raw_url = f"https://raw.githubusercontent.com/{owner_repo}/{ref}/{additional_folder}{xml_name}" + if raw_url in self._additional_xml_cache: + return self._additional_xml_cache[raw_url] + try: with urllib.request.urlopen(raw_url) as resp: - return resp.read().decode("utf-8") + xml_content = resp.read().decode('utf-8') + self._additional_xml_cache[raw_url] = xml_content + return xml_content except Exception as e: raise RuntimeError(f"Failed to fetch package.xml from {raw_url}: {e}") From 82f179f81ffa5e0b28ac1b3286475a3ae924aad7 Mon Sep 17 00:00:00 2001 From: wep21 Date: Sat, 24 Jan 2026 00:19:20 +0900 Subject: [PATCH 2/2] format Signed-off-by: wep21 --- vinca/distro.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vinca/distro.py b/vinca/distro.py index c70c8aa..84fcade 100644 --- a/vinca/distro.py +++ b/vinca/distro.py @@ -210,7 +210,7 @@ def get_package_xml_for_additional_package(self, pkg_info): try: with urllib.request.urlopen(raw_url) as resp: - xml_content = resp.read().decode('utf-8') + xml_content = resp.read().decode("utf-8") self._additional_xml_cache[raw_url] = xml_content return xml_content except Exception as e: