From 65965204d8dc4de6c09f9e4c9d62ced6cd8bfe99 Mon Sep 17 00:00:00 2001 From: codegen-bot Date: Fri, 14 Mar 2025 22:43:05 +0000 Subject: [PATCH 1/2] CG-11840: Optimize ListDirectoryTool performance using os.listdir() --- .../extensions/tools/list_directory.py | 54 +++++++++++-------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/src/codegen/extensions/tools/list_directory.py b/src/codegen/extensions/tools/list_directory.py index b2668c435..f763f28e9 100644 --- a/src/codegen/extensions/tools/list_directory.py +++ b/src/codegen/extensions/tools/list_directory.py @@ -1,5 +1,6 @@ """Tool for listing directory contents.""" +import os from typing import ClassVar from pydantic import Field @@ -138,32 +139,41 @@ def list_directory(codebase: Codebase, path: str = "./", depth: int = 2) -> List def get_directory_info(dir_obj: Directory, current_depth: int) -> DirectoryInfo: """Helper function to get directory info recursively.""" - # Get direct files (always include files unless at max depth) + # Get direct files using os.listdir instead of dir_obj.files all_files = [] - for file in dir_obj.files(recursive=True): - if file.directory == dir_obj: - all_files.append(file.filepath.split("/")[-1]) + full_path = os.path.join(codebase.workspace_root, dir_obj.dirpath) + + try: + # Get all items in the directory + items = os.listdir(full_path) + + # Filter out directories to get only files + for item in items: + item_path = os.path.join(full_path, item) + if os.path.isfile(item_path): + all_files.append(item) + except (FileNotFoundError, PermissionError) as e: + # Handle potential errors + pass # Get direct subdirectories subdirs = [] - for subdir in dir_obj.subdirectories(recursive=True): - # Only include direct descendants - if subdir.parent == dir_obj: - if current_depth > 1 or current_depth == -1: - # For deeper traversal, get full directory info - new_depth = current_depth - 1 if current_depth > 1 else -1 - subdirs.append(get_directory_info(subdir, new_depth)) - else: - # At max depth, return a leaf node - subdirs.append( - DirectoryInfo( - status="success", - name=subdir.name, - path=subdir.dirpath, - files=None, # Don't include files at max depth - is_leaf=True, - ) + for subdir in dir_obj.subdirectories(recursive=False): # Changed to non-recursive + if current_depth > 1 or current_depth == -1: + # For deeper traversal, get full directory info + new_depth = current_depth - 1 if current_depth > 1 else -1 + subdirs.append(get_directory_info(subdir, new_depth)) + else: + # At max depth, return a leaf node + subdirs.append( + DirectoryInfo( + status="success", + name=subdir.name, + path=subdir.dirpath, + files=None, # Don't include files at max depth + is_leaf=True, ) + ) return DirectoryInfo( status="success", @@ -177,4 +187,4 @@ def get_directory_info(dir_obj: Directory, current_depth: int) -> DirectoryInfo: return ListDirectoryObservation( status="success", directory_info=dir_info, - ) + ) \ No newline at end of file From 84267491bec7bc2d7ac2740a637489ce3cab98b0 Mon Sep 17 00:00:00 2001 From: "codegen-sh[bot]" <131295404+codegen-sh[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 22:43:55 +0000 Subject: [PATCH 2/2] Automated pre-commit update --- src/codegen/extensions/tools/list_directory.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/codegen/extensions/tools/list_directory.py b/src/codegen/extensions/tools/list_directory.py index f763f28e9..6d96d9f22 100644 --- a/src/codegen/extensions/tools/list_directory.py +++ b/src/codegen/extensions/tools/list_directory.py @@ -142,11 +142,11 @@ def get_directory_info(dir_obj: Directory, current_depth: int) -> DirectoryInfo: # Get direct files using os.listdir instead of dir_obj.files all_files = [] full_path = os.path.join(codebase.workspace_root, dir_obj.dirpath) - + try: # Get all items in the directory items = os.listdir(full_path) - + # Filter out directories to get only files for item in items: item_path = os.path.join(full_path, item) @@ -187,4 +187,4 @@ def get_directory_info(dir_obj: Directory, current_depth: int) -> DirectoryInfo: return ListDirectoryObservation( status="success", directory_info=dir_info, - ) \ No newline at end of file + )