@@ -579,6 +579,48 @@ def _filter(src, names):
579579 shutil .rmtree (src_dir )
580580 shutil .rmtree (os .path .dirname (dst_dir ))
581581
582+ def test_copytree_arg_types_of_ignore (self ):
583+ join = os .path .join
584+ exists = os .path .exists
585+
586+ tmp_dir = self .mkdtemp ()
587+ src_dir = join (tmp_dir , "source" )
588+
589+ os .mkdir (join (src_dir ))
590+ os .mkdir (join (src_dir , 'test_dir' ))
591+ os .mkdir (os .path .join (src_dir , 'test_dir' , 'subdir' ))
592+ write_file ((src_dir , 'test_dir' , 'subdir' , 'test.txt' ), '456' )
593+
594+ invokations = []
595+
596+ def _ignore (src , names ):
597+ invokations .append (src )
598+ self .assertIsInstance (src , str )
599+ self .assertIsInstance (names , list )
600+ self .assertEqual (len (names ), len (set (names )))
601+ for name in names :
602+ self .assertIsInstance (name , str )
603+ return []
604+
605+ dst_dir = join (self .mkdtemp (), 'destination' )
606+ shutil .copytree (src_dir , dst_dir , ignore = _ignore )
607+ self .assertTrue (exists (join (dst_dir , 'test_dir' , 'subdir' ,
608+ 'test.txt' )))
609+
610+ dst_dir = join (self .mkdtemp (), 'destination' )
611+ shutil .copytree (pathlib .Path (src_dir ), dst_dir , ignore = _ignore )
612+ self .assertTrue (exists (join (dst_dir , 'test_dir' , 'subdir' ,
613+ 'test.txt' )))
614+
615+ dst_dir = join (self .mkdtemp (), 'destination' )
616+ src_dir_entry = list (os .scandir (tmp_dir ))[0 ]
617+ self .assertIsInstance (src_dir_entry , os .DirEntry )
618+ shutil .copytree (src_dir_entry , dst_dir , ignore = _ignore )
619+ self .assertTrue (exists (join (dst_dir , 'test_dir' , 'subdir' ,
620+ 'test.txt' )))
621+
622+ self .assertEqual (len (invokations ), 9 )
623+
582624 def test_copytree_retains_permissions (self ):
583625 tmp_dir = self .mkdtemp ()
584626 src_dir = os .path .join (tmp_dir , 'source' )
0 commit comments