mirror of
https://github.com/python/cpython.git
synced 2025-12-09 02:35:14 +00:00
Merged revisions 78101,78115,78117,78182,78188,78245,78386,78496 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r78101 | georg.brandl | 2010-02-08 01:04:54 +0100 (Mo, 08 Feb 2010) | 1 line Fix test_fnmatch. ........ r78115 | georg.brandl | 2010-02-08 23:40:51 +0100 (Mo, 08 Feb 2010) | 1 line Fix missing string formatting placeholder. ........ r78117 | georg.brandl | 2010-02-08 23:48:37 +0100 (Mo, 08 Feb 2010) | 1 line Convert test failure from output-producing to self.fail(). ........ r78182 | georg.brandl | 2010-02-14 09:18:23 +0100 (So, 14 Feb 2010) | 1 line #7926: fix stray parens. ........ r78188 | georg.brandl | 2010-02-14 14:38:12 +0100 (So, 14 Feb 2010) | 1 line #7926: fix-up wording. ........ r78245 | georg.brandl | 2010-02-19 20:36:08 +0100 (Fr, 19 Feb 2010) | 1 line #7967: PyXML is no more. ........ r78386 | georg.brandl | 2010-02-23 22:48:57 +0100 (Di, 23 Feb 2010) | 1 line #6544: fix refleak in kqueue, occurring in certain error conditions. ........ r78496 | georg.brandl | 2010-02-27 15:58:08 +0100 (Sa, 27 Feb 2010) | 1 line Link to http://www.python.org/dev/workflow/ from bugs page. ........
This commit is contained in:
parent
1b37e8728c
commit
c0e22b7889
6 changed files with 41 additions and 38 deletions
10
Doc/bugs.rst
10
Doc/bugs.rst
|
|
@ -23,10 +23,9 @@ In the case of documentation bugs, look at the most recent development docs at
|
||||||
http://docs.python.org/dev to see if the bug has been fixed.
|
http://docs.python.org/dev to see if the bug has been fixed.
|
||||||
|
|
||||||
If the problem you're reporting is not already in the bug tracker, go back to
|
If the problem you're reporting is not already in the bug tracker, go back to
|
||||||
the Python Bug Tracker. If you don't already have a tracker account, select the
|
the Python Bug Tracker and log in. If you don't already have a tracker account,
|
||||||
"Register" link in the sidebar and undergo the registration procedure.
|
select the "Register" link or, if you use OpenID, one of the OpenID provider
|
||||||
Otherwise, if you're not logged in, enter your credentials and select "Login".
|
logos in the sidebar. It is not possible to submit a bug report anonymously.
|
||||||
It is not possible to submit a bug report anonymously.
|
|
||||||
|
|
||||||
Being now logged in, you can submit a bug. Select the "Create New" link in the
|
Being now logged in, you can submit a bug. Select the "Create New" link in the
|
||||||
sidebar to open the bug reporting form.
|
sidebar to open the bug reporting form.
|
||||||
|
|
@ -43,7 +42,8 @@ were using (including version information as appropriate).
|
||||||
|
|
||||||
Each bug report will be assigned to a developer who will determine what needs to
|
Each bug report will be assigned to a developer who will determine what needs to
|
||||||
be done to correct the problem. You will receive an update each time action is
|
be done to correct the problem. You will receive an update each time action is
|
||||||
taken on the bug.
|
taken on the bug. See http://www.python.org/dev/workflow/ for a detailed
|
||||||
|
description of the issue workflow.
|
||||||
|
|
||||||
|
|
||||||
.. seealso::
|
.. seealso::
|
||||||
|
|
|
||||||
|
|
@ -350,9 +350,10 @@ A high-level explanation of the context management protocol is:
|
||||||
|
|
||||||
* The code in *BLOCK* is executed.
|
* The code in *BLOCK* is executed.
|
||||||
|
|
||||||
* If *BLOCK* raises an exception, the :meth:`__exit__(type, value, traceback)`
|
* If *BLOCK* raises an exception, the context manager's :meth:`__exit__` method
|
||||||
is called with the exception details, the same values returned by
|
is called with three arguments, the exception details (``type, value, traceback``,
|
||||||
:func:`sys.exc_info`. The method's return value controls whether the exception
|
the same values returned by :func:`sys.exc_info`, which can also be ``None``
|
||||||
|
if no exception occurred). The method's return value controls whether an exception
|
||||||
is re-raised: any false value re-raises the exception, and ``True`` will result
|
is re-raised: any false value re-raises the exception, and ``True`` will result
|
||||||
in suppressing it. You'll only rarely want to suppress the exception, because
|
in suppressing it. You'll only rarely want to suppress the exception, because
|
||||||
if you do the author of the code containing the ':keyword:`with`' statement will
|
if you do the author of the code containing the ':keyword:`with`' statement will
|
||||||
|
|
@ -463,7 +464,7 @@ could be written as::
|
||||||
with db_transaction(db) as cursor:
|
with db_transaction(db) as cursor:
|
||||||
...
|
...
|
||||||
|
|
||||||
The :mod:`contextlib` module also has a :func:`nested(mgr1, mgr2, ...)` function
|
The :mod:`contextlib` module also has a ``nested(mgr1, mgr2, ...)`` function
|
||||||
that combines a number of context managers so you don't need to write nested
|
that combines a number of context managers so you don't need to write nested
|
||||||
':keyword:`with`' statements. In this example, the single ':keyword:`with`'
|
':keyword:`with`' statements. In this example, the single ':keyword:`with`'
|
||||||
statement both starts a database transaction and acquires a thread lock::
|
statement both starts a database transaction and acquires a thread lock::
|
||||||
|
|
@ -472,8 +473,9 @@ statement both starts a database transaction and acquires a thread lock::
|
||||||
with nested (db_transaction(db), lock) as (cursor, locked):
|
with nested (db_transaction(db), lock) as (cursor, locked):
|
||||||
...
|
...
|
||||||
|
|
||||||
Finally, the :func:`closing(object)` function returns *object* so that it can be
|
Finally, the :func:`closing` function returns its argument so that it can be
|
||||||
bound to a variable, and calls ``object.close`` at the end of the block. ::
|
bound to a variable, and calls the argument's ``.close()`` method at the end
|
||||||
|
of the block. ::
|
||||||
|
|
||||||
import urllib, sys
|
import urllib, sys
|
||||||
from contextlib import closing
|
from contextlib import closing
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,13 @@ from fnmatch import fnmatch, fnmatchcase
|
||||||
|
|
||||||
|
|
||||||
class FnmatchTestCase(unittest.TestCase):
|
class FnmatchTestCase(unittest.TestCase):
|
||||||
def check_match(self, filename, pattern, should_match=1):
|
def check_match(self, filename, pattern, should_match=1, fn=fnmatch):
|
||||||
if should_match:
|
if should_match:
|
||||||
self.assertTrue(fnmatch(filename, pattern),
|
self.assertTrue(fn(filename, pattern),
|
||||||
"expected %r to match pattern %r"
|
"expected %r to match pattern %r"
|
||||||
% (filename, pattern))
|
% (filename, pattern))
|
||||||
else:
|
else:
|
||||||
self.assertTrue(not fnmatch(filename, pattern),
|
self.assertTrue(not fn(filename, pattern),
|
||||||
"expected %r not to match pattern %r"
|
"expected %r not to match pattern %r"
|
||||||
% (filename, pattern))
|
% (filename, pattern))
|
||||||
|
|
||||||
|
|
@ -52,8 +52,8 @@ class FnmatchTestCase(unittest.TestCase):
|
||||||
|
|
||||||
def test_fnmatchcase(self):
|
def test_fnmatchcase(self):
|
||||||
check = self.check_match
|
check = self.check_match
|
||||||
check('AbC', 'abc', 0)
|
check('AbC', 'abc', 0, fnmatchcase)
|
||||||
check('abc', 'AbC', 0)
|
check('abc', 'AbC', 0, fnmatchcase)
|
||||||
|
|
||||||
def test_bytes(self):
|
def test_bytes(self):
|
||||||
self.check_match(b'test', b'te*')
|
self.check_match(b'test', b'te*')
|
||||||
|
|
|
||||||
|
|
@ -116,16 +116,15 @@ class StrftimeTest(unittest.TestCase):
|
||||||
try:
|
try:
|
||||||
result = time.strftime(e[0], now)
|
result = time.strftime(e[0], now)
|
||||||
except ValueError as error:
|
except ValueError as error:
|
||||||
print("Standard '%s' format gaver error:" % (e[0], error))
|
self.fail("strftime '%s' format gave error: %s" % (e[0], error))
|
||||||
continue
|
|
||||||
if re.match(escapestr(e[1], self.ampm), result):
|
if re.match(escapestr(e[1], self.ampm), result):
|
||||||
continue
|
continue
|
||||||
if not result or result[0] == '%':
|
if not result or result[0] == '%':
|
||||||
print("Does not support standard '%s' format (%s)" % \
|
self.fail("strftime does not support standard '%s' format (%s)"
|
||||||
(e[0], e[2]))
|
% (e[0], e[2]))
|
||||||
else:
|
else:
|
||||||
print("Conflict for %s (%s):" % (e[0], e[2]))
|
self.fail("Conflict for %s (%s): expected %s, but got %s"
|
||||||
print(" Expected %s, but got %s" % (e[1], result))
|
% (e[0], e[2], e[1], result))
|
||||||
|
|
||||||
def strftest2(self, now):
|
def strftest2(self, now):
|
||||||
nowsecs = str(int(now))[:-1]
|
nowsecs = str(int(now))[:-1]
|
||||||
|
|
|
||||||
|
|
@ -781,6 +781,9 @@ Library
|
||||||
Extension Modules
|
Extension Modules
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #6544: fix a reference leak in the kqueue implementation's error
|
||||||
|
handling.
|
||||||
|
|
||||||
- Stop providing crtassem.h symbols when compiling with Visual Studio 2010, as
|
- Stop providing crtassem.h symbols when compiling with Visual Studio 2010, as
|
||||||
msvcr100.dll is not a platform assembly anymore.
|
msvcr100.dll is not a platform assembly anymore.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1241,6 +1241,7 @@ static struct PyMemberDef kqueue_event_members[] = {
|
||||||
#undef KQ_OFF
|
#undef KQ_OFF
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
||||||
kqueue_event_repr(kqueue_event_Object *s)
|
kqueue_event_repr(kqueue_event_Object *s)
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
|
|
@ -1526,19 +1527,6 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ch != NULL && ch != Py_None) {
|
|
||||||
it = PyObject_GetIter(ch);
|
|
||||||
if (it == NULL) {
|
|
||||||
PyErr_SetString(PyExc_TypeError,
|
|
||||||
"changelist is not iterable");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
nchanges = PyObject_Size(ch);
|
|
||||||
if (nchanges < 0) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (otimeout == Py_None || otimeout == NULL) {
|
if (otimeout == Py_None || otimeout == NULL) {
|
||||||
ptimeoutspec = NULL;
|
ptimeoutspec = NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -1574,11 +1562,22 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nchanges) {
|
if (ch != NULL && ch != Py_None) {
|
||||||
|
it = PyObject_GetIter(ch);
|
||||||
|
if (it == NULL) {
|
||||||
|
PyErr_SetString(PyExc_TypeError,
|
||||||
|
"changelist is not iterable");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
nchanges = PyObject_Size(ch);
|
||||||
|
if (nchanges < 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
chl = PyMem_New(struct kevent, nchanges);
|
chl = PyMem_New(struct kevent, nchanges);
|
||||||
if (chl == NULL) {
|
if (chl == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
return NULL;
|
goto error;
|
||||||
}
|
}
|
||||||
i = 0;
|
i = 0;
|
||||||
while ((ei = PyIter_Next(it)) != NULL) {
|
while ((ei = PyIter_Next(it)) != NULL) {
|
||||||
|
|
@ -1601,7 +1600,7 @@ kqueue_queue_control(kqueue_queue_Object *self, PyObject *args)
|
||||||
evl = PyMem_New(struct kevent, nevents);
|
evl = PyMem_New(struct kevent, nevents);
|
||||||
if (evl == NULL) {
|
if (evl == NULL) {
|
||||||
PyErr_NoMemory();
|
PyErr_NoMemory();
|
||||||
return NULL;
|
goto error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue