Skip to content

Commit 6f5ebb8

Browse files
committed
Speed up metadata handling
1 parent e688be8 commit 6f5ebb8

File tree

1 file changed

+20
-12
lines changed

1 file changed

+20
-12
lines changed

Lib/pathlib/_abc.py

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def copy(self, source, target):
142142
if self.preserve_metadata:
143143
metadata_keys = source._readable_metadata & target._writable_metadata
144144
else:
145-
metadata_keys = frozenset()
145+
metadata_keys = None
146146
if not self.follow_symlinks and source.is_symlink():
147147
self.copy_symlink(source, target, metadata_keys)
148148
elif source.is_dir():
@@ -152,7 +152,10 @@ def copy(self, source, target):
152152

153153
def copy_dir(self, source, target, metadata_keys, dir_entry=None):
154154
"""Copy the given directory to the given target."""
155-
metadata = source._read_metadata(metadata_keys, dir_entry=dir_entry)
155+
if metadata_keys:
156+
metadata = source._read_metadata(metadata_keys, dir_entry=dir_entry)
157+
else:
158+
metadata = None
156159
with source.scandir() as entries:
157160
target.mkdir(exist_ok=self.dirs_exist_ok)
158161
for entry in entries:
@@ -164,12 +167,16 @@ def copy_dir(self, source, target, metadata_keys, dir_entry=None):
164167
self.copy_dir(src, dst, metadata_keys, entry)
165168
else:
166169
self.copy_file(src, dst, metadata_keys, entry)
167-
target._write_metadata(metadata)
170+
if metadata:
171+
target._write_metadata(metadata)
168172

169173
def copy_file(self, source, target, metadata_keys, dir_entry=None):
170174
"""Copy the given file to the given target."""
171175
self.ensure_different_files(source, target)
172-
metadata = source._read_metadata(metadata_keys, dir_entry=dir_entry)
176+
if metadata_keys:
177+
metadata = source._read_metadata(metadata_keys, dir_entry=dir_entry)
178+
else:
179+
metadata = None
173180
with source.open('rb') as source_f:
174181
try:
175182
with target.open('wb') as target_f:
@@ -181,14 +188,19 @@ def copy_file(self, source, target, metadata_keys, dir_entry=None):
181188
f'Directory does not exist: {target}') from e
182189
else:
183190
raise
184-
target._write_metadata(metadata)
191+
if metadata:
192+
target._write_metadata(metadata)
185193

186194
def copy_symlink(self, source, target, metadata_keys, dir_entry=None):
187195
"""Copy the given symlink to the given target."""
188-
metadata = source._read_metadata(
189-
metadata_keys, follow_symlinks=False, dir_entry=dir_entry)
196+
if metadata_keys:
197+
metadata = source._read_metadata(
198+
metadata_keys, follow_symlinks=False, dir_entry=dir_entry)
199+
else:
200+
metadata = None
190201
target.symlink_to(source.readlink())
191-
target._write_metadata(metadata, follow_symlinks=False)
202+
if metadata:
203+
target._write_metadata(metadata, follow_symlinks=False)
192204

193205

194206
class PathGlobber(_GlobberBase):
@@ -893,16 +905,12 @@ def _read_metadata(self, metadata_keys, *, follow_symlinks=True, dir_entry=None)
893905
"""
894906
Returns path metadata as a dict with string keys.
895907
"""
896-
if not metadata_keys:
897-
return {}
898908
raise UnsupportedOperation(self._unsupported_msg('_read_metadata()'))
899909

900910
def _write_metadata(self, metadata, *, follow_symlinks=True):
901911
"""
902912
Sets path metadata from the given dict with string keys.
903913
"""
904-
if not metadata:
905-
return
906914
raise UnsupportedOperation(self._unsupported_msg('_write_metadata()'))
907915

908916
def copy(self, target, *, follow_symlinks=True, dirs_exist_ok=False,

0 commit comments

Comments
 (0)