Changeset 62537bc in rtems-source-builder


Ignore:
Timestamp:
Apr 13, 2018, 3:14:51 AM (15 months ago)
Author:
Chris Johns <chrisj@…>
Branches:
4.10
Children:
6baeb35
Parents:
9f4ed7e
Message:

sb/path: Update the path module to the latest from master.

  • Fixes Windows path issues
  • Fixes infinite loop with a read-only path.

Close #3394

File:
1 edited

Legend:

Unmodified
Added
Removed
  • source-builder/sb/path.py

    r9f4ed7e r62537bc  
    3535
    3636windows = os.name == 'nt'
     37win_maxpath = 254
    3738
    3839def host(path):
     
    4748                path = '%s:%s' % (path[1], path[2:])
    4849            path = path.replace('/', '\\')
    49             if not path.startswith('\\\\?\\') and len(path) > 254:
    50                 path = '\\\\?\\' + path
     50            if len(path) > win_maxpath:
     51                if path.startswith('\\\\?\\'):
     52                    path = path[4:]
     53                path = u'\\'.join([u'\\\\?', path])
    5154    return path
     55
     56def is_abspath(path):
     57    if path is not None and len(path) > 0:
     58        return '/' == path[0]
     59    return False
    5260
    5361def shell(path):
    5462    if path is not None:
    5563        if windows:
     64            path = path.encode('ascii', 'ignore')
    5665            if path.startswith('\\\\?\\'):
    5766                path = path[4:]
     
    6473
    6574def basename(path):
    66     return shell(os.path.basename(path))
     75    path = shell(path)
     76    return shell(os.path.basename(host(path)))
    6777
    6878def dirname(path):
     79    path = shell(path)
    6980    return shell(os.path.dirname(path))
    7081
     
    7990
    8091def abspath(path):
     92    path = shell(path)
    8193    return shell(os.path.abspath(host(path)))
    8294
     95def relpath(path, start = None):
     96    path = shell(path)
     97    if start is None:
     98        path = os.path.relpath(host(path))
     99    else:
     100        path = os.path.relpath(host(path), start)
     101    return shell(path)
     102
    83103def splitext(path):
     104    path = shell(path)
    84105    root, ext = os.path.splitext(host(path))
    85106    return shell(root), ext
    86107
     108def listdir(path):
     109    path = shell(path)
     110    hp = host(path)
     111    if not os.path.exists(hp):
     112        return []
     113    return os.listdir(hp)
     114
    87115def exists(paths):
     116    def _exists(p):
     117        if not is_abspath(p):
     118            p = shell(join(os.getcwd(), host(p)))
     119        return basename(p) in ['.'] + listdir(dirname(p))
     120
    88121    if type(paths) == list:
    89122        results = []
    90123        for p in paths:
    91             results += [os.path.exists(host(p))]
     124            results += [_exists(shell(p))]
    92125        return results
    93     return os.path.exists(host(paths))
     126    return _exists(shell(paths))
    94127
    95128def isdir(path):
     129    path = shell(path)
    96130    return os.path.isdir(host(path))
    97131
    98132def isfile(path):
     133    path = shell(path)
    99134    return os.path.isfile(host(path))
    100135
    101136def isabspath(path):
     137    path = shell(path)
    102138    return path[0] == '/'
    103139
    104140def iswritable(path):
     141    path = shell(path)
    105142    return os.access(host(path), os.W_OK)
    106143
    107144def ispathwritable(path):
    108     path = host(path)
    109     while len(path) != 0:
    110         if os.path.exists(path):
     145    path = shell(path)
     146    while len(path) > 1:
     147        if exists(path):
    111148            return iswritable(path)
    112         path = os.path.dirname(path)
     149        path = dirname(path)
    113150    return False
    114151
    115152def mkdir(path):
    116     path = host(path)
     153    path = shell(path)
    117154    if exists(path):
    118155        if not isdir(path):
     
    136173                raise error.general('cannot make directory: %s' % (path))
    137174
     175def chdir(path):
     176    path = shell(path)
     177    os.chdir(host(path))
     178
    138179def removeall(path):
    139180    #
    140181    # Perform the removal of the directory tree manually so we can
    141     # make sure on Windows the files and correctly encoded to avoid
    142     # the size limit.
     182    # make sure on Windows the files are correctly encoded to avoid
     183    # the file name size limit. On Windows the os.walk fails once we
     184    # get to the max path length on Windows.
    143185    #
    144     path = host(path)
    145     for root, dirs, files in os.walk(path, topdown = False):
    146         for name in files:
    147             file = host(os.path.join(root, name))
    148             if not os.path.islink(file) and not os.access(file, os.W_OK):
    149                 os.chmod(file, stat.S_IWUSR)
    150             os.unlink(file)
     186    def _isdir(path):
     187        hpath = host(path)
     188        return os.path.isdir(hpath) and not os.path.islink(hpath)
     189
     190    def _remove_node(path):
     191        hpath = host(path)
     192        if not os.path.islink(hpath) and not os.access(hpath, os.W_OK):
     193            os.chmod(hpath, stat.S_IWUSR)
     194        if _isdir(path):
     195            os.rmdir(hpath)
     196        else:
     197            os.unlink(hpath)
     198
     199    def _remove(path):
     200        dirs = []
     201        for name in listdir(path):
     202            path_ = join(path, name)
     203            hname = host(path_)
     204            if _isdir(path_):
     205                dirs += [name]
     206            else:
     207                _remove_node(path_)
    151208        for name in dirs:
    152             dir = host(os.path.join(root, name))
    153             if os.path.islink(dir):
    154                 os.unlink(dir)
    155             else:
    156                 if not os.access(dir, os.W_OK):
    157                     os.chmod(dir, stat.S_IWUSR)
    158                 os.rmdir(dir)
    159     if not os.path.islink(path) and not os.access(path, os.W_OK):
    160         os.chmod(path, stat.S_IWUSR)
    161     if os.path.islink(path):
    162         os.unlink(path)
    163     else:
    164         os.rmdir(path)
     209            dir = join(path, name)
     210            _remove(dir)
     211            _remove_node(dir)
     212
     213    path = shell(path)
     214    hpath = host(path)
     215
     216    if os.path.exists(hpath):
     217        _remove(path)
     218        _remove_node(path)
    165219
    166220def expand(name, paths):
    167221    l = []
    168222    for p in paths:
    169         l += [join(p, name)]
     223        l += [join(shell(p), name)]
    170224    return l
    171225
    172226def copy(src, dst):
     227    src = shell(src)
     228    dst = shell(dst)
    173229    hsrc = host(src)
    174230    hdst = host(dst)
     
    180236                pass
    181237        else:
    182             raise error.general('copying tree: %s -> %s: %s' % (hsrc, hdst, str(why)))
     238            raise error.general('copying tree (1): %s -> %s: %s' % (hsrc, hdst, str(why)))
    183239
    184240def copy_tree(src, dst):
     
    188244    hdst = host(dst)
    189245
    190     if os.path.exists(hsrc):
    191         names = os.listdir(hsrc)
     246    if exists(src):
     247        names = listdir(src)
    192248    else:
    193249        names = []
     
    195251    if trace:
    196252        print('path.copy_tree:')
    197         print('   src: %s' % (src))
    198         print('  hsrc: %s' % (hsrc))
    199         print('   dst: %s' % (dst))
    200         print('  hdst: %s' % (hdst))
     253        print('   src: "%s"' % (src))
     254        print('  hsrc: "%s"' % (hsrc))
     255        print('   dst: "%s"' % (dst))
     256        print('  hdst: "%s"' % (hdst))
    201257        print(' names: %r' % (names))
    202258
     
    216272            if os.path.islink(srcname):
    217273                linkto = os.readlink(srcname)
    218                 if os.path.exists(dstname):
     274                if exists(shell(dstname)):
    219275                    if os.path.islink(dstname):
    220276                        dstlinkto = os.readlink(dstname)
     
    232288                copy_tree(srcname, dstname)
    233289            else:
    234                     shutil.copy2(host(srcname), host(dstname))
     290                shutil.copyfile(host(srcname), host(dstname))
     291                shutil.copystat(host(srcname), host(dstname))
    235292        except shutil.Error as err:
    236             raise error.general('copying tree: %s -> %s: %s' % \
     293            raise error.general('copying tree (2): %s -> %s: %s' % \
    237294                                (hsrc, hdst, str(err)))
    238295        except EnvironmentError as why:
    239             raise error.general('copying tree: %s -> %s: %s' % \
     296            raise error.general('copying tree (3): %s -> %s: %s' % \
    240297                                (srcname, dstname, str(why)))
    241298    try:
     
    246303                pass
    247304        else:
    248             raise error.general('copying tree: %s -> %s: %s' % (hsrc, hdst, str(why)))
     305            raise error.general('copying tree (4): %s -> %s: %s' % (hsrc, hdst, str(why)))
    249306
    250307if __name__ == '__main__':
Note: See TracChangeset for help on using the changeset viewer.