Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
ce644a09
Commit
ce644a09
authored
Jan 18, 2014
by
Serhiy Storchaka
Browse files
Options
Browse Files
Download
Plain Diff
Issue #20245: The open functions in the tarfile module now correctly handle empty mode.
parents
537d7607
53ad0cd2
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
25 additions
and
7 deletions
+25
-7
Lib/tarfile.py
Lib/tarfile.py
+8
-7
Lib/test/test_tarfile.py
Lib/test/test_tarfile.py
+14
-0
Misc/NEWS
Misc/NEWS
+3
-0
No files found.
Lib/tarfile.py
View file @
ce644a09
...
...
@@ -1405,10 +1405,11 @@ class TarFile(object):
can be determined, `mode' is overridden by `fileobj's mode.
`fileobj' is not closed, when TarFile is closed.
"""
if len(mode) > 1 or mode not in "
raw
":
modes = {"r": "rb", "
a
": "
r
+
b", "
w
": "
wb
"}
if mode not in modes:
raise ValueError("
mode
must
be
'r'
,
'a'
or
'w'")
self.mode = mode
self._mode =
{"r": "rb", "
a
": "
r
+
b", "
w
": "
wb
"}
[mode]
self._mode =
modes
[mode]
if not fileobj:
if self.mode == "
a
" and not os.path.exists(name):
...
...
@@ -1564,7 +1565,7 @@ class TarFile(object):
filemode = filemode or "r"
comptype = comptype or "
tar
"
if filemode not in
"
rw
"
:
if filemode not in
("r", "
w
")
:
raise ValueError("
mode
must
be
'r'
or
'w'")
stream = _Stream(name, filemode, comptype, fileobj, bufsize)
...
...
@@ -1576,7 +1577,7 @@ class TarFile(object):
t._extfileobj = False
return t
elif mode in
"
aw
"
:
elif mode in
("
a
", "
w
")
:
return cls.taropen(name, mode, fileobj, **kwargs)
raise ValueError("
undiscernible
mode
")
...
...
@@ -1585,7 +1586,7 @@ class TarFile(object):
def taropen(cls, name, mode="r", fileobj=None, **kwargs):
"""Open uncompressed tar archive name for reading or writing.
"""
if
len(mode) > 1 or mode not in "
raw
"
:
if
mode not in ("r", "
a
", "
w
")
:
raise ValueError("
mode
must
be
'r'
,
'a'
or
'w'")
return cls(name, mode, fileobj, **kwargs)
...
...
@@ -1594,7 +1595,7 @@ class TarFile(object):
"""Open gzip compressed tar archive name for reading or writing.
Appending is not allowed.
"""
if
len(mode) > 1 or mode not in "
rw
"
:
if
mode not in ("r", "
w
")
:
raise ValueError("
mode
must
be
'r'
or
'w'")
try:
...
...
@@ -1625,7 +1626,7 @@ class TarFile(object):
"""Open bzip2 compressed tar archive name for reading or writing.
Appending is not allowed.
"""
if
len(mode) > 1 or mode not in "
rw
"
:
if
mode not in ("r", "
w
")
:
raise ValueError("
mode
must
be
'r'
or
'w'
.
")
try:
...
...
Lib/test/test_tarfile.py
View file @
ce644a09
...
...
@@ -43,6 +43,7 @@ class TarTest:
tarname
=
tarname
suffix
=
''
open
=
io
.
FileIO
taropen
=
tarfile
.
TarFile
.
taropen
@
property
def
mode
(
self
):
...
...
@@ -53,18 +54,21 @@ class GzipTest:
tarname
=
gzipname
suffix
=
'gz'
open
=
gzip
.
GzipFile
if
gzip
else
None
taropen
=
tarfile
.
TarFile
.
gzopen
@
support
.
requires_bz2
class
Bz2Test
:
tarname
=
bz2name
suffix
=
'bz2'
open
=
bz2
.
BZ2File
if
bz2
else
None
taropen
=
tarfile
.
TarFile
.
bz2open
@
support
.
requires_lzma
class
LzmaTest
:
tarname
=
xzname
suffix
=
'xz'
open
=
lzma
.
LZMAFile
if
lzma
else
None
taropen
=
tarfile
.
TarFile
.
xzopen
class
ReadTest
(
TarTest
):
...
...
@@ -289,6 +293,16 @@ class MiscReadTestBase(CommonReadTest):
with
tarfile
.
open
(
fileobj
=
fobj
,
mode
=
self
.
mode
)
as
tar
:
self
.
assertEqual
(
tar
.
name
,
None
)
def
test_illegal_mode_arg
(
self
):
with
open
(
tmpname
,
'wb'
):
pass
with
self
.
assertRaisesRegex
(
ValueError
,
'mode must be '
):
tar
=
self
.
taropen
(
tmpname
,
'q'
)
with
self
.
assertRaisesRegex
(
ValueError
,
'mode must be '
):
tar
=
self
.
taropen
(
tmpname
,
'rw'
)
with
self
.
assertRaisesRegex
(
ValueError
,
'mode must be '
):
tar
=
self
.
taropen
(
tmpname
,
''
)
def
test_fileobj_with_offset
(
self
):
# Skip the first member and store values from the second member
# of the testtar.
...
...
Misc/NEWS
View file @
ce644a09
...
...
@@ -25,6 +25,9 @@ Core and Builtins
Library
-------
- Issue #20245: The open functions in the tarfile module now correctly handle
empty mode.
- Issue #20242: Fixed basicConfig() format strings for the alternative
formatting styles. Thanks to kespindler for the bug report and patch.
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment