7
7
import os
8
8
import pathlib
9
9
10
+ from . import file_util
10
11
from ._log import log
11
12
from .errors import DistutilsFileError , DistutilsInternalError
12
13
@@ -98,7 +99,7 @@ def create_tree(base_dir, files, mode=0o777, verbose=True, dry_run=False):
98
99
mkpath (dir , mode , verbose = verbose , dry_run = dry_run )
99
100
100
101
101
- def copy_tree ( # noqa: C901
102
+ def copy_tree (
102
103
src ,
103
104
dst ,
104
105
preserve_mode = True ,
@@ -127,8 +128,6 @@ def copy_tree( # noqa: C901
127
128
(the default), the destination of the symlink will be copied.
128
129
'update' and 'verbose' are the same as for 'copy_file'.
129
130
"""
130
- from distutils .file_util import copy_file
131
-
132
131
if not dry_run and not os .path .isdir (src ):
133
132
raise DistutilsFileError (f"cannot copy tree '{ src } ': not a directory" )
134
133
try :
@@ -142,50 +141,69 @@ def copy_tree( # noqa: C901
142
141
if not dry_run :
143
142
mkpath (dst , verbose = verbose )
144
143
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
189
207
190
208
191
209
def _build_cmdtuple (path , cmdtuples ):
0 commit comments