diff options
Diffstat (limited to 'Lib/ntpath.py')
| -rw-r--r-- | Lib/ntpath.py | 62 | 
1 files changed, 30 insertions, 32 deletions
| diff --git a/Lib/ntpath.py b/Lib/ntpath.py index 303e5862b3..992970ab1d 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -17,7 +17,7 @@ __all__ = ["normcase","isabs","join","splitdrive","split","splitext",             "ismount", "expanduser","expandvars","normpath","abspath",             "splitunc","curdir","pardir","sep","pathsep","defpath","altsep",             "extsep","devnull","realpath","supports_unicode_filenames","relpath", -           "samefile", "sameopenfile",] +           "samefile", "sameopenfile", "samestat",]  # strings representing various path-related bits and pieces  # These are primarily for export; internally, they are hardcoded. @@ -30,9 +30,6 @@ altsep = '/'  defpath = '.;C:\\bin'  if 'ce' in sys.builtin_module_names:      defpath = '\\Windows' -elif 'os2' in sys.builtin_module_names: -    # OS/2 w/ VACPP -    altsep = '/'  devnull = 'nul'  def _get_empty(path): @@ -260,12 +257,11 @@ def dirname(p):  def islink(path):      """Test whether a path is a symbolic link. -    This will always return false for Windows prior to 6.0 -    and for OS/2. +    This will always return false for Windows prior to 6.0.      """      try:          st = os.lstat(path) -    except (os.error, AttributeError): +    except (OSError, AttributeError):          return False      return stat.S_ISLNK(st.st_mode) @@ -275,20 +271,39 @@ def lexists(path):      """Test whether a path exists.  Returns True for broken symbolic links"""      try:          st = os.lstat(path) -    except (os.error, WindowsError): +    except OSError:          return False      return True -# 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. - +# Is a path a mount point? +# Any drive letter root (eg c:\) +# Any share UNC (eg \\server\share) +# Any volume mounted on a filesystem folder +# +# No one method detects all three situations. Historically we've lexically +# detected drive letter roots and share UNCs. The canonical approach to +# detecting mounted volumes (querying the reparse tag) fails for the most +# common case: drive letter roots. The alternative which uses GetVolumePathName +# fails if the drive letter is the result of a SUBST. +try: +    from nt import _getvolumepathname +except ImportError: +    _getvolumepathname = None  def ismount(path): -    """Test whether a path is a mount point (defined as root of drive)""" +    """Test whether a path is a mount point (a drive root, the root of a +    share, or a mounted volume)"""      seps = _get_bothseps(path) +    path = abspath(path)      root, rest = splitdrive(path)      if root and root[0] in seps:          return (not rest) or (rest in seps) -    return rest in seps +    if rest in seps: +        return True + +    if _getvolumepathname: +        return path.rstrip(seps) == _getvolumepathname(path).rstrip(seps) +    else: +        return False  # Expand paths beginning with '~' or '~user'. @@ -385,7 +400,7 @@ def expandvars(path):                  index = path.index(c)                  res += c + path[:index + 1]              except ValueError: -                res += path +                res += c + path                  index = pathlen - 1          elif c == percent:  # variable or '%'              if path[index + 1:index + 2] == percent: @@ -530,7 +545,7 @@ else:  # use native Windows method on Windows          if path: # Empty path must return current working directory.              try:                  path = _getfullpathname(path) -            except WindowsError: +            except OSError:                  pass # Bad path - return unchanged.          elif isinstance(path, bytes):              path = os.getcwdb() @@ -598,23 +613,6 @@ except (AttributeError, ImportError):      def _getfinalpathname(f):          return normcase(abspath(f)) -def samefile(f1, f2): -    "Test whether two pathnames reference the same actual file" -    return _getfinalpathname(f1) == _getfinalpathname(f2) - - -try: -    from nt import _getfileinformation -except ImportError: -    # On other operating systems, just return the fd and see that -    # it compares equal in sameopenfile. -    def _getfileinformation(fd): -        return fd - -def sameopenfile(f1, f2): -    """Test whether two file objects reference the same file""" -    return _getfileinformation(f1) == _getfileinformation(f2) -  try:      # The genericpath.isdir implementation uses os.stat and checks the mode | 
