| 975 | |
| 976 | |
| 977 | def copy_tree(src, dst, overwrite=False, preserve_metadata=False): |
| 978 | pmode = preserve_metadata or overwrite is None |
| 979 | mtime = os.path.getmtime |
| 980 | copy = shutil.copy2 if pmode else shutil.copy |
| 981 | |
| 982 | if preserve_metadata and not exists(dst): |
| 983 | return shutil.copytree(src, dst) |
| 984 | |
| 985 | for src_dir, dirs, files in os.walk(src, topdown=False): |
| 986 | dst_dir = src_dir.replace(src, dst, 1) |
| 987 | |
| 988 | if not exists(dst_dir): |
| 989 | os.makedirs(dst_dir) |
| 990 | if pmode: |
| 991 | shutil.copystat(src_dir, dst_dir) |
| 992 | |
| 993 | elif pmode: |
| 994 | if overwrite or overwrite is None and mtime(src_dir) > mtime(dst_dir): |
| 995 | shutil.copystat(src_dir, dst_dir) |
| 996 | |
| 997 | for filename in files: |
| 998 | src_file = fsjoin(src_dir, filename) |
| 999 | dst_file = fsjoin(dst_dir, filename) |
| 1000 | |
| 1001 | if exists(dst_file): |
| 1002 | if overwrite or overwrite is None and mtime(src_file) > mtime(dst_file): |
| 1003 | os.remove(dst_file) |
| 1004 | else: |
| 1005 | continue |
| 1006 | |
| 1007 | copy(src_file, dst_dir) |
| 1008 | |
| 1009 | |
| 1010 | def move_tree(src, dst, overwrite=False): |