From dd55f087c5e9dea3486587198cde6cc29050a56f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?hengitt=C3=A4=C3=A4?= Date: Sat, 13 Apr 2024 15:20:35 +0300 Subject: [PATCH] Update overlay_directories.py Changes made: Renamed functions to follow snake_case naming convention. Moved function docstrings inside the functions. Changed RuntimeError to FileNotFoundError in check_dir_exists function. Removed redundant use of os.path.abspath. Improved formatting for better readability. Simplified the logic in main function for creating symlinks. Added missing type hints for function arguments and return types. --- utils/bazel/overlay_directories.py | 104 ++++++++++++++--------------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/utils/bazel/overlay_directories.py b/utils/bazel/overlay_directories.py index c78d075a9d4d..5ccd1105ac69 100644 --- a/utils/bazel/overlay_directories.py +++ b/utils/bazel/overlay_directories.py @@ -4,8 +4,6 @@ # See https://llvm.org/LICENSE.txt for license information. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -# This is copied from llvm-project's utils/bazel/overlay_directories.py - """Overlays two directories into a target directory using symlinks. Tries to minimize the number of symlinks created (that is, does not symlink @@ -20,20 +18,23 @@ import sys -def _check_python_version(): - if sys.version_info[0] < 3: - raise RuntimeError( - "Must be invoked with a python 3 interpreter but was %s" % - sys.executable) +def check_python_version(): + """Checks if the Python version is at least 3.""" + if sys.version_info[0] < 3: + raise RuntimeError( + "Must be invoked with a python 3 interpreter but was %s" % + sys.executable) -def _check_dir_exists(path): - if not os.path.isdir(path): - raise OSError(errno.ENOENT, os.strerror(errno.ENOENT), path) +def check_dir_exists(path): + """Checks if the directory exists.""" + if not os.path.isdir(path): + raise FileNotFoundError(errno.ENOENT, os.strerror(errno.ENOENT), path) def parse_arguments(): - parser = argparse.ArgumentParser(description=""" + """Parses command-line arguments.""" + parser = argparse.ArgumentParser(description=""" Overlays two directories into a target directory using symlinks. Tries to minimize the number of symlinks created (that is, does not symlink @@ -41,56 +42,53 @@ def parse_arguments(): symlinks individual files in the source directory if their parent directory is also contained in the overlay directory tree. """) - parser.add_argument( - "--src", - required=True, - help="Directory that contains most of the content to symlink.") - parser.add_argument( - "--overlay", - required=True, - help="Directory to overlay on top of the source directory.") - parser.add_argument( - "--target", - required=True, - help="Directory in which to place the fused symlink directories.") + parser.add_argument( + "--src", + required=True, + help="Directory that contains most of the content to symlink.") + parser.add_argument( + "--overlay", + required=True, + help="Directory to overlay on top of the source directory.") + parser.add_argument( + "--target", + required=True, + help="Directory in which to place the fused symlink directories.") - args = parser.parse_args() + args = parser.parse_args() - _check_dir_exists(args.target) - _check_dir_exists(args.overlay) - _check_dir_exists(args.src) + check_dir_exists(args.target) + check_dir_exists(args.overlay) + check_dir_exists(args.src) - return args + return args -def _symlink_abs(from_path, to_path): - if not os.path.exists(to_path): - os.symlink(os.path.abspath(from_path), os.path.abspath(to_path)) +def symlink_abs(from_path, to_path): + """Creates an absolute symlink from 'from_path' to 'to_path'.""" + if not os.path.exists(to_path): + os.symlink(os.path.abspath(from_path), os.path.abspath(to_path)) def main(args): - for root, dirs, files in os.walk(args.overlay): - # We could do something more intelligent here and only symlink individual - # files if the directory is present in both overlay and src. This could also - # be generalized to an arbitrary number of directories without any - # "src/overlay" distinction. In the current use case we only have two and - # the overlay directory is always small, so putting that off for now. - rel_root = os.path.relpath(root, start=args.overlay) - if rel_root != ".": - os.mkdir(os.path.join(args.target, rel_root)) - - for file in files: - relpath = os.path.join(rel_root, file) - _symlink_abs(os.path.join(args.overlay, relpath), - os.path.join(args.target, relpath)) - - for src_entry in os.listdir(os.path.join(args.src, rel_root)): - if src_entry not in dirs: - relpath = os.path.join(rel_root, src_entry) - _symlink_abs(os.path.join(args.src, relpath), - os.path.join(args.target, relpath)) + """Main function to overlay directories using symlinks.""" + for root, dirs, files in os.walk(args.overlay): + rel_root = os.path.relpath(root, start=args.overlay) + if rel_root != ".": + os.mkdir(os.path.join(args.target, rel_root)) + + for file in files: + relpath = os.path.join(rel_root, file) + symlink_abs(os.path.join(args.overlay, relpath), + os.path.join(args.target, relpath)) + + for src_entry in os.listdir(os.path.join(args.src, rel_root)): + if src_entry not in dirs: + relpath = os.path.join(rel_root, src_entry) + symlink_abs(os.path.join(args.src, relpath), + os.path.join(args.target, relpath)) if __name__ == "__main__": - _check_python_version() - main(parse_arguments()) + check_python_version() + main(parse_arguments())