[ab8319a] | 1 | # |
---|
| 2 | # RTEMS Tools Project (http://www.rtems.org/) |
---|
| 3 | # Copyright 2010-2012 Chris Johns (chrisj@rtems.org) |
---|
| 4 | # All rights reserved. |
---|
| 5 | # |
---|
| 6 | # This file is part of the RTEMS Tools package in 'rtems-tools'. |
---|
| 7 | # |
---|
| 8 | # Permission to use, copy, modify, and/or distribute this software for any |
---|
| 9 | # purpose with or without fee is hereby granted, provided that the above |
---|
| 10 | # copyright notice and this permission notice appear in all copies. |
---|
| 11 | # |
---|
| 12 | # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
---|
| 13 | # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
---|
| 14 | # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
---|
| 15 | # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
---|
| 16 | # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
---|
| 17 | # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
---|
| 18 | # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
---|
| 19 | |
---|
| 20 | # |
---|
| 21 | # Manage paths locally. The internally the path is in Unix or shell format and |
---|
| 22 | # we convert to the native format when performing operations at the Python |
---|
| 23 | # level. This allows macro expansion to work. |
---|
| 24 | # |
---|
| 25 | |
---|
| 26 | import os |
---|
[ee47d72] | 27 | import shutil |
---|
[ab8319a] | 28 | import string |
---|
| 29 | |
---|
[ee47d72] | 30 | import error |
---|
| 31 | |
---|
[ab8319a] | 32 | windows = os.name == 'nt' |
---|
| 33 | |
---|
| 34 | def host(path): |
---|
| 35 | if path is not None: |
---|
| 36 | while '//' in path: |
---|
| 37 | path = path.replace('//', '/') |
---|
| 38 | if windows and len(path) > 2: |
---|
| 39 | if path[0] == '/' and path[2] == '/' and \ |
---|
| 40 | (path[1] in string.ascii_lowercase or \ |
---|
| 41 | path[1] in string.ascii_uppercase): |
---|
| 42 | path = ('%s:%s' % (path[1], path[2:])).replace('/', '\\') |
---|
| 43 | return path |
---|
| 44 | |
---|
| 45 | def shell(path): |
---|
| 46 | if path is not None: |
---|
| 47 | if windows and len(path) > 1 and path[1] == ':': |
---|
| 48 | path = ('/%s%s' % (path[0], path[2:])).replace('\\', '/') |
---|
| 49 | while '//' in path: |
---|
| 50 | path = path.replace('//', '/') |
---|
| 51 | return path |
---|
| 52 | |
---|
| 53 | def basename(path): |
---|
| 54 | return shell(os.path.basename(path)) |
---|
| 55 | |
---|
| 56 | def dirname(path): |
---|
| 57 | return shell(os.path.dirname(path)) |
---|
| 58 | |
---|
| 59 | def join(path, *args): |
---|
| 60 | path = shell(path) |
---|
| 61 | for arg in args: |
---|
[73e8afb] | 62 | if len(path): |
---|
| 63 | path += '/' + shell(arg) |
---|
| 64 | else: |
---|
| 65 | path = shell(arg) |
---|
[ab8319a] | 66 | return shell(path) |
---|
| 67 | |
---|
| 68 | def abspath(path): |
---|
| 69 | return shell(os.path.abspath(host(path))) |
---|
| 70 | |
---|
| 71 | def splitext(path): |
---|
| 72 | root, ext = os.path.splitext(host(path)) |
---|
| 73 | return shell(root), ext |
---|
| 74 | |
---|
[06dad0a] | 75 | def exists(paths): |
---|
| 76 | if type(paths) == list: |
---|
| 77 | results = [] |
---|
| 78 | for p in paths: |
---|
| 79 | results += [os.path.exists(host(p))] |
---|
| 80 | return results |
---|
| 81 | return os.path.exists(host(paths)) |
---|
[ab8319a] | 82 | |
---|
| 83 | def isdir(path): |
---|
| 84 | return os.path.isdir(host(path)) |
---|
| 85 | |
---|
| 86 | def isfile(path): |
---|
| 87 | return os.path.isfile(host(path)) |
---|
| 88 | |
---|
[8f84a6b] | 89 | def isabspath(path): |
---|
| 90 | return path[0] == '/' |
---|
| 91 | |
---|
[ee47d72] | 92 | def mkdir(path): |
---|
[bc71066] | 93 | path = host(path) |
---|
[ee47d72] | 94 | if exists(path): |
---|
| 95 | if not isdir(path): |
---|
| 96 | raise error.general('path exists and is not a directory: %s' % (path)) |
---|
| 97 | else: |
---|
| 98 | if windows: |
---|
| 99 | try: |
---|
| 100 | os.makedirs(host(path)) |
---|
| 101 | except IOError, err: |
---|
| 102 | raise error.general('cannot make directory: %s' % (path)) |
---|
| 103 | except OSError, err: |
---|
| 104 | raise error.general('cannot make directory: %s' % (path)) |
---|
| 105 | except WindowsError, err: |
---|
| 106 | raise error.general('cannot make directory: %s' % (path)) |
---|
| 107 | else: |
---|
| 108 | try: |
---|
| 109 | os.makedirs(host(path)) |
---|
| 110 | except IOError, err: |
---|
| 111 | raise error.general('cannot make directory: %s' % (path)) |
---|
| 112 | except OSError, err: |
---|
| 113 | raise error.general('cannot make directory: %s' % (path)) |
---|
| 114 | |
---|
| 115 | def removeall(path): |
---|
| 116 | |
---|
| 117 | def _onerror(function, path, excinfo): |
---|
| 118 | print 'removeall error: (%r) %s' % (function, path) |
---|
| 119 | |
---|
[bc71066] | 120 | path = host(path) |
---|
[ee47d72] | 121 | shutil.rmtree(path, onerror = _onerror) |
---|
| 122 | return |
---|
| 123 | |
---|
[06dad0a] | 124 | def expand(name, paths): |
---|
| 125 | l = [] |
---|
| 126 | for p in paths: |
---|
| 127 | l += [join(p, name)] |
---|
| 128 | return l |
---|
| 129 | |
---|
[ab8319a] | 130 | if __name__ == '__main__': |
---|
| 131 | print host('/a/b/c/d-e-f') |
---|
| 132 | print host('//a/b//c/d-e-f') |
---|
| 133 | print shell('/w/x/y/z') |
---|
| 134 | print basename('/as/sd/df/fg/me.txt') |
---|
| 135 | print dirname('/as/sd/df/fg/me.txt') |
---|
| 136 | print join('/d', 'g', '/tyty/fgfg') |
---|
| 137 | windows = True |
---|
| 138 | print host('/a/b/c/d-e-f') |
---|
| 139 | print host('//a/b//c/d-e-f') |
---|
| 140 | print shell('/w/x/y/z') |
---|
| 141 | print shell('w:/x/y/z') |
---|
| 142 | print basename('x:/sd/df/fg/me.txt') |
---|
| 143 | print dirname('x:/sd/df/fg/me.txt') |
---|
| 144 | print join('s:/d/', '/g', '/tyty/fgfg') |
---|