From: Georg Brandl Date: Sun, 1 Aug 2010 22:10:15 +0000 (+0000) Subject: Merged revisions 83429,83436 via svnmerge from X-Git-Tag: v2.6.6rc1~86 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e64de92f74332fdbfeb4fcce138e6959e7fbe146;p=python Merged revisions 83429,83436 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/release27-maint ................ r83429 | georg.brandl | 2010-08-01 21:14:56 +0200 (So, 01 Aug 2010) | 37 lines Merged revisions 83352,83356-83358,83362,83366,83368-83369 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r83352 | georg.brandl | 2010-07-31 20:11:07 +0200 (Sa, 31 Jul 2010) | 1 line #9440: Remove borderline test case that fails based on unpredictable conditions such as compiler flags. ........ r83356 | georg.brandl | 2010-07-31 21:29:15 +0200 (Sa, 31 Jul 2010) | 1 line Remove trailing whitespace. ........ r83357 | georg.brandl | 2010-07-31 21:59:55 +0200 (Sa, 31 Jul 2010) | 1 line #5778: document that sys.version can contain a newline. ........ r83358 | georg.brandl | 2010-07-31 22:05:31 +0200 (Sa, 31 Jul 2010) | 1 line #9442: do not document a specific format for sys.version; rather refer to version_info and the platform module. ........ r83362 | georg.brandl | 2010-07-31 23:12:15 +0200 (Sa, 31 Jul 2010) | 1 line #8910: add a file explaining why Lib/test/data is there. ........ r83366 | georg.brandl | 2010-07-31 23:26:40 +0200 (Sa, 31 Jul 2010) | 1 line There always is a False and True now. ........ r83368 | georg.brandl | 2010-07-31 23:40:15 +0200 (Sa, 31 Jul 2010) | 1 line #7909: the prefixes \\.\ and \\?\ indicate special Windows paths, do not try to manipulate them. See http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx for details. ........ r83369 | georg.brandl | 2010-07-31 23:41:42 +0200 (Sa, 31 Jul 2010) | 1 line Fix "Berkeley" name. ........ ................ r83436 | georg.brandl | 2010-08-01 21:33:15 +0200 (So, 01 Aug 2010) | 42 lines Merged revisions 83259,83261,83264-83265,83268-83269,83271-83272,83281 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r83259 | georg.brandl | 2010-07-30 09:03:39 +0200 (Fr, 30 Jul 2010) | 1 line Clarification. ........ r83261 | georg.brandl | 2010-07-30 09:21:26 +0200 (Fr, 30 Jul 2010) | 1 line #9230: allow Pdb.checkline() to be called without a current frame, for setting breakpoints before starting debugging. ........ r83264 | georg.brandl | 2010-07-30 10:45:26 +0200 (Fr, 30 Jul 2010) | 1 line Document the "jump" command in pdb.__doc__, and add a version tag for "until X". ........ r83265 | georg.brandl | 2010-07-30 10:54:49 +0200 (Fr, 30 Jul 2010) | 1 line #8015: fix crash when entering an empty line for breakpoint commands. Also restore environment properly when an exception occurs during the definition of commands. ........ r83268 | georg.brandl | 2010-07-30 11:23:23 +0200 (Fr, 30 Jul 2010) | 2 lines Issue #8048: Prevent doctests from failing when sys.displayhook has been reassigned. ........ r83269 | georg.brandl | 2010-07-30 11:43:00 +0200 (Fr, 30 Jul 2010) | 1 line #6719: In pdb, do not stop somewhere in the encodings machinery if the source file to be debugged is in a non-builtin encoding. ........ r83271 | georg.brandl | 2010-07-30 11:59:28 +0200 (Fr, 30 Jul 2010) | 1 line #5727: Restore the ability to use readline when calling into pdb in doctests. ........ r83272 | georg.brandl | 2010-07-30 12:29:19 +0200 (Fr, 30 Jul 2010) | 1 line #5294: Fix the behavior of pdb "continue" command when called in the top-level debugged frame. ........ r83281 | georg.brandl | 2010-07-30 15:36:43 +0200 (Fr, 30 Jul 2010) | 1 line Add myself for pdb. ........ ................ --- diff --git a/Doc/library/ftplib.rst b/Doc/library/ftplib.rst index 009fe381fe..f4894694b5 100644 --- a/Doc/library/ftplib.rst +++ b/Doc/library/ftplib.rst @@ -186,9 +186,9 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. Retrieve a file or directory listing in ASCII transfer mode. *command* should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or a command such as ``LIST``, ``NLST`` or ``MLSD`` (usually just the string - ``'LIST'``). The *callback* function is called for each line, with the - trailing CRLF stripped. The default *callback* prints the line to - ``sys.stdout``. + ``'LIST'``). The *callback* function is called for each line with a + string argument containing the line with the trailing CRLF stripped. + The default *callback* prints the line to ``sys.stdout``. .. method:: FTP.set_pasv(boolean) diff --git a/Doc/library/sys.rst b/Doc/library/sys.rst index 7fd918817d..f7a0a5dbe0 100644 --- a/Doc/library/sys.rst +++ b/Doc/library/sys.rst @@ -909,14 +909,10 @@ always available. .. data:: version A string containing the version number of the Python interpreter plus additional - information on the build number and compiler used. It has a value of the form - ``'version (#build_number, build_date, build_time) [compiler]'``. The first - three characters are used to identify the version in the installation - directories (where appropriate on each platform). An example:: - - >>> import sys - >>> sys.version - '1.5.2 (#0 Apr 13 1999, 10:51:12) [MSC 32 bit (Intel)]' + information on the build number and compiler used. This string is displayed + when the interactive interpreter is started. Do not extract version information + out of it, rather, use :data:`version_info` and the functions provided by the + :mod:`platform` module. .. data:: api_version diff --git a/Lib/bdb.py b/Lib/bdb.py index f29fa46b5b..4a3153c71c 100644 --- a/Lib/bdb.py +++ b/Lib/bdb.py @@ -98,6 +98,8 @@ class Bdb: # (CT) stopframe may now also be None, see dispatch_call. # (CT) the former test for None is therefore removed from here. if frame is self.stopframe: + if self.stoplineno == -1: + return False return frame.f_lineno >= self.stoplineno while frame is not None and frame is not self.stopframe: if frame is self.botframe: @@ -155,10 +157,12 @@ class Bdb: but only if we are to stop at or just below this level.""" pass - def _set_stopinfo(self, stopframe, returnframe, stoplineno=-1): + def _set_stopinfo(self, stopframe, returnframe, stoplineno=0): self.stopframe = stopframe self.returnframe = returnframe self.quitting = 0 + # stoplineno >= 0 means: stop at line >= the stoplineno + # stoplineno -1 means: don't stop at all self.stoplineno = stoplineno # Derived classes and clients can call the following methods @@ -171,7 +175,7 @@ class Bdb: def set_step(self): """Stop after one line of code.""" - self._set_stopinfo(None,None) + self._set_stopinfo(None, None) def set_next(self, frame): """Stop on the next line in or below the given frame.""" @@ -198,7 +202,7 @@ class Bdb: def set_continue(self): # Don't stop except at breakpoints or when finished - self._set_stopinfo(self.botframe, None) + self._set_stopinfo(self.botframe, None, -1) if not self.breaks: # no breakpoints; run without debugger overhead sys.settrace(None) diff --git a/Lib/doctest.py b/Lib/doctest.py index af0d042b96..f1cb1f22ac 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -335,6 +335,8 @@ class _OutputRedirectingPdb(pdb.Pdb): self.__out = out self.__debugger_used = False pdb.Pdb.__init__(self, stdout=out) + # still use input() to get user input + self.use_rawinput = 1 def set_trace(self, frame=None): self.__debugger_used = True @@ -1381,12 +1383,17 @@ class DocTestRunner: self.save_linecache_getlines = linecache.getlines linecache.getlines = self.__patched_linecache_getlines + # Make sure sys.displayhook just prints the value to stdout + save_displayhook = sys.displayhook + sys.displayhook = sys.__displayhook__ + try: return self.__run(test, compileflags, out) finally: sys.stdout = save_stdout pdb.set_trace = save_set_trace linecache.getlines = self.save_linecache_getlines + sys.displayhook = save_displayhook if clear_globs: test.globs.clear() diff --git a/Lib/ntpath.py b/Lib/ntpath.py index a124dfd0c4..11a0a3efcb 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -399,6 +399,12 @@ def normpath(path): """Normalize path, eliminating double slashes, etc.""" # Preserve unicode (if path is unicode) backslash, dot = (u'\\', u'.') if isinstance(path, unicode) else ('\\', '.') + if path.startswith(('\\\\.\\', '\\\\?\\')): + # in the case of paths with these prefixes: + # \\.\ -> device names + # \\?\ -> literal paths + # do not do any normalization, but return the path unchanged + return path path = path.replace("/", "\\") prefix, path = splitdrive(path) # We need to be careful here. If the prefix is empty, and the path starts diff --git a/Lib/pdb.py b/Lib/pdb.py index 3e5e8984c1..683abb9cb6 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -171,14 +171,18 @@ class Pdb(bdb.Bdb, cmd.Cmd): def user_return(self, frame, return_value): """This function is called when a return trap is set here.""" + if self._wait_for_mainpyfile: + return frame.f_locals['__return__'] = return_value print >>self.stdout, '--Return--' self.interaction(frame, None) def user_exception(self, frame, exc_info): - exc_type, exc_value, exc_traceback = exc_info """This function is called if an exception occurs, but only if we are to stop at or just below this level.""" + if self._wait_for_mainpyfile: + return + exc_type, exc_value, exc_traceback = exc_info frame.f_locals['__exception__'] = exc_type, exc_value if type(exc_type) == type(''): exc_type_name = exc_type @@ -265,8 +269,10 @@ class Pdb(bdb.Bdb, cmd.Cmd): return self.handle_command_def(line) def handle_command_def(self,line): - """ Handles one command line during command list definition. """ + """Handles one command line during command list definition.""" cmd, arg, line = self.parseline(line) + if not cmd: + return if cmd == 'silent': self.commands_silent[self.commands_bnum] = True return # continue to handle other cmd def in the cmd list @@ -274,7 +280,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): self.cmdqueue = [] return 1 # end of cmd list cmdlist = self.commands[self.commands_bnum] - if (arg): + if arg: cmdlist.append(cmd+' '+arg) else: cmdlist.append(cmd) @@ -313,9 +319,11 @@ class Pdb(bdb.Bdb, cmd.Cmd): prompt_back = self.prompt self.prompt = '(com) ' self.commands_defining = True - self.cmdloop() - self.commands_defining = False - self.prompt = prompt_back + try: + self.cmdloop() + finally: + self.commands_defining = False + self.prompt = prompt_back def do_break(self, arg, temporary = 0): # break [ ([filename:]lineno | function) [, "condition"] ] @@ -451,7 +459,10 @@ class Pdb(bdb.Bdb, cmd.Cmd): Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank line or EOF). Warning: testing is not comprehensive. """ - line = linecache.getline(filename, lineno, self.curframe.f_globals) + # this method should be callable before starting debugging, so default + # to "no globals" if there is no current frame + globs = self.curframe.f_globals if hasattr(self, 'curframe') else None + line = linecache.getline(filename, lineno, globs) if not line: print >>self.stdout, 'End of file' return 0 @@ -1280,7 +1291,7 @@ def main(): # changed by the user from the command line. There is a "restart" command which # allows explicit specification of command line arguments. pdb = Pdb() - while 1: + while True: try: pdb._runscript(mainpyfile) if pdb._user_requested_quit: diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index f5a328eaad..89c878b616 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -907,6 +907,35 @@ unexpected exception: ... ZeroDivisionError: integer division or modulo by zero TestResults(failed=1, attempted=1) +""" + def displayhook(): r""" +Test that changing sys.displayhook doesn't matter for doctest. + + >>> import sys + >>> orig_displayhook = sys.displayhook + >>> def my_displayhook(x): + ... print('hi!') + >>> sys.displayhook = my_displayhook + >>> def f(): + ... ''' + ... >>> 3 + ... 3 + ... ''' + >>> test = doctest.DocTestFinder().find(f)[0] + >>> r = doctest.DocTestRunner(verbose=False).run(test) + >>> post_displayhook = sys.displayhook + + We need to restore sys.displayhook now, so that we'll be able to test + results. + + >>> sys.displayhook = orig_displayhook + + Ok, now we can check that everything is ok. + + >>> r + TestResults(failed=0, attempted=1) + >>> post_displayhook is my_displayhook + True """ def optionflags(): r""" Tests of `DocTestRunner`'s option flag handling. diff --git a/Lib/test/test_ntpath.py b/Lib/test/test_ntpath.py index 89b3f614af..a42190786b 100644 --- a/Lib/test/test_ntpath.py +++ b/Lib/test/test_ntpath.py @@ -128,6 +128,9 @@ class TestNtpath(unittest.TestCase): self.assertTrue(isinstance(ntpath.normpath(path), unicode), 'normpath() returned str instead of unicode') + tester("ntpath.normpath('\\\\.\\NUL')", r'\\.\NUL') + tester("ntpath.normpath('\\\\?\\D:/XY\\Z')", r'\\?\D:/XY\Z') + def test_expandvars(self): oldenv = os.environ.copy() try: diff --git a/Lib/test/test_optparse.py b/Lib/test/test_optparse.py index 641f37d670..2fad442f7c 100644 --- a/Lib/test/test_optparse.py +++ b/Lib/test/test_optparse.py @@ -799,15 +799,13 @@ class TestBool(BaseTest): (options, args) = self.assertParseOK(["-q"], {'verbose': 0}, []) - if hasattr(__builtins__, 'False'): - self.failUnless(options.verbose is False) + self.assertTrue(options.verbose is False) def test_bool_true(self): (options, args) = self.assertParseOK(["-v"], {'verbose': 1}, []) - if hasattr(__builtins__, 'True'): - self.failUnless(options.verbose is True) + self.assertTrue(options.verbose is True) def test_bool_flicker_on_and_off(self): self.assertParseOK(["-qvq", "-q", "-v"], diff --git a/Misc/NEWS b/Misc/NEWS index e0de7f9ee5..9440045c61 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -89,6 +89,24 @@ C-API Library ------- +- Issue #5294: Fix the behavior of pdb's "continue" command when called + in the top-level debugged frame. + +- Issue #5727: Restore the ability to use readline when calling into pdb + in doctests. + +- Issue #6719: In pdb, do not stop somewhere in the encodings machinery + if the source file to be debugged is in a non-builtin encoding. + +- Issue #8048: Prevent doctests from failing when sys.displayhook has + been reassigned. + +- Issue #8015: In pdb, do not crash when an empty line is entered as + a breakpoint command. + +- Issue #7909: Do not touch paths with the special prefixes ``\\.\`` + or ``\\?\`` in ntpath.normpath(). + - Issue #5146: Handle UID THREAD command correctly in imaplib. - Issue #5147: Fix the header generated for cookie files written by diff --git a/Python/getversion.c b/Python/getversion.c index 7af16fc810..7bd6efd0a0 100644 --- a/Python/getversion.c +++ b/Python/getversion.c @@ -9,7 +9,7 @@ const char * Py_GetVersion(void) { static char version[250]; - PyOS_snprintf(version, sizeof(version), "%.80s (%.80s) %.80s", + PyOS_snprintf(version, sizeof(version), "%.80s (%.80s) %.80s", PY_VERSION, Py_GetBuildInfo(), Py_GetCompiler()); return version; }