Skip to content

Commit e2ab601

Browse files
committed
Extracted _copy_one function.
1 parent f2157f5 commit e2ab601

File tree

1 file changed

+65
-47
lines changed

1 file changed

+65
-47
lines changed

distutils/dir_util.py

Lines changed: 65 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import os
88
import pathlib
99

10+
from . import file_util
1011
from ._log import log
1112
from .errors import DistutilsFileError, DistutilsInternalError
1213

@@ -98,7 +99,7 @@ def create_tree(base_dir, files, mode=0o777, verbose=True, dry_run=False):
9899
mkpath(dir, mode, verbose=verbose, dry_run=dry_run)
99100

100101

101-
def copy_tree( # noqa: C901
102+
def copy_tree(
102103
src,
103104
dst,
104105
preserve_mode=True,
@@ -127,8 +128,6 @@ def copy_tree( # noqa: C901
127128
(the default), the destination of the symlink will be copied.
128129
'update' and 'verbose' are the same as for 'copy_file'.
129130
"""
130-
from distutils.file_util import copy_file
131-
132131
if not dry_run and not os.path.isdir(src):
133132
raise DistutilsFileError(f"cannot copy tree '{src}': not a directory")
134133
try:
@@ -142,50 +141,69 @@ def copy_tree( # noqa: C901
142141
if not dry_run:
143142
mkpath(dst, verbose=verbose)
144143

145-
outputs = []
146-
147-
for n in names:
148-
src_name = os.path.join(src, n)
149-
dst_name = os.path.join(dst, n)
150-
151-
if n.startswith('.nfs'):
152-
# skip NFS rename files
153-
continue
154-
155-
if preserve_symlinks and os.path.islink(src_name):
156-
link_dest = os.readlink(src_name)
157-
if verbose >= 1:
158-
log.info("linking %s -> %s", dst_name, link_dest)
159-
if not dry_run:
160-
os.symlink(link_dest, dst_name)
161-
outputs.append(dst_name)
162-
163-
elif os.path.isdir(src_name):
164-
outputs.extend(
165-
copy_tree(
166-
src_name,
167-
dst_name,
168-
preserve_mode,
169-
preserve_times,
170-
preserve_symlinks,
171-
update,
172-
verbose=verbose,
173-
dry_run=dry_run,
174-
)
175-
)
176-
else:
177-
copy_file(
178-
src_name,
179-
dst_name,
180-
preserve_mode,
181-
preserve_times,
182-
update,
183-
verbose=verbose,
184-
dry_run=dry_run,
185-
)
186-
outputs.append(dst_name)
187-
188-
return outputs
144+
copy_one = functools.partial(
145+
_copy_one,
146+
src=src,
147+
dst=dst,
148+
preserve_symlinks=preserve_symlinks,
149+
verbose=verbose,
150+
dry_run=dry_run,
151+
preserve_mode=preserve_mode,
152+
preserve_times=preserve_times,
153+
update=update,
154+
)
155+
return list(itertools.chain.from_iterable(map(copy_one, names)))
156+
157+
158+
def _copy_one(
159+
name,
160+
*,
161+
src,
162+
dst,
163+
preserve_symlinks,
164+
verbose,
165+
dry_run,
166+
preserve_mode,
167+
preserve_times,
168+
update,
169+
):
170+
src_name = os.path.join(src, name)
171+
dst_name = os.path.join(dst, name)
172+
173+
if name.startswith('.nfs'):
174+
# skip NFS rename files
175+
return
176+
177+
if preserve_symlinks and os.path.islink(src_name):
178+
link_dest = os.readlink(src_name)
179+
if verbose >= 1:
180+
log.info("linking %s -> %s", dst_name, link_dest)
181+
if not dry_run:
182+
os.symlink(link_dest, dst_name)
183+
yield dst_name
184+
185+
elif os.path.isdir(src_name):
186+
yield from copy_tree(
187+
src_name,
188+
dst_name,
189+
preserve_mode,
190+
preserve_times,
191+
preserve_symlinks,
192+
update,
193+
verbose=verbose,
194+
dry_run=dry_run,
195+
)
196+
else:
197+
file_util.copy_file(
198+
src_name,
199+
dst_name,
200+
preserve_mode,
201+
preserve_times,
202+
update,
203+
verbose=verbose,
204+
dry_run=dry_run,
205+
)
206+
yield dst_name
189207

190208

191209
def _build_cmdtuple(path, cmdtuples):

0 commit comments

Comments
 (0)