|
7 | 7 | import os
|
8 | 8 | import typing as t # noqa: WPS111
|
9 | 9 | from contextlib import contextmanager, suppress
|
| 10 | +from functools import partial |
10 | 11 | from pathlib import Path
|
11 | 12 | from shutil import copytree
|
12 | 13 | from sys import version_info as _python_version_tuple
|
@@ -192,12 +193,44 @@ def _get_sanitized_long_description(self): # noqa: WPS430
|
192 | 193 | _DistutilsDistributionMetadata.get_long_description = orig_func
|
193 | 194 |
|
194 | 195 |
|
| 196 | +def _exclude_dir_path( |
| 197 | + excluded_dir_path: Path, |
| 198 | + visited_directory: str, |
| 199 | + _visited_dir_contents: list[str], |
| 200 | +) -> list[str]: |
| 201 | + """Prevent recursive directory traversal.""" |
| 202 | + # This stops the temporary directory from being copied |
| 203 | + # into self recursively forever. |
| 204 | + # Ref: https://github.com/aio-libs/yarl/issues/992 |
| 205 | + visited_directory_subdirs_to_ignore = [ |
| 206 | + subdir |
| 207 | + for subdir in _visited_dir_contents |
| 208 | + if excluded_dir_path == Path(visited_directory) / subdir |
| 209 | + ] |
| 210 | + if visited_directory_subdirs_to_ignore: |
| 211 | + print( |
| 212 | + f'Preventing `{excluded_dir_path !s}` from being ' |
| 213 | + 'copied into itself recursively...', |
| 214 | + file=_standard_error_stream, |
| 215 | + ) |
| 216 | + return visited_directory_subdirs_to_ignore |
| 217 | + |
| 218 | + |
195 | 219 | @contextmanager
|
196 | 220 | def _in_temporary_directory(src_dir: Path) -> t.Iterator[None]:
|
197 | 221 | with TemporaryDirectory(prefix='.tmp-ansible-pylibssh-pep517-') as tmp_dir:
|
| 222 | + tmp_dir_path = Path(tmp_dir) |
| 223 | + root_tmp_dir_path = tmp_dir_path.parent |
| 224 | + _exclude_tmpdir_parent = partial(_exclude_dir_path, root_tmp_dir_path) |
| 225 | + |
198 | 226 | with chdir_cm(tmp_dir):
|
199 |
| - tmp_src_dir = Path(tmp_dir) / 'src' |
200 |
| - copytree(src_dir, tmp_src_dir, symlinks=True) |
| 227 | + tmp_src_dir = tmp_dir_path / 'src' |
| 228 | + copytree( |
| 229 | + src_dir, |
| 230 | + tmp_src_dir, |
| 231 | + ignore=_exclude_tmpdir_parent, |
| 232 | + symlinks=True, |
| 233 | + ) |
201 | 234 | os.chdir(tmp_src_dir)
|
202 | 235 | yield
|
203 | 236 |
|
|
0 commit comments