in aws_lambda_builders/utils.py [0:0]
def copytree(source, destination, ignore=None):
"""
Similar to shutil.copytree except that it removes the limitation that the destination directory should
be present.
:type source: str
:param source:
Path to the source folder to copy
:type destination: str
:param destination:
Path to destination folder
:type ignore: function
:param ignore:
A function that returns a set of file names to ignore, given a list of available file names. Similar to the
``ignore`` property of ``shutils.copytree`` method
"""
if not os.path.exists(source):
LOG.warning("Skipping copy operation since source %s does not exist", source)
return
if not os.path.exists(destination):
os.makedirs(destination)
try:
# Let's try to copy the directory metadata from source to destination
shutil.copystat(source, destination)
except OSError as ex:
# Can't copy file access times in Windows
LOG.debug("Unable to copy file access times from %s to %s", source, destination, exc_info=ex)
names = os.listdir(source)
if ignore is not None:
ignored_names = ignore(source, names)
else:
ignored_names = set()
for name in names:
# Skip ignored names
if name in ignored_names:
continue
new_source = os.path.join(source, name)
new_destination = os.path.join(destination, name)
if os.path.isdir(new_source):
copytree(new_source, new_destination, ignore=ignore)
else:
shutil.copy2(new_source, new_destination)