Commit e64de92f authored by Georg Brandl's avatar Georg Brandl

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.
  ........
................
parent 03c1cff5
...@@ -186,9 +186,9 @@ followed by ``lines`` for the text version or ``binary`` for the binary version. ...@@ -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* Retrieve a file or directory listing in ASCII transfer mode. *command*
should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or a should be an appropriate ``RETR`` command (see :meth:`retrbinary`) or a
command such as ``LIST``, ``NLST`` or ``MLSD`` (usually just the string command such as ``LIST``, ``NLST`` or ``MLSD`` (usually just the string
``'LIST'``). The *callback* function is called for each line, with the ``'LIST'``). The *callback* function is called for each line with a
trailing CRLF stripped. The default *callback* prints the line to string argument containing the line with the trailing CRLF stripped.
``sys.stdout``. The default *callback* prints the line to ``sys.stdout``.
.. method:: FTP.set_pasv(boolean) .. method:: FTP.set_pasv(boolean)
......
...@@ -909,14 +909,10 @@ always available. ...@@ -909,14 +909,10 @@ always available.
.. data:: version .. data:: version
A string containing the version number of the Python interpreter plus additional 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 information on the build number and compiler used. This string is displayed
``'version (#build_number, build_date, build_time) [compiler]'``. The first when the interactive interpreter is started. Do not extract version information
three characters are used to identify the version in the installation out of it, rather, use :data:`version_info` and the functions provided by the
directories (where appropriate on each platform). An example:: :mod:`platform` module.
>>> import sys
>>> sys.version
'1.5.2 (#0 Apr 13 1999, 10:51:12) [MSC 32 bit (Intel)]'
.. data:: api_version .. data:: api_version
......
...@@ -98,6 +98,8 @@ class Bdb: ...@@ -98,6 +98,8 @@ class Bdb:
# (CT) stopframe may now also be None, see dispatch_call. # (CT) stopframe may now also be None, see dispatch_call.
# (CT) the former test for None is therefore removed from here. # (CT) the former test for None is therefore removed from here.
if frame is self.stopframe: if frame is self.stopframe:
if self.stoplineno == -1:
return False
return frame.f_lineno >= self.stoplineno return frame.f_lineno >= self.stoplineno
while frame is not None and frame is not self.stopframe: while frame is not None and frame is not self.stopframe:
if frame is self.botframe: if frame is self.botframe:
...@@ -155,10 +157,12 @@ class Bdb: ...@@ -155,10 +157,12 @@ class Bdb:
but only if we are to stop at or just below this level.""" but only if we are to stop at or just below this level."""
pass pass
def _set_stopinfo(self, stopframe, returnframe, stoplineno=-1): def _set_stopinfo(self, stopframe, returnframe, stoplineno=0):
self.stopframe = stopframe self.stopframe = stopframe
self.returnframe = returnframe self.returnframe = returnframe
self.quitting = 0 self.quitting = 0
# stoplineno >= 0 means: stop at line >= the stoplineno
# stoplineno -1 means: don't stop at all
self.stoplineno = stoplineno self.stoplineno = stoplineno
# Derived classes and clients can call the following methods # Derived classes and clients can call the following methods
...@@ -171,7 +175,7 @@ class Bdb: ...@@ -171,7 +175,7 @@ class Bdb:
def set_step(self): def set_step(self):
"""Stop after one line of code.""" """Stop after one line of code."""
self._set_stopinfo(None,None) self._set_stopinfo(None, None)
def set_next(self, frame): def set_next(self, frame):
"""Stop on the next line in or below the given frame.""" """Stop on the next line in or below the given frame."""
...@@ -198,7 +202,7 @@ class Bdb: ...@@ -198,7 +202,7 @@ class Bdb:
def set_continue(self): def set_continue(self):
# Don't stop except at breakpoints or when finished # 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: if not self.breaks:
# no breakpoints; run without debugger overhead # no breakpoints; run without debugger overhead
sys.settrace(None) sys.settrace(None)
......
...@@ -335,6 +335,8 @@ class _OutputRedirectingPdb(pdb.Pdb): ...@@ -335,6 +335,8 @@ class _OutputRedirectingPdb(pdb.Pdb):
self.__out = out self.__out = out
self.__debugger_used = False self.__debugger_used = False
pdb.Pdb.__init__(self, stdout=out) pdb.Pdb.__init__(self, stdout=out)
# still use input() to get user input
self.use_rawinput = 1
def set_trace(self, frame=None): def set_trace(self, frame=None):
self.__debugger_used = True self.__debugger_used = True
...@@ -1381,12 +1383,17 @@ class DocTestRunner: ...@@ -1381,12 +1383,17 @@ class DocTestRunner:
self.save_linecache_getlines = linecache.getlines self.save_linecache_getlines = linecache.getlines
linecache.getlines = self.__patched_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: try:
return self.__run(test, compileflags, out) return self.__run(test, compileflags, out)
finally: finally:
sys.stdout = save_stdout sys.stdout = save_stdout
pdb.set_trace = save_set_trace pdb.set_trace = save_set_trace
linecache.getlines = self.save_linecache_getlines linecache.getlines = self.save_linecache_getlines
sys.displayhook = save_displayhook
if clear_globs: if clear_globs:
test.globs.clear() test.globs.clear()
......
...@@ -399,6 +399,12 @@ def normpath(path): ...@@ -399,6 +399,12 @@ def normpath(path):
"""Normalize path, eliminating double slashes, etc.""" """Normalize path, eliminating double slashes, etc."""
# Preserve unicode (if path is unicode) # Preserve unicode (if path is unicode)
backslash, dot = (u'\\', u'.') if isinstance(path, unicode) else ('\\', '.') 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("/", "\\") path = path.replace("/", "\\")
prefix, path = splitdrive(path) prefix, path = splitdrive(path)
# We need to be careful here. If the prefix is empty, and the path starts # We need to be careful here. If the prefix is empty, and the path starts
......
...@@ -171,14 +171,18 @@ class Pdb(bdb.Bdb, cmd.Cmd): ...@@ -171,14 +171,18 @@ class Pdb(bdb.Bdb, cmd.Cmd):
def user_return(self, frame, return_value): def user_return(self, frame, return_value):
"""This function is called when a return trap is set here.""" """This function is called when a return trap is set here."""
if self._wait_for_mainpyfile:
return
frame.f_locals['__return__'] = return_value frame.f_locals['__return__'] = return_value
print >>self.stdout, '--Return--' print >>self.stdout, '--Return--'
self.interaction(frame, None) self.interaction(frame, None)
def user_exception(self, frame, exc_info): def user_exception(self, frame, exc_info):
exc_type, exc_value, exc_traceback = exc_info
"""This function is called if an exception occurs, """This function is called if an exception occurs,
but only if we are to stop at or just below this level.""" 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 frame.f_locals['__exception__'] = exc_type, exc_value
if type(exc_type) == type(''): if type(exc_type) == type(''):
exc_type_name = exc_type exc_type_name = exc_type
...@@ -265,8 +269,10 @@ class Pdb(bdb.Bdb, cmd.Cmd): ...@@ -265,8 +269,10 @@ class Pdb(bdb.Bdb, cmd.Cmd):
return self.handle_command_def(line) return self.handle_command_def(line)
def handle_command_def(self,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) cmd, arg, line = self.parseline(line)
if not cmd:
return
if cmd == 'silent': if cmd == 'silent':
self.commands_silent[self.commands_bnum] = True self.commands_silent[self.commands_bnum] = True
return # continue to handle other cmd def in the cmd list return # continue to handle other cmd def in the cmd list
...@@ -274,7 +280,7 @@ class Pdb(bdb.Bdb, cmd.Cmd): ...@@ -274,7 +280,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
self.cmdqueue = [] self.cmdqueue = []
return 1 # end of cmd list return 1 # end of cmd list
cmdlist = self.commands[self.commands_bnum] cmdlist = self.commands[self.commands_bnum]
if (arg): if arg:
cmdlist.append(cmd+' '+arg) cmdlist.append(cmd+' '+arg)
else: else:
cmdlist.append(cmd) cmdlist.append(cmd)
...@@ -313,9 +319,11 @@ class Pdb(bdb.Bdb, cmd.Cmd): ...@@ -313,9 +319,11 @@ class Pdb(bdb.Bdb, cmd.Cmd):
prompt_back = self.prompt prompt_back = self.prompt
self.prompt = '(com) ' self.prompt = '(com) '
self.commands_defining = True self.commands_defining = True
self.cmdloop() try:
self.commands_defining = False self.cmdloop()
self.prompt = prompt_back finally:
self.commands_defining = False
self.prompt = prompt_back
def do_break(self, arg, temporary = 0): def do_break(self, arg, temporary = 0):
# break [ ([filename:]lineno | function) [, "condition"] ] # break [ ([filename:]lineno | function) [, "condition"] ]
...@@ -451,7 +459,10 @@ class Pdb(bdb.Bdb, cmd.Cmd): ...@@ -451,7 +459,10 @@ class Pdb(bdb.Bdb, cmd.Cmd):
Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank Return `lineno` if it is, 0 if not (e.g. a docstring, comment, blank
line or EOF). Warning: testing is not comprehensive. 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: if not line:
print >>self.stdout, 'End of file' print >>self.stdout, 'End of file'
return 0 return 0
...@@ -1280,7 +1291,7 @@ def main(): ...@@ -1280,7 +1291,7 @@ def main():
# changed by the user from the command line. There is a "restart" command which # changed by the user from the command line. There is a "restart" command which
# allows explicit specification of command line arguments. # allows explicit specification of command line arguments.
pdb = Pdb() pdb = Pdb()
while 1: while True:
try: try:
pdb._runscript(mainpyfile) pdb._runscript(mainpyfile)
if pdb._user_requested_quit: if pdb._user_requested_quit:
......
...@@ -907,6 +907,35 @@ unexpected exception: ...@@ -907,6 +907,35 @@ unexpected exception:
... ...
ZeroDivisionError: integer division or modulo by zero ZeroDivisionError: integer division or modulo by zero
TestResults(failed=1, attempted=1) 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""" def optionflags(): r"""
Tests of `DocTestRunner`'s option flag handling. Tests of `DocTestRunner`'s option flag handling.
......
...@@ -128,6 +128,9 @@ class TestNtpath(unittest.TestCase): ...@@ -128,6 +128,9 @@ class TestNtpath(unittest.TestCase):
self.assertTrue(isinstance(ntpath.normpath(path), unicode), self.assertTrue(isinstance(ntpath.normpath(path), unicode),
'normpath() returned str instead of 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): def test_expandvars(self):
oldenv = os.environ.copy() oldenv = os.environ.copy()
try: try:
......
...@@ -799,15 +799,13 @@ class TestBool(BaseTest): ...@@ -799,15 +799,13 @@ class TestBool(BaseTest):
(options, args) = self.assertParseOK(["-q"], (options, args) = self.assertParseOK(["-q"],
{'verbose': 0}, {'verbose': 0},
[]) [])
if hasattr(__builtins__, 'False'): self.assertTrue(options.verbose is False)
self.failUnless(options.verbose is False)
def test_bool_true(self): def test_bool_true(self):
(options, args) = self.assertParseOK(["-v"], (options, args) = self.assertParseOK(["-v"],
{'verbose': 1}, {'verbose': 1},
[]) [])
if hasattr(__builtins__, 'True'): self.assertTrue(options.verbose is True)
self.failUnless(options.verbose is True)
def test_bool_flicker_on_and_off(self): def test_bool_flicker_on_and_off(self):
self.assertParseOK(["-qvq", "-q", "-v"], self.assertParseOK(["-qvq", "-q", "-v"],
......
...@@ -89,6 +89,24 @@ C-API ...@@ -89,6 +89,24 @@ C-API
Library 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 #5146: Handle UID THREAD command correctly in imaplib.
- Issue #5147: Fix the header generated for cookie files written by - Issue #5147: Fix the header generated for cookie files written by
......
...@@ -9,7 +9,7 @@ const char * ...@@ -9,7 +9,7 @@ const char *
Py_GetVersion(void) Py_GetVersion(void)
{ {
static char version[250]; 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()); PY_VERSION, Py_GetBuildInfo(), Py_GetCompiler());
return version; return version;
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment