mirror of
https://github.com/python/cpython.git
synced 2025-11-03 03:22:27 +00:00
Issue #21549: Added the "members" parameter to TarFile.list().
This commit is contained in:
parent
48ad7c0b01
commit
a7eb746278
4 changed files with 26 additions and 5 deletions
|
|
@ -325,11 +325,15 @@ be finalized; only the internally used file object will be closed. See the
|
||||||
returned by :meth:`getmembers`.
|
returned by :meth:`getmembers`.
|
||||||
|
|
||||||
|
|
||||||
.. method:: TarFile.list(verbose=True)
|
.. method:: TarFile.list(verbose=True, *, members=None)
|
||||||
|
|
||||||
Print a table of contents to ``sys.stdout``. If *verbose* is :const:`False`,
|
Print a table of contents to ``sys.stdout``. If *verbose* is :const:`False`,
|
||||||
only the names of the members are printed. If it is :const:`True`, output
|
only the names of the members are printed. If it is :const:`True`, output
|
||||||
similar to that of :program:`ls -l` is produced.
|
similar to that of :program:`ls -l` is produced. If optional *members* is
|
||||||
|
given, it must be a subset of the list returned by :meth:`getmembers`.
|
||||||
|
|
||||||
|
.. versionchanged:: 3.5
|
||||||
|
Added the *members* parameter.
|
||||||
|
|
||||||
|
|
||||||
.. method:: TarFile.next()
|
.. method:: TarFile.next()
|
||||||
|
|
|
||||||
|
|
@ -1842,14 +1842,17 @@ class TarFile(object):
|
||||||
tarinfo.devminor = os.minor(statres.st_rdev)
|
tarinfo.devminor = os.minor(statres.st_rdev)
|
||||||
return tarinfo
|
return tarinfo
|
||||||
|
|
||||||
def list(self, verbose=True):
|
def list(self, verbose=True, *, members=None):
|
||||||
"""Print a table of contents to sys.stdout. If `verbose' is False, only
|
"""Print a table of contents to sys.stdout. If `verbose' is False, only
|
||||||
the names of the members are printed. If it is True, an `ls -l'-like
|
the names of the members are printed. If it is True, an `ls -l'-like
|
||||||
output is produced.
|
output is produced. `members' is optional and must be a subset of the
|
||||||
|
list returned by getmembers().
|
||||||
"""
|
"""
|
||||||
self._check()
|
self._check()
|
||||||
|
|
||||||
for tarinfo in self:
|
if members is None:
|
||||||
|
members = self
|
||||||
|
for tarinfo in members:
|
||||||
if verbose:
|
if verbose:
|
||||||
_safe_print(stat.filemode(tarinfo.mode))
|
_safe_print(stat.filemode(tarinfo.mode))
|
||||||
_safe_print("%s/%s" % (tarinfo.uname or tarinfo.uid,
|
_safe_print("%s/%s" % (tarinfo.uname or tarinfo.uid,
|
||||||
|
|
|
||||||
|
|
@ -285,6 +285,18 @@ class ListTest(ReadTest, unittest.TestCase):
|
||||||
self.assertIn(b'pax' + (b'/123' * 125) + b'/longlink link to pax' +
|
self.assertIn(b'pax' + (b'/123' * 125) + b'/longlink link to pax' +
|
||||||
(b'/123' * 125) + b'/longname', out)
|
(b'/123' * 125) + b'/longname', out)
|
||||||
|
|
||||||
|
def test_list_members(self):
|
||||||
|
tio = io.TextIOWrapper(io.BytesIO(), 'ascii', newline='\n')
|
||||||
|
def members(tar):
|
||||||
|
for tarinfo in tar.getmembers():
|
||||||
|
if 'reg' in tarinfo.name:
|
||||||
|
yield tarinfo
|
||||||
|
with support.swap_attr(sys, 'stdout', tio):
|
||||||
|
self.tar.list(verbose=False, members=members(self.tar))
|
||||||
|
out = tio.detach().getvalue()
|
||||||
|
self.assertIn(b'ustar/regtype', out)
|
||||||
|
self.assertNotIn(b'ustar/conttype', out)
|
||||||
|
|
||||||
|
|
||||||
class GzipListTest(GzipTest, ListTest):
|
class GzipListTest(GzipTest, ListTest):
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #21549: Added the "members" parameter to TarFile.list().
|
||||||
|
|
||||||
- Issue #19628: Allow compileall recursion depth to be specified with a -r
|
- Issue #19628: Allow compileall recursion depth to be specified with a -r
|
||||||
option.
|
option.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue