Merged revisions 77952,78030,78102,78104,78107,78206,78216,78296-78297,78328,78331-78332,78336,78339,78343,78378-78379,78415,78559,78717,78791 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk

........
  r77952 | mark.dickinson | 2010-02-03 10:50:14 -0600 (Wed, 03 Feb 2010) | 1 line

  Fix test_inspect.py data to match recent change to inspect_fodder.py (r77942).
........
  r78030 | benjamin.peterson | 2010-02-06 14:14:10 -0600 (Sat, 06 Feb 2010) | 1 line

  check type_getattro for correctness in a descriptor corner case
........
  r78102 | andrew.kuchling | 2010-02-07 19:35:35 -0600 (Sun, 07 Feb 2010) | 1 line

  Move distutils into its own subsection; add various items
........
  r78104 | andrew.kuchling | 2010-02-08 07:22:24 -0600 (Mon, 08 Feb 2010) | 1 line

  Add two items; move a subsection
........
  r78107 | antoine.pitrou | 2010-02-08 14:25:47 -0600 (Mon, 08 Feb 2010) | 3 lines

  Clarify and correct description for ccbench and iobench.
........
  r78206 | r.david.murray | 2010-02-16 11:55:26 -0600 (Tue, 16 Feb 2010) | 3 lines

  Make the references to Popen in the description of Call
  and check_call into links.
........
  r78216 | andrew.kuchling | 2010-02-18 08:16:48 -0600 (Thu, 18 Feb 2010) | 1 line

  Add various items
........
  r78296 | andrew.kuchling | 2010-02-21 20:08:45 -0600 (Sun, 21 Feb 2010) | 1 line

  Re-word
........
  r78297 | andrew.kuchling | 2010-02-21 20:29:10 -0600 (Sun, 21 Feb 2010) | 1 line

  #7076: mention SystemRandom class near start of the module docs; reword change description for clarity.  Noted by Shawn Ligocki.
........
  r78328 | jack.diederich | 2010-02-22 12:17:16 -0600 (Mon, 22 Feb 2010) | 1 line

  fixes issue #7530, serve_forever()
........
  r78331 | andrew.kuchling | 2010-02-22 12:38:23 -0600 (Mon, 22 Feb 2010) | 1 line

  Fix comment typo
........
  r78332 | andrew.kuchling | 2010-02-22 12:42:07 -0600 (Mon, 22 Feb 2010) | 2 lines

  #7627: MH.remove() would fail if the MH mailbox was locked;
  it would call _unlock_file() and pass it a closed file object.  Noted by Rob Austein.
........
  r78336 | jack.diederich | 2010-02-22 13:55:22 -0600 (Mon, 22 Feb 2010) | 1 line

  fixes issue #1522237, bad init check in _threading_local
........
  r78339 | jack.diederich | 2010-02-22 15:27:38 -0600 (Mon, 22 Feb 2010) | 1 line

  * fix issue#7476
........
  r78343 | andrew.kuchling | 2010-02-22 16:48:41 -0600 (Mon, 22 Feb 2010) | 10 lines

  #2560: remove an unnecessary 'for' loop from my_fgets() in Parser/myreadline.c.
  Noted by Joseph Armbruster; patch by Jessica McKellar.

  The original code was 'for (;;) {...}', where ... ended
  with a 'return -2' statement and did not contain a 'break' or 'continue'
  statement.  Therefore, the body of the loop is always executed once.

  Once upon a time there was a 'continue' in the loop, but it was removed in
  rev36346, committed by mwh on Wed Jul 7 17:44:12 2004.
........
  r78378 | jack.diederich | 2010-02-23 11:23:30 -0600 (Tue, 23 Feb 2010) | 1 line

  fixup markup error
........
  r78379 | jack.diederich | 2010-02-23 13:34:06 -0600 (Tue, 23 Feb 2010) | 1 line

   issue#6442 use in operator instead of has_key
........
  r78415 | dirkjan.ochtman | 2010-02-23 22:00:52 -0600 (Tue, 23 Feb 2010) | 1 line

  Issue #7733: add explicit reference in asyncore docs.
........
  r78559 | andrew.kuchling | 2010-03-01 13:45:21 -0600 (Mon, 01 Mar 2010) | 1 line

  #7637: update discussion of minidom.unlink() and garbage collection
........
  r78717 | benjamin.peterson | 2010-03-05 21:13:33 -0600 (Fri, 05 Mar 2010) | 1 line

  settscdump is definitely an implementation detail
........
  r78791 | andrew.kuchling | 2010-03-08 06:00:39 -0600 (Mon, 08 Mar 2010) | 1 line

  Add various items
........
diff --git a/Doc/distutils/sourcedist.rst b/Doc/distutils/sourcedist.rst
index 150d1e6..57e363b 100644
--- a/Doc/distutils/sourcedist.rst
+++ b/Doc/distutils/sourcedist.rst
@@ -54,9 +54,9 @@
    requires the :program:`compress` program. Notice that this format is now
    pending for deprecation and will be removed in the future versions of Python.
 
-When using any ``tar`` format (``gztar``, ``bztar``, ``ztar`` or ``tar``), you
-can specify under Unix the ``owner`` and ``group`` names that will be set for
-each member of the archive.
+When using any ``tar`` format (``gztar``, ``bztar``, ``ztar`` or
+``tar``) under Unix, you can specify the ``owner`` and ``group`` names
+that will be set for each member of the archive.
 
 For example, if you want all files of the archive to be owned by root::
 
diff --git a/Doc/library/asyncore.rst b/Doc/library/asyncore.rst
index 60d4d03..e64d51d 100644
--- a/Doc/library/asyncore.rst
+++ b/Doc/library/asyncore.rst
@@ -201,7 +201,8 @@
    .. method:: bind(address)
 
       Bind the socket to *address*.  The socket must not already be bound.  (The
-      format of *address* depends on the address family --- see above.)  To mark
+      format of *address* depends on the address family --- refer to the
+      :mod:`socket` documentation for more information.)  To mark
       the socket as re-usable (setting the :const:`SO_REUSEADDR` option), call
       the :class:`dispatcher` object's :meth:`set_reuse_addr` method.
 
diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst
index 6d7e768..48b1ccc 100644
--- a/Doc/library/multiprocessing.rst
+++ b/Doc/library/multiprocessing.rst
@@ -1131,7 +1131,7 @@
 
    Create a BaseManager object.
 
-   Once created one should call :meth:`start` or :meth:`serve_forever` to ensure
+   Once created one should call :meth:`start` or ``get_server().serve_forever()`` to ensure
    that the manager object refers to a started manager process.
 
    *address* is the address on which the manager process listens for new
@@ -1147,10 +1147,6 @@
       Start a subprocess to start the manager.  If *initializer* is not ``None``
       then the subprocess will call ``initializer(*initargs)`` when it starts.
 
-   .. method:: serve_forever()
-
-      Run the server in the current process.
-
    .. method:: get_server()
 
       Returns a :class:`Server` object which represents the actual server under
diff --git a/Doc/library/random.rst b/Doc/library/random.rst
index 54211f4..bf89ade 100644
--- a/Doc/library/random.rst
+++ b/Doc/library/random.rst
@@ -35,6 +35,18 @@
 Optionally, a new generator can supply a :meth:`getrandbits` method --- this
 allows :meth:`randrange` to produce selections over an arbitrarily large range.
 
+As an example of subclassing, the :mod:`random` module provides the
+:class:`WichmannHill` class that implements an alternative generator in pure
+Python.  The class provides a backward compatible way to reproduce results from
+earlier versions of Python, which used the Wichmann-Hill algorithm as the core
+generator.  Note that this Wichmann-Hill generator can no longer be recommended:
+its period is too short by contemporary standards, and the sequence generated is
+known to fail some stringent randomness tests.  See the references below for a
+recent variant that repairs these flaws.
+
+The :mod:`random` module also provides the :class:`SystemRandom` class which
+uses the system function :func:`os.urandom` to generate random numbers
+from sources provided by the operating system.
 
 Bookkeeping functions:
 
diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst
index 3838cc6..13698e7 100644
--- a/Doc/library/subprocess.rst
+++ b/Doc/library/subprocess.rst
@@ -210,7 +210,7 @@
    Run command with arguments.  Wait for command to complete, then return the
    :attr:`returncode` attribute.
 
-   The arguments are the same as for the Popen constructor.  Example::
+   The arguments are the same as for the :class:`Popen` constructor.  Example::
 
       >>> retcode = subprocess.call(["ls", "-l"])
 
@@ -229,7 +229,7 @@
    :exc:`CalledProcessError` object will have the return code in the
    :attr:`returncode` attribute.
 
-   The arguments are the same as for the Popen constructor.  Example::
+   The arguments are the same as for the :class:`Popen` constructor.  Example::
 
       >>> subprocess.check_call(["ls", "-l"])
       0
diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst
index c1a0027..6b9377d 100644
--- a/Doc/library/sys.rst
+++ b/Doc/library/sys.rst
@@ -816,6 +816,10 @@
    available only if Python was compiled with :option:`--with-tsc`. To understand
    the output of this dump, read :file:`Python/ceval.c` in the Python sources.
 
+   .. impl-detail::
+      This function is intimately bound to CPython implementation details and
+      thus not likely to be implemented elsewhere.
+
 
 .. data:: stdin
           stdout
diff --git a/Doc/library/xml.dom.minidom.rst b/Doc/library/xml.dom.minidom.rst
index 98e7586..5ece1ca 100644
--- a/Doc/library/xml.dom.minidom.rst
+++ b/Doc/library/xml.dom.minidom.rst
@@ -82,22 +82,12 @@
    dom3 = parseString("<myxml>Some data</myxml>")
    assert dom3.documentElement.tagName == "myxml"
 
-When you are finished with a DOM, you should clean it up.  This is necessary
-because some versions of Python do not support garbage collection of objects
-that refer to each other in a cycle.  Until this restriction is removed from all
-versions of Python, it is safest to write your code as if cycles would not be
-cleaned up.
-
-The way to clean up a DOM is to call its :meth:`unlink` method::
-
-   dom1.unlink()
-   dom2.unlink()
-   dom3.unlink()
-
-:meth:`unlink` is a :mod:`xml.dom.minidom`\ -specific extension to the DOM API.
-After calling :meth:`unlink` on a node, the node and its descendants are
-essentially useless.
-
+When you are finished with a DOM tree, you may optionally call the
+:meth:`unlink` method to encourage early cleanup of the now-unneeded
+objects.  :meth:`unlink` is a :mod:`xml.dom.minidom`\ -specific
+extension to the DOM API that renders the node and its descendants are
+essentially useless.  Otherwise, Python's garbage collector will
+eventually take care of the objects in the tree.
 
 .. seealso::
 
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index c2c9b5c..e6f1735 100755
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -882,17 +882,9 @@
                 raise KeyError('No message with key: %s' % key)
             else:
                 raise
-        try:
-            if self._locked:
-                _lock_file(f)
-            try:
-                f.close()
-                os.remove(os.path.join(self._path, str(key)))
-            finally:
-                if self._locked:
-                    _unlock_file(f)
-        finally:
+        else:
             f.close()
+            os.remove(path)
 
     def __setitem__(self, key, message):
         """Replace the keyed message; raise KeyError if it doesn't exist."""
diff --git a/Lib/pipes.py b/Lib/pipes.py
index 6a473ae..deab815 100644
--- a/Lib/pipes.py
+++ b/Lib/pipes.py
@@ -253,10 +253,13 @@
 _funnychars = '"`$\\'                           # Unsafe inside "double quotes"
 
 def quote(file):
+    ''' return a shell-escaped version of the file string '''
     for c in file:
         if c not in _safechars:
             break
     else:
+        if not file:
+            return "''"
         return file
     if '\'' not in file:
         return '\'' + file + '\''
