summaryrefslogtreecommitdiffstats
path: root/Lib/tarfile.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2014-02-05 18:53:36 (GMT)
committerSerhiy Storchaka <storchaka@gmail.com>2014-02-05 18:53:36 (GMT)
commit3b4f1594ffb360e9a93841a4c8dfe00d6f519bf6 (patch)
tree439b437cda7cc2f69f9e4f069e56dab4ca9b1f7b /Lib/tarfile.py
parent1812bd44d5cada6e8058c56fb13bba7be919c40d (diff)
downloadcpython-3b4f1594ffb360e9a93841a4c8dfe00d6f519bf6.zip
cpython-3b4f1594ffb360e9a93841a4c8dfe00d6f519bf6.tar.gz
cpython-3b4f1594ffb360e9a93841a4c8dfe00d6f519bf6.tar.bz2
Issue #19920: TarFile.list() no longer fails when outputs a listing
containing non-encodable characters. Added tests for TarFile.list(). Based on patch by Vajrasky Kok.
Diffstat (limited to 'Lib/tarfile.py')
-rwxr-xr-xLib/tarfile.py28
1 files changed, 17 insertions, 11 deletions
diff --git a/Lib/tarfile.py b/Lib/tarfile.py
index d31bc70..f6d7f79 100755
--- a/Lib/tarfile.py
+++ b/Lib/tarfile.py
@@ -281,6 +281,12 @@ def filemode(mode):
DeprecationWarning, 2)
return stat.filemode(mode)
+def _safe_print(s):
+ encoding = getattr(sys.stdout, 'encoding', None)
+ if encoding is not None:
+ s = s.encode(encoding, 'backslashreplace').decode(encoding)
+ print(s, end=' ')
+
class TarError(Exception):
"""Base exception."""
@@ -1870,24 +1876,24 @@ class TarFile(object):
for tarinfo in self:
if verbose:
- print(stat.filemode(tarinfo.mode), end=' ')
- print("%s/%s" % (tarinfo.uname or tarinfo.uid,
- tarinfo.gname or tarinfo.gid), end=' ')
+ _safe_print(stat.filemode(tarinfo.mode))
+ _safe_print("%s/%s" % (tarinfo.uname or tarinfo.uid,
+ tarinfo.gname or tarinfo.gid))
if tarinfo.ischr() or tarinfo.isblk():
- print("%10s" % ("%d,%d" \
- % (tarinfo.devmajor, tarinfo.devminor)), end=' ')
+ _safe_print("%10s" %
+ ("%d,%d" % (tarinfo.devmajor, tarinfo.devminor)))
else:
- print("%10d" % tarinfo.size, end=' ')
- print("%d-%02d-%02d %02d:%02d:%02d" \
- % time.localtime(tarinfo.mtime)[:6], end=' ')
+ _safe_print("%10d" % tarinfo.size)
+ _safe_print("%d-%02d-%02d %02d:%02d:%02d" \
+ % time.localtime(tarinfo.mtime)[:6])
- print(tarinfo.name + ("/" if tarinfo.isdir() else ""), end=' ')
+ _safe_print(tarinfo.name + ("/" if tarinfo.isdir() else ""))
if verbose:
if tarinfo.issym():
- print("->", tarinfo.linkname, end=' ')
+ _safe_print("-> " + tarinfo.linkname)
if tarinfo.islnk():
- print("link to", tarinfo.linkname, end=' ')
+ _safe_print("link to " + tarinfo.linkname)
print()
def add(self, name, arcname=None, recursive=True, exclude=None, *, filter=None):