Merged revisions 65659,65693,65700,65702,65706-65707,65761 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r65659 | martin.v.loewis | 2008-08-12 15:45:21 -0500 (Tue, 12 Aug 2008) | 2 lines Add Hirokazu Yamamoto. ........ r65693 | georg.brandl | 2008-08-15 13:35:09 -0500 (Fri, 15 Aug 2008) | 2 lines #3558: Attribute reference binds more tightly than subscription and call. ........ r65700 | antoine.pitrou | 2008-08-15 16:03:21 -0500 (Fri, 15 Aug 2008) | 3 lines #2676: email/message.py [Message.get_content_type]: Trivial regex hangs on pathological input ........ r65702 | gregory.p.smith | 2008-08-15 18:14:00 -0500 (Fri, 15 Aug 2008) | 2 lines document that waitpid raises OSError ........ r65706 | benjamin.peterson | 2008-08-15 22:02:41 -0500 (Fri, 15 Aug 2008) | 1 line fix markup ........ r65707 | benjamin.peterson | 2008-08-15 22:13:07 -0500 (Fri, 15 Aug 2008) | 1 line note how os.utime should be used for emulating touch ........ r65761 | antoine.pitrou | 2008-08-17 08:06:29 -0500 (Sun, 17 Aug 2008) | 3 lines fix ZipFile.testzip() to work with very large embedded files ........
This commit is contained in:
parent
9209138ff9
commit
4cd6a95dfe
@ -1076,15 +1076,16 @@ Files and Directories
|
|||||||
|
|
||||||
.. function:: utime(path, times)
|
.. function:: utime(path, times)
|
||||||
|
|
||||||
Set the access and modified times of the file specified by *path*. If *times* is
|
Set the access and modified times of the file specified by *path*. If *times*
|
||||||
``None``, then the file's access and modified times are set to the current time.
|
is ``None``, then the file's access and modified times are set to the current
|
||||||
Otherwise, *times* must be a 2-tuple of numbers, of the form ``(atime, mtime)``
|
time. (The effect is similar to running the Unix program :program:`touch` on
|
||||||
which is used to set the access and modified times, respectively. Whether a
|
the path.) Otherwise, *times* must be a 2-tuple of numbers, of the form
|
||||||
directory can be given for *path* depends on whether the operating system
|
``(atime, mtime)`` which is used to set the access and modified times,
|
||||||
implements directories as files (for example, Windows does not). Note that the
|
respectively. Whether a directory can be given for *path* depends on whether
|
||||||
exact times you set here may not be returned by a subsequent :func:`stat` call,
|
the operating system implements directories as files (for example, Windows
|
||||||
depending on the resolution with which your operating system records access and
|
does not). Note that the exact times you set here may not be returned by a
|
||||||
modification times; see :func:`stat`.
|
subsequent :func:`stat` call, depending on the resolution with which your
|
||||||
|
operating system records access and modification times; see :func:`stat`.
|
||||||
|
|
||||||
Availability: Macintosh, Unix, Windows.
|
Availability: Macintosh, Unix, Windows.
|
||||||
|
|
||||||
@ -1596,6 +1597,9 @@ written in Python, such as a mail server's external command delivery program.
|
|||||||
``-1``, status is requested for any process in the process group ``-pid`` (the
|
``-1``, status is requested for any process in the process group ``-pid`` (the
|
||||||
absolute value of *pid*).
|
absolute value of *pid*).
|
||||||
|
|
||||||
|
An :exc:`OSError` is raised with the value of errno when the syscall
|
||||||
|
returns -1.
|
||||||
|
|
||||||
On Windows: Wait for completion of a process given by process handle *pid*, and
|
On Windows: Wait for completion of a process given by process handle *pid*, and
|
||||||
return a tuple containing *pid*, and its exit status shifted left by 8 bits
|
return a tuple containing *pid*, and its exit status shifted left by 8 bits
|
||||||
(shifting makes cross-platform use of the function easier). A *pid* less than or
|
(shifting makes cross-platform use of the function easier). A *pid* less than or
|
||||||
|
@ -1266,13 +1266,13 @@ groups from right to left).
|
|||||||
+----------------------------------------------+-------------------------------------+
|
+----------------------------------------------+-------------------------------------+
|
||||||
| ``**`` | Exponentiation |
|
| ``**`` | Exponentiation |
|
||||||
+----------------------------------------------+-------------------------------------+
|
+----------------------------------------------+-------------------------------------+
|
||||||
| ``x.attribute`` | Attribute reference |
|
|
||||||
+----------------------------------------------+-------------------------------------+
|
|
||||||
| ``x[index]`` | Subscription |
|
| ``x[index]`` | Subscription |
|
||||||
+----------------------------------------------+-------------------------------------+
|
+----------------------------------------------+-------------------------------------+
|
||||||
| ``x[index:index]`` | Slicing |
|
| ``x[index:index]`` | Slicing |
|
||||||
+----------------------------------------------+-------------------------------------+
|
+----------------------------------------------+-------------------------------------+
|
||||||
| ``f(arguments...)`` | Function call |
|
| ``x(arguments...)`` | Call |
|
||||||
|
+----------------------------------------------|-------------------------------------+
|
||||||
|
| ``x.attribute`` | Attribute reference |
|
||||||
+----------------------------------------------+-------------------------------------+
|
+----------------------------------------------+-------------------------------------+
|
||||||
| ``(expressions...)`` | Binding, tuple display, generator |
|
| ``(expressions...)`` | Binding, tuple display, generator |
|
||||||
| | expressions |
|
| | expressions |
|
||||||
|
@ -20,18 +20,22 @@ from email.charset import Charset
|
|||||||
|
|
||||||
SEMISPACE = '; '
|
SEMISPACE = '; '
|
||||||
|
|
||||||
# Regular expression used to split header parameters. BAW: this may be too
|
|
||||||
# simple. It isn't strictly RFC 2045 (section 5.1) compliant, but it catches
|
|
||||||
# most headers found in the wild. We may eventually need a full fledged
|
|
||||||
# parser eventually.
|
|
||||||
paramre = re.compile(r'\s*;\s*')
|
|
||||||
# Regular expression that matches `special' characters in parameters, the
|
# Regular expression that matches `special' characters in parameters, the
|
||||||
# existance of which force quoting of the parameter value.
|
# existance of which force quoting of the parameter value.
|
||||||
tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]')
|
tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Helper functions
|
# Helper functions
|
||||||
|
def _splitparam(param):
|
||||||
|
# Split header parameters. BAW: this may be too simple. It isn't
|
||||||
|
# strictly RFC 2045 (section 5.1) compliant, but it catches most headers
|
||||||
|
# found in the wild. We may eventually need a full fledged parser
|
||||||
|
# eventually.
|
||||||
|
a, sep, b = param.partition(';')
|
||||||
|
if not sep:
|
||||||
|
return a.strip(), None
|
||||||
|
return a.strip(), b.strip()
|
||||||
|
|
||||||
def _formatparam(param, value=None, quote=True):
|
def _formatparam(param, value=None, quote=True):
|
||||||
"""Convenience function to format and return a key=value pair.
|
"""Convenience function to format and return a key=value pair.
|
||||||
|
|
||||||
@ -443,7 +447,7 @@ class Message:
|
|||||||
if value is missing:
|
if value is missing:
|
||||||
# This should have no parameters
|
# This should have no parameters
|
||||||
return self.get_default_type()
|
return self.get_default_type()
|
||||||
ctype = paramre.split(value)[0].lower().strip()
|
ctype = _splitparam(value)[0].lower()
|
||||||
# RFC 2045, section 5.2 says if its invalid, use text/plain
|
# RFC 2045, section 5.2 says if its invalid, use text/plain
|
||||||
if ctype.count('/') != 1:
|
if ctype.count('/') != 1:
|
||||||
return 'text/plain'
|
return 'text/plain'
|
||||||
|
@ -813,9 +813,14 @@ class ZipFile:
|
|||||||
|
|
||||||
def testzip(self):
|
def testzip(self):
|
||||||
"""Read all the files and check the CRC."""
|
"""Read all the files and check the CRC."""
|
||||||
|
chunk_size = 2 ** 20
|
||||||
for zinfo in self.filelist:
|
for zinfo in self.filelist:
|
||||||
try:
|
try:
|
||||||
self.read(zinfo.filename) # Check CRC-32
|
# Read by chunks, to avoid an OverflowError or a
|
||||||
|
# MemoryError with very large embedded files.
|
||||||
|
f = self.open(zinfo.filename, "r")
|
||||||
|
while f.read(chunk_size): # Check CRC-32
|
||||||
|
pass
|
||||||
except BadZipfile:
|
except BadZipfile:
|
||||||
return zinfo.filename
|
return zinfo.filename
|
||||||
|
|
||||||
|
@ -30,6 +30,10 @@ Core and Builtins
|
|||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #2676: in the email package, content-type parsing was hanging on
|
||||||
|
pathological input because of quadratic or exponential behaviour of a
|
||||||
|
regular expression.
|
||||||
|
|
||||||
- Issue #3476: binary buffered reading through the new "io" library is now
|
- Issue #3476: binary buffered reading through the new "io" library is now
|
||||||
thread-safe.
|
thread-safe.
|
||||||
|
|
||||||
|
@ -17,6 +17,9 @@ the format to accommodate documentation needs as they arise.
|
|||||||
Permissions History
|
Permissions History
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
|
- Hirokazu Yamamoto was given SVN access on August 12 2008 by MvL,
|
||||||
|
for contributions to the Windows build.
|
||||||
|
|
||||||
- Antoine Pitrou was given SVN access on July 16 2008, by recommendation
|
- Antoine Pitrou was given SVN access on July 16 2008, by recommendation
|
||||||
from GvR, for general contributions to Python.
|
from GvR, for general contributions to Python.
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user