cpython: 75111791110b (original) (raw)
--- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -186,7 +186,7 @@ def ismount(path): return False try: s1 = os.lstat(path)
s2 = os.lstat(join(path, '..'))[](#l1.7)
except os.error: return False # It doesn't exist -- so not a mount point :-) dev1 = s1.st_devs2 = os.lstat(realpath(join(path, '..')))[](#l1.8)
--- a/Lib/test/test_posixpath.py +++ b/Lib/test/test_posixpath.py @@ -1,4 +1,5 @@ import unittest +from test import symlink_support from test import test_support, test_genericpath from test import test_support as support @@ -7,6 +8,11 @@ import os import sys from posixpath import realpath, abspath, dirname, basename +try:
An absolute path to a temporary filename for testing. We can't rely on TESTFN
being an absolute path, so we need this.
@@ -100,7 +106,7 @@ class PosixPathTest(unittest.TestCase): f.write("foo") f.close() self.assertIs(posixpath.islink(test_support.TESTFN + "1"), False)
if hasattr(os, "symlink"):[](#l2.25)
if symlink_support.can_symlink():[](#l2.26) os.symlink(test_support.TESTFN + "1", test_support.TESTFN + "2")[](#l2.27) self.assertIs(posixpath.islink(test_support.TESTFN + "2"), True)[](#l2.28) os.remove(test_support.TESTFN + "1")[](#l2.29)
@@ -196,6 +202,64 @@ class PosixPathTest(unittest.TestCase): def test_ismount(self): self.assertIs(posixpath.ismount("/"), True)
- def test_ismount_non_existent(self):
# Non-existent mountpoint.[](#l2.35)
self.assertIs(posixpath.ismount(ABSTFN), False)[](#l2.36)
try:[](#l2.37)
os.mkdir(ABSTFN)[](#l2.38)
self.assertIs(posixpath.ismount(ABSTFN), False)[](#l2.39)
finally:[](#l2.40)
safe_rmdir(ABSTFN)[](#l2.41)
- @symlink_support.skip_unless_symlink
- def test_ismount_symlinks(self):
# Symlinks are never mountpoints.[](#l2.45)
try:[](#l2.46)
os.symlink("/", ABSTFN)[](#l2.47)
self.assertIs(posixpath.ismount(ABSTFN), False)[](#l2.48)
finally:[](#l2.49)
os.unlink(ABSTFN)[](#l2.50)
- @unittest.skipIf(posix is None, "Test requires posix module")
- def test_ismount_different_device(self):
# Simulate the path being on a different device from its parent by[](#l2.54)
# mocking out st_dev.[](#l2.55)
save_lstat = os.lstat[](#l2.56)
def fake_lstat(path):[](#l2.57)
st_ino = 0[](#l2.58)
st_dev = 0[](#l2.59)
if path == ABSTFN:[](#l2.60)
st_dev = 1[](#l2.61)
st_ino = 1[](#l2.62)
return posix.stat_result((0, st_ino, st_dev, 0, 0, 0, 0, 0, 0, 0))[](#l2.63)
try:[](#l2.64)
os.lstat = fake_lstat[](#l2.65)
self.assertIs(posixpath.ismount(ABSTFN), True)[](#l2.66)
finally:[](#l2.67)
os.lstat = save_lstat[](#l2.68)
- @unittest.skipIf(posix is None, "Test requires posix module")
- def test_ismount_directory_not_readable(self):
# issue #2466: Simulate ismount run on a directory that is not[](#l2.72)
# readable, which used to return False.[](#l2.73)
save_lstat = os.lstat[](#l2.74)
def fake_lstat(path):[](#l2.75)
st_ino = 0[](#l2.76)
st_dev = 0[](#l2.77)
if path.startswith(ABSTFN) and path != ABSTFN:[](#l2.78)
# ismount tries to read something inside the ABSTFN directory;[](#l2.79)
# simulate this being forbidden (no read permission).[](#l2.80)
raise OSError("Fake [Errno 13] Permission denied")[](#l2.81)
if path == ABSTFN:[](#l2.82)
st_dev = 1[](#l2.83)
st_ino = 1[](#l2.84)
return posix.stat_result((0, st_ino, st_dev, 0, 0, 0, 0, 0, 0, 0))[](#l2.85)
try:[](#l2.86)
os.lstat = fake_lstat[](#l2.87)
self.assertIs(posixpath.ismount(ABSTFN), True)[](#l2.88)
finally:[](#l2.89)
os.lstat = save_lstat[](#l2.90)
+ def test_expanduser(self): self.assertEqual(posixpath.expanduser("foo"), "foo") with test_support.EnvironmentVarGuard() as env:
--- a/Misc/ACKS +++ b/Misc/ACKS @@ -1186,6 +1186,7 @@ Guido van Rossum Just van Rossum Hugo van Rossum Saskia van Rossum +Robin Roth Clement Rouault Donald Wallace Rouse II Liam Routt
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -33,6 +33,9 @@ Core and Builtins Library ------- +- Issue #2466: posixpath.ismount now correctly recognizes mount points which