@@ -1301,17 +1301,33 @@ def copy(self, target, **kwargs):
13011301 target ._copy_from (self , ** kwargs )
13021302 return target .joinpath () # Empty join to ensure fresh metadata.
13031303
1304- def copy_into (self , target_dir , ** kwargs ):
1304+ def copy_into (self , target_dir , exist_ok = True , ** kwargs ):
13051305 """
13061306 Copy this file or directory tree into the given existing directory.
13071307 """
13081308 name = self .name
13091309 if not name :
13101310 raise ValueError (f"{ self !r} has an empty name" )
1311- elif hasattr (target_dir , 'with_segments' ):
1312- target = target_dir / name
1313- else :
1314- target = self .with_segments (target_dir , name )
1311+
1312+ target = (target_dir / name ) if hasattr (target_dir , "with_segments" ) \
1313+ else self .with_segments (target_dir , name )
1314+
1315+ if self .info .is_file ():
1316+ if not exist_ok and target .info .is_file ():
1317+ raise FileExistsError (EEXIST , "File exists" , str (target ))
1318+ return self .copy (target , ** kwargs )
1319+
1320+ if self .info .is_dir ():
1321+ if target .info .exists () and target .info .is_dir ():
1322+ if not exist_ok :
1323+ raise FileExistsError (EEXIST , "File exists" , str (target ))
1324+
1325+ for child in self .iterdir ():
1326+ child .copy_into (target , exist_ok = exist_ok , ** kwargs )
1327+ return target .joinpath ()
1328+
1329+ return self .copy (target , ** kwargs )
1330+
13151331 return self .copy (target , ** kwargs )
13161332
13171333 def _copy_from (self , source , follow_symlinks = True , preserve_metadata = False ):
0 commit comments