From ca9844aea09b9850e4c9acd4231e29c91c9098c0 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Fri, 14 Aug 2026 19:12:20 +0000 Subject: [PATCH] =?UTF-8?q?scripts:=20=E2=9A=A1=20Bolt:=20[performance=20i?= =?UTF-8?q?mprovement]=20json=5Foverview=5Fimage=5Finfo:=20optimize=20add?= =?UTF-8?q?=5Fartifact?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Calling `glob` multiple times on a directory with many files incurs unnecessary I/O and CPU overhead. Doing it in a single pass is much faster. Signed-off-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com> Co-authored-by: manupawickramasinghe <73810867+manupawickramasinghe@users.noreply.github.com> --- scripts/json_overview_image_info.py | 15 +++++++++------ scripts/test_json_overview_image_info.py | 9 ++++++--- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/scripts/json_overview_image_info.py b/scripts/json_overview_image_info.py index 795f3f7e25ee76..0b39fd7350e68c 100755 --- a/scripts/json_overview_image_info.py +++ b/scripts/json_overview_image_info.py @@ -33,12 +33,12 @@ def get_initial_output(image_info): # Pre-compile the regex to improve performance when called repeatedly in loops arch_regex = re.compile(r".*Linux-([^.]*)\.") -def add_artifact(artifact, prefix="openwrt-"): - files = list(output_dir.glob(f"{prefix}{artifact}-*")) - if len(files): +def add_artifact(artifact, dir_files, prefix="openwrt-"): + prefix_str = f"{prefix}{artifact}-" + files = [f for f in dir_files if f.startswith(prefix_str)] + if files: output[artifact] = {} for file in files: - file = str(file.name) # Optimization: Use pre-compiled regex for ~50% faster matching arch = arch_regex.match(file) if arch: @@ -106,9 +106,12 @@ def add_artifact(artifact, prefix="openwrt-"): if git_commit.returncode == 0: output["git_commit"] = git_commit.stdout.strip() + import os + dir_files = os.listdir(output_dir) if output_dir.is_dir() else [] + for artifact in "imagebuilder", "sdk", "toolchain": - filename = add_artifact(artifact) - add_artifact("llvm-bpf", prefix="") + filename = add_artifact(artifact, dir_files) + add_artifact("llvm-bpf", dir_files, prefix="") output_path.write_text(json.dumps(output, sort_keys=True, separators=(",", ":"))) else: diff --git a/scripts/test_json_overview_image_info.py b/scripts/test_json_overview_image_info.py index c60279cd9f055f..39da90a65f984f 100644 --- a/scripts/test_json_overview_image_info.py +++ b/scripts/test_json_overview_image_info.py @@ -70,7 +70,8 @@ def test_add_artifact(self): (self.module.output_dir / artifact_name1).touch() (self.module.output_dir / artifact_name2).touch() - self.module.add_artifact("imagebuilder") + dir_files = [f.name for f in self.module.output_dir.iterdir()] + self.module.add_artifact("imagebuilder", dir_files) self.assertIn("imagebuilder", self.module.output) self.assertIn("x86_64", self.module.output["imagebuilder"]) @@ -82,14 +83,16 @@ def test_add_artifact_no_prefix(self): artifact_name = "llvm-bpf-15.0-Linux-x86_64.tar.xz" (self.module.output_dir / artifact_name).touch() - self.module.add_artifact("llvm-bpf", prefix="") + dir_files = [f.name for f in self.module.output_dir.iterdir()] + self.module.add_artifact("llvm-bpf", dir_files, prefix="") self.assertIn("llvm-bpf", self.module.output) self.assertIn("x86_64", self.module.output["llvm-bpf"]) self.assertEqual(self.module.output["llvm-bpf"]["x86_64"], artifact_name) def test_add_artifact_no_match(self): - self.module.add_artifact("sdk") + dir_files = [f.name for f in self.module.output_dir.iterdir()] + self.module.add_artifact("sdk", dir_files) self.assertNotIn("sdk", self.module.output) if __name__ == '__main__':