mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #6975: os.path.realpath() now correctly resolves multiple nested symlinks on POSIX platforms.
This commit is contained in:
parent
4de7457009
commit
df32691e6f
3 changed files with 104 additions and 38 deletions
|
@ -375,6 +375,22 @@ class PosixPathTest(unittest.TestCase):
|
|||
self.assertEqual(realpath(ABSTFN+"1"), ABSTFN+"1")
|
||||
self.assertEqual(realpath(ABSTFN+"2"), ABSTFN+"2")
|
||||
|
||||
self.assertEqual(realpath(ABSTFN+"1/x"), ABSTFN+"1/x")
|
||||
self.assertEqual(realpath(ABSTFN+"1/.."), dirname(ABSTFN))
|
||||
self.assertEqual(realpath(ABSTFN+"1/../x"), dirname(ABSTFN) + "/x")
|
||||
os.symlink(ABSTFN+"x", ABSTFN+"y")
|
||||
self.assertEqual(realpath(ABSTFN+"1/../" + basename(ABSTFN) + "y"),
|
||||
ABSTFN + "y")
|
||||
self.assertEqual(realpath(ABSTFN+"1/../" + basename(ABSTFN) + "1"),
|
||||
ABSTFN + "1")
|
||||
|
||||
os.symlink(basename(ABSTFN) + "a/b", ABSTFN+"a")
|
||||
self.assertEqual(realpath(ABSTFN+"a"), ABSTFN+"a/b")
|
||||
|
||||
os.symlink("../" + basename(dirname(ABSTFN)) + "/" +
|
||||
basename(ABSTFN) + "c", ABSTFN+"c")
|
||||
self.assertEqual(realpath(ABSTFN+"c"), ABSTFN+"c")
|
||||
|
||||
# Test using relative path as well.
|
||||
os.chdir(dirname(ABSTFN))
|
||||
self.assertEqual(realpath(basename(ABSTFN)), ABSTFN)
|
||||
|
@ -383,6 +399,45 @@ class PosixPathTest(unittest.TestCase):
|
|||
support.unlink(ABSTFN)
|
||||
support.unlink(ABSTFN+"1")
|
||||
support.unlink(ABSTFN+"2")
|
||||
support.unlink(ABSTFN+"y")
|
||||
support.unlink(ABSTFN+"c")
|
||||
|
||||
@unittest.skipUnless(hasattr(os, "symlink"),
|
||||
"Missing symlink implementation")
|
||||
@skip_if_ABSTFN_contains_backslash
|
||||
def test_realpath_repeated_indirect_symlinks(self):
|
||||
# Issue #6975.
|
||||
try:
|
||||
os.mkdir(ABSTFN)
|
||||
os.symlink('../' + basename(ABSTFN), ABSTFN + '/self')
|
||||
os.symlink('self/self/self', ABSTFN + '/link')
|
||||
self.assertEqual(realpath(ABSTFN + '/link'), ABSTFN)
|
||||
finally:
|
||||
support.unlink(ABSTFN + '/self')
|
||||
support.unlink(ABSTFN + '/link')
|
||||
safe_rmdir(ABSTFN)
|
||||
|
||||
@unittest.skipUnless(hasattr(os, "symlink"),
|
||||
"Missing symlink implementation")
|
||||
@skip_if_ABSTFN_contains_backslash
|
||||
def test_realpath_deep_recursion(self):
|
||||
depth = 10
|
||||
old_path = abspath('.')
|
||||
try:
|
||||
os.mkdir(ABSTFN)
|
||||
for i in range(depth):
|
||||
os.symlink('/'.join(['%d' % i] * 10), ABSTFN + '/%d' % (i + 1))
|
||||
os.symlink('.', ABSTFN + '/0')
|
||||
self.assertEqual(realpath(ABSTFN + '/%d' % depth), ABSTFN)
|
||||
|
||||
# Test using relative path as well.
|
||||
os.chdir(ABSTFN)
|
||||
self.assertEqual(realpath('%d' % depth), ABSTFN)
|
||||
finally:
|
||||
os.chdir(old_path)
|
||||
for i in range(depth + 1):
|
||||
support.unlink(ABSTFN + '/%d' % i)
|
||||
safe_rmdir(ABSTFN)
|
||||
|
||||
@unittest.skipUnless(hasattr(os, "symlink"),
|
||||
"Missing symlink implementation")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue