10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Module 'os2emxpath' -- common operations on OS/2 pathnames 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gao"""Common pathname manipulations, OS/2 EMX version. 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 40a8c90248264a8b26970b4473770bcc3df8515fJosh GaoInstead of importing this module directly, import os and refer to this 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gaomodule as os.path. 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao""" 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport os 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport stat 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom genericpath import * 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaofrom ntpath import (expanduser, expandvars, isabs, islink, splitdrive, 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao splitext, split, walk) 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao__all__ = ["normcase","isabs","join","splitdrive","split","splitext", 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "basename","dirname","commonprefix","getsize","getmtime", 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "getatime","getctime", "islink","exists","lexists","isdir","isfile", 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "ismount","walk","expanduser","expandvars","normpath","abspath", 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "splitunc","curdir","pardir","sep","pathsep","defpath","altsep", 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao "extsep","devnull","realpath","supports_unicode_filenames"] 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# strings representing various path-related bits and pieces 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gaocurdir = '.' 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gaopardir = '..' 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoextsep = '.' 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gaosep = '/' 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoaltsep = '\\' 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gaopathsep = ';' 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodefpath = '.;C:\\bin' 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodevnull = 'nul' 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Normalize the case of a pathname and map slashes to backslashes. 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Other normalizations (such as optimizing '../' away) are not done 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# (this is done by normpath). 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef normcase(s): 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Normalize case of pathname. 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Makes all characters lowercase and all altseps into seps.""" 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return s.replace('\\', '/').lower() 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Join two (or more) paths. 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef join(a, *p): 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Join two or more pathname components, inserting sep as needed""" 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao path = a 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for b in p: 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if isabs(b): 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao path = b 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elif path == '' or path[-1:] in '/\\:': 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao path = path + b 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao path = path + '/' + b 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return path 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Parse UNC paths 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef splitunc(p): 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Split a pathname into UNC mount point and relative path specifiers. 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Return a 2-tuple (unc, rest); either part may be empty. 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao If unc is not empty, it has the form '//host/mount' (or similar 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao using backslashes). unc+rest is always the input path. 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao Paths containing drive letters never have an UNC part. 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """ 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if p[1:2] == ':': 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '', p # Drive letter present 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao firstTwo = p[0:2] 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if firstTwo == '/' * 2 or firstTwo == '\\' * 2: 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # is a UNC path: 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # \\machine\mountpoint\directories... 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # directory ^^^^^^^^^^^^^^^ 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao normp = normcase(p) 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao index = normp.find('/', 2) 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if index == -1: 770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ##raise RuntimeError, 'illegal UNC path: "' + p + '"' 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return ("", p) 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao index = normp.find('/', index + 1) 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if index == -1: 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao index = len(p) 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return p[:index], p[index:] 830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return '', p 840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Return the tail (basename) part of a path. 870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 880a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef basename(p): 890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Returns the final component of a pathname""" 900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return split(p)[1] 910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Return the head (dirname) part of a path. 940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 950a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef dirname(p): 960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Returns the directory component of a pathname""" 970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return split(p)[0] 980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# alias exists to lexists 1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gaolexists = exists 1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Is a path a directory? 1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Is a path a mount point? Either a root (with or without drive letter) 1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# or an UNC path with at most a / or \ after the mount point. 1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef ismount(path): 1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Test whether a path is a mount point (defined as root of drive)""" 1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao unc, rest = splitunc(path) 1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if unc: 1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return rest in ("", "/", "\\") 1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p = splitdrive(path)[1] 1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return len(p) == 1 and p[0] in '/\\' 1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B. 1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef normpath(path): 1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Normalize path, eliminating double slashes, etc.""" 1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao path = path.replace('\\', '/') 1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao prefix, path = splitdrive(path) 1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while path[:1] == '/': 1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao prefix = prefix + '/' 1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao path = path[1:] 1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao comps = path.split('/') 1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao i = 0 1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao while i < len(comps): 1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if comps[i] == '.': 1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del comps[i] 1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'): 1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del comps[i-1:i+1] 1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao i = i - 1 1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao elif comps[i] == '' and i > 0 and comps[i-1] != '': 1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del comps[i] 1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao i = i + 1 1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # If the path is now empty, substitute '.' 1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not prefix and not comps: 1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao comps.append('.') 1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return prefix + '/'.join(comps) 1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# Return an absolute path. 1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gaodef abspath(path): 1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Return the absolute version of a path""" 1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not isabs(path): 1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if isinstance(path, unicode): 1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao cwd = os.getcwdu() 1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao cwd = os.getcwd() 1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao path = join(cwd, path) 1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return normpath(path) 1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# realpath is a no-op on systems without islink support 1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gaorealpath = abspath 1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gaosupports_unicode_filenames = False 160