diff --git a/Lib/test/test_descr.py b/Lib/test/test_descr.py
index 011cb6d..408f72b 100644
--- a/Lib/test/test_descr.py
+++ b/Lib/test/test_descr.py
@@ -4164,6 +4164,15 @@
         x.a = 42
         self.assertEqual(x.a, 42)
 
+        # Also check type_getattro for correctness.
+        class Meta(type):
+            pass
+        class X(object):
+            __metaclass__ = Meta
+        X.a = 42
+        Meta.a = Descr("a")
+        self.assertEqual(X.a, 42)
+
     def test_getattr_hooks(self):
         # issue 4230
 
diff --git a/Lib/test/test_inspect.py b/Lib/test/test_inspect.py
index 35fd775..1daab64 100644
--- a/Lib/test/test_inspect.py
+++ b/Lib/test/test_inspect.py
@@ -166,12 +166,12 @@
 
     def test_trace(self):
         self.assertEqual(len(git.tr), 3)
-        self.assertEqual(revise(*git.tr[0][1:]),
-             (modfile, 43, 'argue', ['            spam(a, b, c)\n'], 0))
-        self.assertEqual(revise(*git.tr[1][1:]),
-             (modfile, 9, 'spam', ['    eggs(b + d, c + f)\n'], 0))
-        self.assertEqual(revise(*git.tr[2][1:]),
-             (modfile, 18, 'eggs', ['    q = y / 0\n'], 0))
+        self.assertEqual(git.tr[0][1:], (modfile, 43, 'argue',
+                                         ['            spam(a, b, c)\n'], 0))
+        self.assertEqual(git.tr[1][1:], (modfile, 9, 'spam',
+                                         ['    eggs(b + d, c + f)\n'], 0))
+        self.assertEqual(git.tr[2][1:], (modfile, 18, 'eggs',
+                                         ['    q = y / 0\n'], 0))
 
     def test_frame(self):
         args, varargs, varkw, locals = inspect.getargvalues(mod.fr)
diff --git a/Lib/test/test_mailbox.py b/Lib/test/test_mailbox.py
index 83f34c7..73ee69f 100644
--- a/Lib/test/test_mailbox.py
+++ b/Lib/test/test_mailbox.py
@@ -968,6 +968,13 @@
         key0 = self._box.add(msg0)
         refmsg0 = self._box.get_message(key0)
 
+    def test_issue7627(self):
+        msg0 = mailbox.MHMessage(self._template % 0)
+        key0 = self._box.add(msg0)
+        self._box.lock()
+        self._box.remove(key0)
+        self._box.unlock()
+
     def test_pack(self):
         # Pack the contents of the mailbox
         msg0 = mailbox.MHMessage(self._template % 0)
diff --git a/Lib/test/test_pipes.py b/Lib/test/test_pipes.py
index 7b78097..9ce137e 100644
--- a/Lib/test/test_pipes.py
+++ b/Lib/test/test_pipes.py
@@ -82,6 +82,8 @@
             self.assertEqual(pipes.quote("test%s'name'" % u),
                               '"test\\%s\'name\'"' % u)
 
+        self.assertEqual(pipes.quote(''), "''")
+
     def testRepr(self):
         t = pipes.Template()
         self.assertEqual(repr(t), "<Template instance, steps=[]>")
diff --git a/Misc/ACKS b/Misc/ACKS
index ec15267..2f47dbb 100644
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -832,6 +832,7 @@
 Jean-Claude Wippler
 Frank Wierzbicki
 Lars Wirzenius
+John Wiseman
 Chris Withers
 Stefan Witzel
 Irek Wlizlo
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index a89c22b..708af0a 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -215,7 +215,7 @@
   return 1;
 }
 
-/* Function versions of the 3 functions for tested whether curses has been
+/* Function versions of the 3 functions for testing whether curses has been
    initialised or not. */
    
 static int func_PyCursesSetupTermCalled(void)
