if e.errno != errno.ENOENT:
raise
+def copytree(src, dst, symlinks=False, ignore=None):
+ names = os.listdir(src)
+ if ignore is not None:
+ ignored_names = ignore(src, names)
+ else:
+ ignored_names = set()
+
+ if not os.path.isdir(dst):
+ os.makedirs(dst)
+ errors = []
+ for name in names:
+ if name in ignored_names:
+ continue
+ srcname = os.path.join(src, name)
+ dstname = os.path.join(dst, name)
+ try:
+ if symlinks and os.path.islink(srcname):
+ linkto = os.readlink(srcname)
+ os.symlink(linkto, dstname)
+ elif os.path.isdir(srcname):
+ copytree(srcname, dstname, symlinks, ignore)
+ else:
+ shutil.copy2(srcname, dstname)
+ except (IOError, os.error) as why:
+ errors.append((srcname, dstname, str(why)))
+ # catch the Error from the recursive copytree so that we can
+ # continue with other files
+ except shutil.Error as err:
+ errors.extend(err.args[0])
+ try:
+ shutil.copystat(src, dst)
+ except WindowsError:
+ # can't copy file access times on Windows
+ pass
+ except OSError as why:
+ errors.extend((src, dst, str(why)))
+ if errors:
+ raise shutil.Error(errors)
+
def copy_files(copy_list, outdir):
for src, tgt in copy_list:
if tgt == '':
- shutil.copytree(src, outdir, ignore=shutil.ignore_patterns('*~'))
+ copytree(src, outdir, ignore=shutil.ignore_patterns('*~'))
elif tgt[-1] == '/':
def copy_ignore(dir, entries):
r = []
not os.path.isdir(os.path.join(dir, i))):
r.append(i)
return r
- shutil.copytree(os.path.join(src, tgt),
- os.path.join(outdir, tgt),
- ignore=copy_ignore)
+ copytree(os.path.join(src, tgt),
+ os.path.join(outdir, tgt),
+ ignore=copy_ignore)
else:
try:
os.makedirs(os.path.join(outdir, os.path.dirname(tgt)))