Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update overlay_directories.py #3158

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 51 additions & 53 deletions utils/bazel/overlay_directories.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -20,77 +18,77 @@
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():
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd stick to what's used in llvm here, as it makes "syncing" with upstream changes easier.

https://sourcegraph.com/github.com/llvm/llvm-project@main/-/blob/utils/bazel/overlay_directories.py

"""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
every single file). Symlinks every file in the overlay directory. Only
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):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

"""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))
Comment on lines +74 to +89
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Any changes other than indentation here? I tried squinting but couldn't find.



if __name__ == "__main__":
_check_python_version()
main(parse_arguments())
check_python_version()
main(parse_arguments())
Loading