Merged revisions 83381 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/release27-maint

................
  r83381 | r.david.murray | 2010-08-01 00:04:03 -0400 (Sun, 01 Aug 2010) | 23 lines

  Merged revisions 83380 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/branches/py3k

  ........
    r83380 | r.david.murray | 2010-07-31 23:31:09 -0400 (Sat, 31 Jul 2010) | 17 lines

    #8620: Cmd no longer truncates last character if stdin ends without newline

    Cmd used to blindly chop off the last character of every input line.  If
    the input reached EOF and there was no final new line, it would truncate
    the last character of the last command.  This fix instead strips trailing
    \r\n from the input lines.  While this is a small behavior change, it
    should not break any working code, since feeding a '\r\n' terminated
    file to Cmd would previously leave the \r's on the lines, resulting
    in failed command execution.

    I wrote the unit test in preparation for a PyOhio TeachMe session
    run by Catherine Devlin, and we can thank Catherine and the PyOhio
    session attendees for the fix.  I've added Catherine to the Acks file
    for organizing and leading the TeachMe session, out of which we will
    hopefully get some new contributors.
  ........
................
This commit is contained in:
R. David Murray 2010-08-01 04:11:05 +00:00
parent 2b112a6bb3
commit 0d023db386
4 changed files with 32 additions and 1 deletions

View File

@ -137,7 +137,7 @@ class Cmd:
if not len(line):
line = 'EOF'
else:
line = line[:-1] # chop \n
line = line.rstrip('\r\n')
line = self.precmd(line)
stop = self.onecmd(line)
stop = self.postcmd(stop, line)

View File

@ -7,6 +7,9 @@ Original by Michael Schneider
import cmd
import sys
import re
import unittest
import StringIO
class samplecmdclass(cmd.Cmd):
"""
@ -165,9 +168,33 @@ class samplecmdclass(cmd.Cmd):
def do_exit(self, arg):
return True
class TestAlternateInput(unittest.TestCase):
class simplecmd(cmd.Cmd):
def do_print(self, args):
print >>self.stdout, args
def do_EOF(self, args):
return True
def test_file_with_missing_final_nl(self):
input = StringIO.StringIO("print test\nprint test2")
output = StringIO.StringIO()
cmd = self.simplecmd(stdin=input, stdout=output)
cmd.use_rawinput = False
cmd.cmdloop()
self.assertEqual(output.getvalue(),
("(Cmd) test\n"
"(Cmd) test2\n"
"(Cmd) "))
def test_main(verbose=None):
from test import test_support, test_cmd
test_support.run_doctest(test_cmd, verbose)
test_support.run_unittest(TestAlternateInput)
def test_coverage(coverdir):
import trace

View File

@ -170,6 +170,7 @@ Vincent Delft
Arnaud Delobelle
Erik Demaine
Roger Dev
Catherine Devlin
Raghuram Devarakonda
Scott Dial
Toby Dickenson

View File

@ -84,6 +84,9 @@ C-API
Library
-------
- Issue #8620: when a Cmd is fed input that reaches EOF without a final
newline, it no longer truncates the last character of the last command line.
- Issue #7066: archive_util.make_archive now restores the cwd if an error is
raised. Initial patch by Ezio Melotti.