Fixed #1540112: now shutil.copytree will let you provide your own copy() function

This commit is contained in:
Tarek Ziadé 2010-04-19 22:30:51 +00:00
parent 5fb313bb04
commit 5340db3803
4 changed files with 51 additions and 27 deletions

View file

@ -147,8 +147,8 @@ def ignore_patterns(*patterns):
return set(ignored_names)
return _ignore_patterns
def copytree(src, dst, symlinks=False, ignore=None):
"""Recursively copy a directory tree using copy2().
def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2):
"""Recursively copy a directory tree.
The destination directory must not already exist.
If exception(s) occur, an Error is raised with a list of reasons.
@ -170,7 +170,10 @@ def copytree(src, dst, symlinks=False, ignore=None):
list of names relative to the `src` directory that should
not be copied.
XXX Consider this example code rather than the ultimate tool.
The optional copy_function argument is a callable that will be used
to copy each file. It will be called with the source path and the
destination path as arguments. By default, copy2() is used, but any
function that supports the same signature (like copy()) can be used.
"""
names = os.listdir(src)
@ -191,10 +194,10 @@ def copytree(src, dst, symlinks=False, ignore=None):
linkto = os.readlink(srcname)
os.symlink(linkto, dstname)
elif os.path.isdir(srcname):
copytree(srcname, dstname, symlinks, ignore)
copytree(srcname, dstname, symlinks, ignore, copy_function)
else:
# Will raise a SpecialFileError for unsupported file types
copy2(srcname, dstname)
copy_function(srcname, dstname)
# catch the Error from the recursive copytree so that we can
# continue with other files
except Error as err: