mirror of https://github.com/python/cpython
gh-108638: Fix stat.filemode() when _stat is missing (#108639)
Change the pure Python implementation of stat.filemode() for unknown file type: use "?", as done by the _stat.filemode(). test_stat skips TestFilemodeCStat if the _stat extension is missing.
This commit is contained in:
parent
7659128b9d
commit
b62a76043e
10
Lib/stat.py
10
Lib/stat.py
|
@ -126,6 +126,8 @@ SF_SNAPSHOT = 0x00200000 # file is a snapshot file
|
|||
|
||||
|
||||
_filemode_table = (
|
||||
# File type chars according to:
|
||||
# http://en.wikibooks.org/wiki/C_Programming/POSIX_Reference/sys/stat.h
|
||||
((S_IFLNK, "l"),
|
||||
(S_IFSOCK, "s"), # Must appear before IFREG and IFDIR as IFSOCK == IFREG | IFDIR
|
||||
(S_IFREG, "-"),
|
||||
|
@ -156,13 +158,17 @@ _filemode_table = (
|
|||
def filemode(mode):
|
||||
"""Convert a file's mode to a string of the form '-rwxrwxrwx'."""
|
||||
perm = []
|
||||
for table in _filemode_table:
|
||||
for index, table in enumerate(_filemode_table):
|
||||
for bit, char in table:
|
||||
if mode & bit == bit:
|
||||
perm.append(char)
|
||||
break
|
||||
else:
|
||||
perm.append("-")
|
||||
if index == 0:
|
||||
# Unknown filetype
|
||||
perm.append("?")
|
||||
else:
|
||||
perm.append("-")
|
||||
return "".join(perm)
|
||||
|
||||
|
||||
|
|
|
@ -122,8 +122,11 @@ class TestFilemode:
|
|||
st_mode, modestr = self.get_mode()
|
||||
self.assertEqual(modestr, '-rwx------')
|
||||
self.assertS_IS("REG", st_mode)
|
||||
self.assertEqual(self.statmod.S_IMODE(st_mode),
|
||||
imode = self.statmod.S_IMODE(st_mode)
|
||||
self.assertEqual(imode,
|
||||
self.statmod.S_IRWXU)
|
||||
self.assertEqual(self.statmod.filemode(imode),
|
||||
'?rwx------')
|
||||
|
||||
os.chmod(TESTFN, 0o070)
|
||||
st_mode, modestr = self.get_mode()
|
||||
|
@ -238,6 +241,7 @@ class TestFilemode:
|
|||
self.assertEqual(value, modvalue, key)
|
||||
|
||||
|
||||
@unittest.skipIf(c_stat is None, 'need _stat extension')
|
||||
class TestFilemodeCStat(TestFilemode, unittest.TestCase):
|
||||
statmod = c_stat
|
||||
|
||||
|
|
Loading…
Reference in New Issue