dir_util.py (4347B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\dir_util.py 2 __revision__ = '$Id: dir_util.py 87602 2011-01-01 04:24:26Z richard.tew $' 3 import os 4 import errno 5 from distutils.errors import DistutilsFileError, DistutilsInternalError 6 from distutils import log 7 _path_created = {} 8 9 def mkpath(name, mode = 511, verbose = 1, dry_run = 0): 10 global _path_created 11 if not isinstance(name, basestring): 12 raise DistutilsInternalError, "mkpath: 'name' must be a string (got %r)" % (name,) 13 name = os.path.normpath(name) 14 created_dirs = [] 15 if os.path.isdir(name) or name == '': 16 return created_dirs 17 if _path_created.get(os.path.abspath(name)): 18 return created_dirs 19 head, tail = os.path.split(name) 20 tails = [tail] 21 while head and tail and not os.path.isdir(head): 22 head, tail = os.path.split(head) 23 tails.insert(0, tail) 24 25 for d in tails: 26 head = os.path.join(head, d) 27 abs_head = os.path.abspath(head) 28 if _path_created.get(abs_head): 29 continue 30 if verbose >= 1: 31 log.info('creating %s', head) 32 if not dry_run: 33 try: 34 os.mkdir(head, mode) 35 except OSError as exc: 36 if not (exc.errno == errno.EEXIST and os.path.isdir(head)): 37 raise DistutilsFileError("could not create '%s': %s" % (head, exc.args[-1])) 38 39 created_dirs.append(head) 40 _path_created[abs_head] = 1 41 42 return created_dirs 43 44 45 def create_tree(base_dir, files, mode = 511, verbose = 1, dry_run = 0): 46 need_dir = {} 47 for file in files: 48 need_dir[os.path.join(base_dir, os.path.dirname(file))] = 1 49 50 need_dirs = need_dir.keys() 51 need_dirs.sort() 52 for dir in need_dirs: 53 mkpath(dir, mode, verbose=verbose, dry_run=dry_run) 54 55 56 def copy_tree(src, dst, preserve_mode = 1, preserve_times = 1, preserve_symlinks = 0, update = 0, verbose = 1, dry_run = 0): 57 from distutils.file_util import copy_file 58 if not dry_run and not os.path.isdir(src): 59 raise DistutilsFileError, "cannot copy tree '%s': not a directory" % src 60 try: 61 names = os.listdir(src) 62 except os.error as (errno, errstr): 63 if dry_run: 64 names = [] 65 else: 66 raise DistutilsFileError, "error listing files in '%s': %s" % (src, errstr) 67 68 if not dry_run: 69 mkpath(dst, verbose=verbose) 70 outputs = [] 71 for n in names: 72 src_name = os.path.join(src, n) 73 dst_name = os.path.join(dst, n) 74 if preserve_symlinks and os.path.islink(src_name): 75 link_dest = os.readlink(src_name) 76 if verbose >= 1: 77 log.info('linking %s -> %s', dst_name, link_dest) 78 if not dry_run: 79 os.symlink(link_dest, dst_name) 80 outputs.append(dst_name) 81 elif os.path.isdir(src_name): 82 outputs.extend(copy_tree(src_name, dst_name, preserve_mode, preserve_times, preserve_symlinks, update, verbose=verbose, dry_run=dry_run)) 83 else: 84 copy_file(src_name, dst_name, preserve_mode, preserve_times, update, verbose=verbose, dry_run=dry_run) 85 outputs.append(dst_name) 86 87 return outputs 88 89 90 def _build_cmdtuple(path, cmdtuples): 91 for f in os.listdir(path): 92 real_f = os.path.join(path, f) 93 if os.path.isdir(real_f) and not os.path.islink(real_f): 94 _build_cmdtuple(real_f, cmdtuples) 95 else: 96 cmdtuples.append((os.remove, real_f)) 97 98 cmdtuples.append((os.rmdir, path)) 99 100 101 def remove_tree(directory, verbose = 1, dry_run = 0): 102 from distutils.util import grok_environment_error 103 if verbose >= 1: 104 log.info("removing '%s' (and everything under it)", directory) 105 if dry_run: 106 return 107 cmdtuples = [] 108 _build_cmdtuple(directory, cmdtuples) 109 for cmd in cmdtuples: 110 try: 111 cmd[0](cmd[1]) 112 abspath = os.path.abspath(cmd[1]) 113 if abspath in _path_created: 114 del _path_created[abspath] 115 except (IOError, OSError) as exc: 116 log.warn(grok_environment_error(exc, 'error removing %s: ' % directory)) 117 118 119 def ensure_relative(path): 120 drive, path = os.path.splitdrive(path) 121 if path[0:1] == os.sep: 122 path = drive + path[1:] 123 return path