file_util.py (4668B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\file_util.py 2 __revision__ = '$Id: file_util.py 87602 2011-01-01 04:24:26Z richard.tew $' 3 import os 4 from distutils.errors import DistutilsFileError 5 from distutils import log 6 _copy_action = {None: 'copying', 7 'hard': 'hard linking', 8 'sym': 'symbolically linking'} 9 10 def _copy_file_contents(src, dst, buffer_size = 16384): 11 fsrc = None 12 fdst = None 13 try: 14 try: 15 fsrc = open(src, 'rb') 16 except os.error as (errno, errstr): 17 raise DistutilsFileError("could not open '%s': %s" % (src, errstr)) 18 19 if os.path.exists(dst): 20 try: 21 os.unlink(dst) 22 except os.error as (errno, errstr): 23 raise DistutilsFileError("could not delete '%s': %s" % (dst, errstr)) 24 25 try: 26 fdst = open(dst, 'wb') 27 except os.error as (errno, errstr): 28 raise DistutilsFileError("could not create '%s': %s" % (dst, errstr)) 29 30 while 1: 31 try: 32 buf = fsrc.read(buffer_size) 33 except os.error as (errno, errstr): 34 raise DistutilsFileError("could not read from '%s': %s" % (src, errstr)) 35 36 if not buf: 37 break 38 try: 39 fdst.write(buf) 40 except os.error as (errno, errstr): 41 raise DistutilsFileError("could not write to '%s': %s" % (dst, errstr)) 42 43 finally: 44 if fdst: 45 fdst.close() 46 if fsrc: 47 fsrc.close() 48 49 50 def copy_file(src, dst, preserve_mode = 1, preserve_times = 1, update = 0, link = None, verbose = 1, dry_run = 0): 51 from distutils.dep_util import newer 52 from stat import ST_ATIME, ST_MTIME, ST_MODE, S_IMODE 53 if not os.path.isfile(src): 54 raise DistutilsFileError("can't copy '%s': doesn't exist or not a regular file" % src) 55 if os.path.isdir(dst): 56 dir = dst 57 dst = os.path.join(dst, os.path.basename(src)) 58 else: 59 dir = os.path.dirname(dst) 60 if update and not newer(src, dst): 61 if verbose >= 1: 62 log.debug('not copying %s (output up-to-date)', src) 63 return (dst, 0) 64 try: 65 action = _copy_action[link] 66 except KeyError: 67 raise ValueError("invalid value '%s' for 'link' argument" % link) 68 69 if verbose >= 1: 70 if os.path.basename(dst) == os.path.basename(src): 71 log.info('%s %s -> %s', action, src, dir) 72 else: 73 log.info('%s %s -> %s', action, src, dst) 74 if dry_run: 75 return (dst, 1) 76 if link == 'hard': 77 if not (os.path.exists(dst) and os.path.samefile(src, dst)): 78 os.link(src, dst) 79 elif link == 'sym': 80 if not (os.path.exists(dst) and os.path.samefile(src, dst)): 81 os.symlink(src, dst) 82 else: 83 _copy_file_contents(src, dst) 84 if preserve_mode or preserve_times: 85 st = os.stat(src) 86 if preserve_times: 87 os.utime(dst, (st[ST_ATIME], st[ST_MTIME])) 88 if preserve_mode: 89 os.chmod(dst, S_IMODE(st[ST_MODE])) 90 return (dst, 1) 91 92 93 def move_file(src, dst, verbose = 1, dry_run = 0): 94 from os.path import exists, isfile, isdir, basename, dirname 95 import errno 96 if verbose >= 1: 97 log.info('moving %s -> %s', src, dst) 98 if dry_run: 99 return dst 100 if not isfile(src): 101 raise DistutilsFileError("can't move '%s': not a regular file" % src) 102 if isdir(dst): 103 dst = os.path.join(dst, basename(src)) 104 elif exists(dst): 105 raise DistutilsFileError("can't move '%s': destination '%s' already exists" % (src, dst)) 106 if not isdir(dirname(dst)): 107 raise DistutilsFileError("can't move '%s': destination '%s' not a valid path" % (src, dst)) 108 copy_it = 0 109 try: 110 os.rename(src, dst) 111 except os.error as (num, msg): 112 if num == errno.EXDEV: 113 copy_it = 1 114 else: 115 raise DistutilsFileError("couldn't move '%s' to '%s': %s" % (src, dst, msg)) 116 117 if copy_it: 118 copy_file(src, dst, verbose=verbose) 119 try: 120 os.unlink(src) 121 except os.error as (num, msg): 122 try: 123 os.unlink(dst) 124 except os.error: 125 pass 126 127 raise DistutilsFileError(("couldn't move '%s' to '%s' by copy/delete: " + "delete '%s' failed: %s") % (src, 128 dst, 129 src, 130 msg)) 131 132 return dst 133 134 135 def write_file(filename, contents): 136 f = open(filename, 'w') 137 try: 138 for line in contents: 139 f.write(line + '\n') 140 141 finally: 142 f.close()