mirror of https://github.com/python/cpython
#14807: move undocumented tarfile.filemode() to stat.filemode(). Add tarfile.filemode alias with deprecation warning.
This commit is contained in:
parent
41829e82c1
commit
ffa1d0b8d5
|
@ -104,6 +104,16 @@ Example::
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
walktree(sys.argv[1], visitfile)
|
walktree(sys.argv[1], visitfile)
|
||||||
|
|
||||||
|
An additional utility function is provided to covert a file's mode in a human
|
||||||
|
readable string:
|
||||||
|
|
||||||
|
.. function:: filemode(mode)
|
||||||
|
|
||||||
|
Convert a file's mode to a string of the form '-rwxrwxrwx'.
|
||||||
|
|
||||||
|
.. versionadded:: 3.3
|
||||||
|
|
||||||
|
|
||||||
All the variables below are simply symbolic indexes into the 10-tuple returned
|
All the variables below are simply symbolic indexes into the 10-tuple returned
|
||||||
by :func:`os.stat`, :func:`os.fstat` or :func:`os.lstat`.
|
by :func:`os.stat`, :func:`os.fstat` or :func:`os.lstat`.
|
||||||
|
|
||||||
|
@ -344,4 +354,3 @@ The following flags can be used in the *flags* argument of :func:`os.chflags`:
|
||||||
The file is a snapshot file.
|
The file is a snapshot file.
|
||||||
|
|
||||||
See the \*BSD or Mac OS systems man page :manpage:`chflags(2)` for more information.
|
See the \*BSD or Mac OS systems man page :manpage:`chflags(2)` for more information.
|
||||||
|
|
||||||
|
|
|
@ -1177,6 +1177,14 @@ ssl
|
||||||
|
|
||||||
(Contributed by Colin Marc in :issue:`14204`)
|
(Contributed by Colin Marc in :issue:`14204`)
|
||||||
|
|
||||||
|
stat
|
||||||
|
----
|
||||||
|
|
||||||
|
- The undocumented tarfile.filemode function has been moved to
|
||||||
|
:func:`stat.filemode`. It can be used to convert a file's mode to a string of
|
||||||
|
the form '-rwxrwxrwx'.
|
||||||
|
|
||||||
|
(Contributed by Giampaolo Rodolà in :issue:`14807`)
|
||||||
|
|
||||||
sys
|
sys
|
||||||
---
|
---
|
||||||
|
|
40
Lib/stat.py
40
Lib/stat.py
|
@ -107,3 +107,43 @@ SF_IMMUTABLE = 0x00020000 # file may not be changed
|
||||||
SF_APPEND = 0x00040000 # file may only be appended to
|
SF_APPEND = 0x00040000 # file may only be appended to
|
||||||
SF_NOUNLINK = 0x00100000 # file may not be renamed or deleted
|
SF_NOUNLINK = 0x00100000 # file may not be renamed or deleted
|
||||||
SF_SNAPSHOT = 0x00200000 # file is a snapshot file
|
SF_SNAPSHOT = 0x00200000 # file is a snapshot file
|
||||||
|
|
||||||
|
|
||||||
|
_filemode_table = (
|
||||||
|
((S_IFLNK, "l"),
|
||||||
|
(S_IFREG, "-"),
|
||||||
|
(S_IFBLK, "b"),
|
||||||
|
(S_IFDIR, "d"),
|
||||||
|
(S_IFCHR, "c"),
|
||||||
|
(S_IFIFO, "p")),
|
||||||
|
|
||||||
|
((S_IRUSR, "r"),),
|
||||||
|
((S_IWUSR, "w"),),
|
||||||
|
((S_IXUSR|S_ISUID, "s"),
|
||||||
|
(S_ISUID, "S"),
|
||||||
|
(S_IXUSR, "x")),
|
||||||
|
|
||||||
|
((S_IRGRP, "r"),),
|
||||||
|
((S_IWGRP, "w"),),
|
||||||
|
((S_IXGRP|S_ISGID, "s"),
|
||||||
|
(S_ISGID, "S"),
|
||||||
|
(S_IXGRP, "x")),
|
||||||
|
|
||||||
|
((S_IROTH, "r"),),
|
||||||
|
((S_IWOTH, "w"),),
|
||||||
|
((S_IXOTH|S_ISVTX, "t"),
|
||||||
|
(S_ISVTX, "T"),
|
||||||
|
(S_IXOTH, "x"))
|
||||||
|
)
|
||||||
|
|
||||||
|
def filemode(mode):
|
||||||
|
"""Convert a file's mode to a string of the form '-rwxrwxrwx'."""
|
||||||
|
perm = []
|
||||||
|
for table in _filemode_table:
|
||||||
|
for bit, char in table:
|
||||||
|
if mode & bit == bit:
|
||||||
|
perm.append(char)
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
perm.append("-")
|
||||||
|
return "".join(perm)
|
||||||
|
|
|
@ -274,47 +274,13 @@ def copyfileobj(src, dst, length=None):
|
||||||
dst.write(buf)
|
dst.write(buf)
|
||||||
return
|
return
|
||||||
|
|
||||||
filemode_table = (
|
|
||||||
((S_IFLNK, "l"),
|
|
||||||
(S_IFREG, "-"),
|
|
||||||
(S_IFBLK, "b"),
|
|
||||||
(S_IFDIR, "d"),
|
|
||||||
(S_IFCHR, "c"),
|
|
||||||
(S_IFIFO, "p")),
|
|
||||||
|
|
||||||
((TUREAD, "r"),),
|
|
||||||
((TUWRITE, "w"),),
|
|
||||||
((TUEXEC|TSUID, "s"),
|
|
||||||
(TSUID, "S"),
|
|
||||||
(TUEXEC, "x")),
|
|
||||||
|
|
||||||
((TGREAD, "r"),),
|
|
||||||
((TGWRITE, "w"),),
|
|
||||||
((TGEXEC|TSGID, "s"),
|
|
||||||
(TSGID, "S"),
|
|
||||||
(TGEXEC, "x")),
|
|
||||||
|
|
||||||
((TOREAD, "r"),),
|
|
||||||
((TOWRITE, "w"),),
|
|
||||||
((TOEXEC|TSVTX, "t"),
|
|
||||||
(TSVTX, "T"),
|
|
||||||
(TOEXEC, "x"))
|
|
||||||
)
|
|
||||||
|
|
||||||
def filemode(mode):
|
def filemode(mode):
|
||||||
"""Convert a file's mode to a string of the form
|
"""Deprecated in this location; use stat.filemode."""
|
||||||
-rwxrwxrwx.
|
import warnings
|
||||||
Used by TarFile.list()
|
warnings.warn("deprecated in favor of stat.filemode",
|
||||||
"""
|
DeprecationWarning, 2)
|
||||||
perm = []
|
return stat.filemode(mode)
|
||||||
for table in filemode_table:
|
|
||||||
for bit, char in table:
|
|
||||||
if mode & bit == bit:
|
|
||||||
perm.append(char)
|
|
||||||
break
|
|
||||||
else:
|
|
||||||
perm.append("-")
|
|
||||||
return "".join(perm)
|
|
||||||
|
|
||||||
class TarError(Exception):
|
class TarError(Exception):
|
||||||
"""Base exception."""
|
"""Base exception."""
|
||||||
|
@ -1891,7 +1857,7 @@ class TarFile(object):
|
||||||
|
|
||||||
for tarinfo in self:
|
for tarinfo in self:
|
||||||
if verbose:
|
if verbose:
|
||||||
print(filemode(tarinfo.mode), end=' ')
|
print(stat.filemode(tarinfo.mode), end=' ')
|
||||||
print("%s/%s" % (tarinfo.uname or tarinfo.uid,
|
print("%s/%s" % (tarinfo.uname or tarinfo.uid,
|
||||||
tarinfo.gname or tarinfo.gid), end=' ')
|
tarinfo.gname or tarinfo.gid), end=' ')
|
||||||
if tarinfo.ischr() or tarinfo.isblk():
|
if tarinfo.ischr() or tarinfo.isblk():
|
||||||
|
|
|
@ -0,0 +1,55 @@
|
||||||
|
import unittest
|
||||||
|
import os
|
||||||
|
import stat
|
||||||
|
from test.support import TESTFN, run_unittest
|
||||||
|
|
||||||
|
|
||||||
|
def get_mode(fname=TESTFN):
|
||||||
|
return stat.filemode(os.lstat(fname).st_mode)
|
||||||
|
|
||||||
|
|
||||||
|
class TestFilemode(unittest.TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
try:
|
||||||
|
os.remove(TESTFN)
|
||||||
|
except OSError:
|
||||||
|
try:
|
||||||
|
os.rmdir(TESTFN)
|
||||||
|
except OSError:
|
||||||
|
pass
|
||||||
|
tearDown = setUp
|
||||||
|
|
||||||
|
def test_mode(self):
|
||||||
|
with open(TESTFN, 'w'):
|
||||||
|
pass
|
||||||
|
os.chmod(TESTFN, 0o700)
|
||||||
|
self.assertEqual(get_mode(), '-rwx------')
|
||||||
|
os.chmod(TESTFN, 0o070)
|
||||||
|
self.assertEqual(get_mode(), '----rwx---')
|
||||||
|
os.chmod(TESTFN, 0o007)
|
||||||
|
self.assertEqual(get_mode(), '-------rwx')
|
||||||
|
os.chmod(TESTFN, 0o444)
|
||||||
|
self.assertEqual(get_mode(), '-r--r--r--')
|
||||||
|
|
||||||
|
def test_directory(self):
|
||||||
|
os.mkdir(TESTFN)
|
||||||
|
os.chmod(TESTFN, 0o700)
|
||||||
|
self.assertEqual(get_mode(), 'drwx------')
|
||||||
|
|
||||||
|
@unittest.skipUnless(hasattr(os, 'symlink'), 'os.symlink not available')
|
||||||
|
def test_link(self):
|
||||||
|
os.symlink(os.getcwd(), TESTFN)
|
||||||
|
self.assertEqual(get_mode(), 'lrwxrwxrwx')
|
||||||
|
|
||||||
|
@unittest.skipUnless(hasattr(os, 'mkfifo'), 'os.mkfifo not available')
|
||||||
|
def test_fifo(self):
|
||||||
|
os.mkfifo(TESTFN, 0o700)
|
||||||
|
self.assertEqual(get_mode(), 'prwx------')
|
||||||
|
|
||||||
|
|
||||||
|
def test_main():
|
||||||
|
run_unittest(TestFilemode)
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
test_main()
|
|
@ -31,10 +31,13 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue 14807: move undocumented tarfile.filemode() to stat.filemode() and add
|
||||||
|
doc entry. Add tarfile.filemode alias with deprecation warning.
|
||||||
|
|
||||||
- Issue #13815: TarFile.extractfile() now returns io.BufferedReader objects.
|
- Issue #13815: TarFile.extractfile() now returns io.BufferedReader objects.
|
||||||
|
|
||||||
- Issue #14532: Add a secure_compare() helper to the hmac module, to mitigate
|
- Issue #14532: Add a secure_compare() helper to the hmac module, to mitigate
|
||||||
timing attacks. Patch by Jon Oberheide.
|
timing attacks. Patch by Jon Oberheide.
|
||||||
|
|
||||||
- Add importlib.util.resolve_name().
|
- Add importlib.util.resolve_name().
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue