14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Module 'os2emxpath' -- common operations on OS/2 pathnames 24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao"""Common pathname manipulations, OS/2 EMX version. 34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 44adfde8bc82dd39f59e0445588c3e599ada477dJosh GaoInstead of importing this module directly, import os and refer to this 54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaomodule as os.path. 64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao""" 74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport os 94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport stat 104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom genericpath import * 114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom ntpath import (expanduser, expandvars, isabs, islink, splitdrive, 124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao splitext, split, walk) 134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao__all__ = ["normcase","isabs","join","splitdrive","split","splitext", 154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "basename","dirname","commonprefix","getsize","getmtime", 164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "getatime","getctime", "islink","exists","lexists","isdir","isfile", 174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "ismount","walk","expanduser","expandvars","normpath","abspath", 184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "splitunc","curdir","pardir","sep","pathsep","defpath","altsep", 194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao "extsep","devnull","realpath","supports_unicode_filenames"] 204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# strings representing various path-related bits and pieces 224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaocurdir = '.' 234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaopardir = '..' 244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoextsep = '.' 254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosep = '/' 264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoaltsep = '\\' 274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaopathsep = ';' 284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodefpath = '.;C:\\bin' 294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodevnull = 'nul' 304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Normalize the case of a pathname and map slashes to backslashes. 324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Other normalizations (such as optimizing '../' away) are not done 334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# (this is done by normpath). 344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef normcase(s): 364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Normalize case of pathname. 374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Makes all characters lowercase and all altseps into seps.""" 394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return s.replace('\\', '/').lower() 404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Join two (or more) paths. 434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef join(a, *p): 454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Join two or more pathname components, inserting sep as needed""" 464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao path = a 474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao for b in p: 484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isabs(b): 494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao path = b 504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif path == '' or path[-1:] in '/\\:': 514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao path = path + b 524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao path = path + '/' + b 544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return path 554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Parse UNC paths 584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef splitunc(p): 594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Split a pathname into UNC mount point and relative path specifiers. 604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Return a 2-tuple (unc, rest); either part may be empty. 624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao If unc is not empty, it has the form '//host/mount' (or similar 634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao using backslashes). unc+rest is always the input path. 644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao Paths containing drive letters never have an UNC part. 654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """ 664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if p[1:2] == ':': 674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return '', p # Drive letter present 684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao firstTwo = p[0:2] 694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if firstTwo == '/' * 2 or firstTwo == '\\' * 2: 704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # is a UNC path: 714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter 724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # \\machine\mountpoint\directories... 734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # directory ^^^^^^^^^^^^^^^ 744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao normp = normcase(p) 754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao index = normp.find('/', 2) 764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if index == -1: 774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao ##raise RuntimeError, 'illegal UNC path: "' + p + '"' 784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return ("", p) 794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao index = normp.find('/', index + 1) 804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if index == -1: 814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao index = len(p) 824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return p[:index], p[index:] 834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return '', p 844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Return the tail (basename) part of a path. 874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef basename(p): 894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Returns the final component of a pathname""" 904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return split(p)[1] 914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Return the head (dirname) part of a path. 944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef dirname(p): 964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Returns the directory component of a pathname""" 974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return split(p)[0] 984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# alias exists to lexists 1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaolexists = exists 1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Is a path a directory? 1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Is a path a mount point? Either a root (with or without drive letter) 1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# or an UNC path with at most a / or \ after the mount point. 1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef ismount(path): 1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Test whether a path is a mount point (defined as root of drive)""" 1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao unc, rest = splitunc(path) 1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if unc: 1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return rest in ("", "/", "\\") 1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao p = splitdrive(path)[1] 1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return len(p) == 1 and p[0] in '/\\' 1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. 1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef normpath(path): 1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Normalize path, eliminating double slashes, etc.""" 1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao path = path.replace('\\', '/') 1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao prefix, path = splitdrive(path) 1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while path[:1] == '/': 1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao prefix = prefix + '/' 1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao path = path[1:] 1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao comps = path.split('/') 1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao i = 0 1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao while i < len(comps): 1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if comps[i] == '.': 1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del comps[i] 1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'): 1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del comps[i-1:i+1] 1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao i = i - 1 1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao elif comps[i] == '' and i > 0 and comps[i-1] != '': 1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao del comps[i] 1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao i = i + 1 1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao # If the path is now empty, substitute '.' 1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not prefix and not comps: 1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao comps.append('.') 1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return prefix + '/'.join(comps) 1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Return an absolute path. 1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef abspath(path): 1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao """Return the absolute version of a path""" 1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if not isabs(path): 1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao if isinstance(path, unicode): 1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao cwd = os.getcwdu() 1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao else: 1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao cwd = os.getcwd() 1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao path = join(cwd, path) 1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao return normpath(path) 1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# realpath is a no-op on systems without islink support 1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaorealpath = abspath 1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao 1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaosupports_unicode_filenames = False 160