#16306: report only the first unknown option and add more tests. Patch by Serhiy Storchaka.

This commit is contained in:
Ezio Melotti 2012-11-23 18:48:32 +02:00
parent 3c76aa6b23
commit a0dd22e5e8
3 changed files with 17 additions and 4 deletions

View File

@ -376,12 +376,24 @@ class CmdLineTest(unittest.TestCase):
print("del sys.modules['__main__']", file=script) print("del sys.modules['__main__']", file=script)
assert_python_ok(filename) assert_python_ok(filename)
def test_unknown_options(self): def test_unknown_options(self):
rc, out, err = assert_python_failure('-z', __cleanenv=True) rc, out, err = assert_python_failure('-E', '-z')
self.assertIn(b'Unknown option', err) self.assertIn(b'Unknown option: -z', err)
self.assertEqual(err.splitlines().count(b'Unknown option: -z'), 1) self.assertEqual(err.splitlines().count(b'Unknown option: -z'), 1)
self.assertEqual(b'', out) self.assertEqual(b'', out)
# Add "without='-E'" to prevent _assert_python to append -E
# to env_vars and change the output of stderr
rc, out, err = assert_python_failure('-z', without='-E')
self.assertIn(b'Unknown option: -z', err)
self.assertEqual(err.splitlines().count(b'Unknown option: -z'), 1)
self.assertEqual(b'', out)
rc, out, err = assert_python_failure('-a', '-z', without='-E')
self.assertIn(b'Unknown option: -a', err)
# only the first unknown option is reported
self.assertNotIn(b'Unknown option: -z', err)
self.assertEqual(err.splitlines().count(b'Unknown option: -a'), 1)
self.assertEqual(b'', out)
def test_main(): def test_main():
test.support.run_unittest(CmdLineTest) test.support.run_unittest(CmdLineTest)

View File

@ -339,6 +339,7 @@ Py_Main(int argc, wchar_t **argv)
/* Hash randomization needed early for all string operations /* Hash randomization needed early for all string operations
(including -W and -X options). */ (including -W and -X options). */
_PyOS_opterr = 0; /* prevent printing the error in 1st pass */
while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) { while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
if (c == 'm' || c == 'c') { if (c == 'm' || c == 'c') {
/* -c / -m is the last option: following arguments are /* -c / -m is the last option: following arguments are

View File

@ -45,7 +45,7 @@ static wchar_t *opt_ptr = L"";
void _PyOS_ResetGetOpt(void) void _PyOS_ResetGetOpt(void)
{ {
_PyOS_opterr = 0; /* prevent printing the error in 2nd loop in main.c */ _PyOS_opterr = 1;
_PyOS_optind = 1; _PyOS_optind = 1;
_PyOS_optarg = NULL; _PyOS_optarg = NULL;
opt_ptr = L""; opt_ptr = L"";