NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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