| # Module 'os2emxpath' -- common operations on OS/2 pathnames |
| """Common pathname manipulations, OS/2 EMX version. |
| |
| Instead of importing this module directly, import os and refer to this |
| module as os.path. |
| """ |
| |
| import os |
| import stat |
| from genericpath import * |
| from ntpath import (expanduser, expandvars, isabs, islink, splitdrive, |
| splitext, split) |
| |
| __all__ = ["normcase","isabs","join","splitdrive","split","splitext", |
| "basename","dirname","commonprefix","getsize","getmtime", |
| "getatime","getctime", "islink","exists","lexists","isdir","isfile", |
| "ismount","expanduser","expandvars","normpath","abspath", |
| "splitunc","curdir","pardir","sep","pathsep","defpath","altsep", |
| "extsep","devnull","realpath","supports_unicode_filenames"] |
| |
| # strings representing various path-related bits and pieces |
| curdir = '.' |
| pardir = '..' |
| extsep = '.' |
| sep = '/' |
| altsep = '\\' |
| pathsep = ';' |
| defpath = '.;C:\\bin' |
| devnull = 'nul' |
| |
| # Normalize the case of a pathname and map slashes to backslashes. |
| # Other normalizations (such as optimizing '../' away) are not done |
| # (this is done by normpath). |
| |
| def normcase(s): |
| """Normalize case of pathname. |
| |
| Makes all characters lowercase and all altseps into seps.""" |
| return s.replace('\\', '/').lower() |
| |
| |
| # Join two (or more) paths. |
| |
| def join(a, *p): |
| """Join two or more pathname components, inserting sep as needed""" |
| path = a |
| for b in p: |
| if isabs(b): |
| path = b |
| elif path == '' or path[-1:] in '/\\:': |
| path = path + b |
| else: |
| path = path + '/' + b |
| return path |
| |
| |
| # Parse UNC paths |
| def splitunc(p): |
| """Split a pathname into UNC mount point and relative path specifiers. |
| |
| Return a 2-tuple (unc, rest); either part may be empty. |
| If unc is not empty, it has the form '//host/mount' (or similar |
| using backslashes). unc+rest is always the input path. |
| Paths containing drive letters never have an UNC part. |
| """ |
| if p[1:2] == ':': |
| return '', p # Drive letter present |
| firstTwo = p[0:2] |
| if firstTwo == '/' * 2 or firstTwo == '\\' * 2: |
| # is a UNC path: |
| # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter |
| # \\machine\mountpoint\directories... |
| # directory ^^^^^^^^^^^^^^^ |
| normp = normcase(p) |
| index = normp.find('/', 2) |
| if index == -1: |
| ##raise RuntimeError, 'illegal UNC path: "' + p + '"' |
| return ("", p) |
| index = normp.find('/', index + 1) |
| if index == -1: |
| index = len(p) |
| return p[:index], p[index:] |
| return '', p |
| |
| |
| # Return the tail (basename) part of a path. |
| |
| def basename(p): |
| """Returns the final component of a pathname""" |
| return split(p)[1] |
| |
| |
| # Return the head (dirname) part of a path. |
| |
| def dirname(p): |
| """Returns the directory component of a pathname""" |
| return split(p)[0] |
| |
| |
| # alias exists to lexists |
| lexists = exists |
| |
| |
| # Is a path a directory? |
| |
| # Is a path a mount point? Either a root (with or without drive letter) |
| # or an UNC path with at most a / or \ after the mount point. |
| |
| def ismount(path): |
| """Test whether a path is a mount point (defined as root of drive)""" |
| unc, rest = splitunc(path) |
| if unc: |
| return rest in ("", "/", "\\") |
| p = splitdrive(path)[1] |
| return len(p) == 1 and p[0] in '/\\' |
| |
| |
| # Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. |
| |
| def normpath(path): |
| """Normalize path, eliminating double slashes, etc.""" |
| path = path.replace('\\', '/') |
| prefix, path = splitdrive(path) |
| while path[:1] == '/': |
| prefix = prefix + '/' |
| path = path[1:] |
| comps = path.split('/') |
| i = 0 |
| while i < len(comps): |
| if comps[i] == '.': |
| del comps[i] |
| elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'): |
| del comps[i-1:i+1] |
| i = i - 1 |
| elif comps[i] == '' and i > 0 and comps[i-1] != '': |
| del comps[i] |
| else: |
| i = i + 1 |
| # If the path is now empty, substitute '.' |
| if not prefix and not comps: |
| comps.append('.') |
| return prefix + '/'.join(comps) |
| |
| |
| # Return an absolute path. |
| def abspath(path): |
| """Return the absolute version of a path""" |
| if not isabs(path): |
| path = join(os.getcwd(), path) |
| return normpath(path) |
| |
| # realpath is a no-op on systems without islink support |
| realpath = abspath |
| |
| supports_unicode_filenames = False |