diff --git a/Parser/myreadline.c b/Parser/myreadline.c
index a144850..0d8394b 100644
--- a/Parser/myreadline.c
+++ b/Parser/myreadline.c
@@ -36,66 +36,63 @@
 my_fgets(char *buf, int len, FILE *fp)
 {
 	char *p;
-	for (;;) {
-		if (PyOS_InputHook != NULL)
-			(void)(PyOS_InputHook)();
-		errno = 0;
-		p = fgets(buf, len, fp);
-		if (p != NULL)
-			return 0; /* No error */
+	if (PyOS_InputHook != NULL)
+		(void)(PyOS_InputHook)();
+	errno = 0;
+	p = fgets(buf, len, fp);
+	if (p != NULL)
+		return 0; /* No error */
 #ifdef MS_WINDOWS
-		/* In the case of a Ctrl+C or some other external event 
-		   interrupting the operation:
-		   Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32 
-		   error code (and feof() returns TRUE).
-		   Win9x: Ctrl+C seems to have no effect on fgets() returning
-		   early - the signal handler is called, but the fgets()
-		   only returns "normally" (ie, when Enter hit or feof())
+	/* In the case of a Ctrl+C or some other external event 
+	   interrupting the operation:
+	   Win2k/NT: ERROR_OPERATION_ABORTED is the most recent Win32 
+	   error code (and feof() returns TRUE).
+	   Win9x: Ctrl+C seems to have no effect on fgets() returning
+	   early - the signal handler is called, but the fgets()
+	   only returns "normally" (ie, when Enter hit or feof())
+	*/
+	if (GetLastError()==ERROR_OPERATION_ABORTED) {
+		/* Signals come asynchronously, so we sleep a brief 
+		   moment before checking if the handler has been 
+		   triggered (we cant just return 1 before the 
+		   signal handler has been called, as the later 
+		   signal may be treated as a separate interrupt).
 		*/
-		if (GetLastError()==ERROR_OPERATION_ABORTED) {
-			/* Signals come asynchronously, so we sleep a brief 
-			   moment before checking if the handler has been 
-			   triggered (we cant just return 1 before the 
-			   signal handler has been called, as the later 
-			   signal may be treated as a separate interrupt).
-			*/
-			Sleep(1);
-			if (PyOS_InterruptOccurred()) {
-				return 1; /* Interrupt */
-			}
-			/* Either the sleep wasn't long enough (need a
-			   short loop retrying?) or not interrupted at all
-			   (in which case we should revisit the whole thing!)
-			   Logging some warning would be nice.  assert is not
-			   viable as under the debugger, the various dialogs
-			   mean the condition is not true.
-			*/
-		}
-#endif /* MS_WINDOWS */
-		if (feof(fp)) {
-			return -1; /* EOF */
-		}
-#ifdef EINTR
-		if (errno == EINTR) {
-			int s;
-#ifdef WITH_THREAD
-			PyEval_RestoreThread(_PyOS_ReadlineTState);
-#endif
-			s = PyErr_CheckSignals();
-#ifdef WITH_THREAD
-			PyEval_SaveThread();
-#endif
-			if (s < 0) {
-				return 1;
-			}
-		}
-#endif
+		Sleep(1);
 		if (PyOS_InterruptOccurred()) {
 			return 1; /* Interrupt */
 		}
-		return -2; /* Error */
+		/* Either the sleep wasn't long enough (need a
+		   short loop retrying?) or not interrupted at all
+		   (in which case we should revisit the whole thing!)
+		   Logging some warning would be nice.  assert is not
+		   viable as under the debugger, the various dialogs
+		   mean the condition is not true.
+		*/
 	}
-	/* NOTREACHED */
+#endif /* MS_WINDOWS */
+	if (feof(fp)) {
+		return -1; /* EOF */
+	}
+#ifdef EINTR
+	if (errno == EINTR) {
+		int s;
+#ifdef WITH_THREAD
+		PyEval_RestoreThread(_PyOS_ReadlineTState);
+#endif
+		s = PyErr_CheckSignals();
+#ifdef WITH_THREAD
+		PyEval_SaveThread();
+#endif
+		if (s < 0) {
+			return 1;
+		}
+	}
+#endif
+	if (PyOS_InterruptOccurred()) {
+		return 1; /* Interrupt */
+	}
+	return -2; /* Error */
 }