mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			158 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			158 lines
		
	
	
	
		
			4.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# 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."""
 | 
						|
    if not isinstance(s, (bytes, str)):
 | 
						|
        raise TypeError("normcase() argument must be str or bytes, "
 | 
						|
                        "not '{}'".format(s.__class__.__name__))
 | 
						|
    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
 |