Kaydet (Commit) a7eb7462 authored tarafından Serhiy Storchaka's avatar Serhiy Storchaka

Issue #21549: Added the "members" parameter to TarFile.list().

üst 48ad7c0b
...@@ -325,11 +325,15 @@ be finalized; only the internally used file object will be closed. See the ...@@ -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): ...@@ -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): ...@@ -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 ...@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment