summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEzio Melotti <ezio.melotti@gmail.com>2012-11-23 16:46:11 (GMT)
committerEzio Melotti <ezio.melotti@gmail.com>2012-11-23 16:46:11 (GMT)
commitec6486d52d89cea1362697dd0d92e127c188d298 (patch)
treed90ba79332f504ea7997f176a723a707af6936ce
parent0afe4e4fa6df2acc46de6e826de06b9f343de7f1 (diff)
downloadcpython-ec6486d52d89cea1362697dd0d92e127c188d298.zip
cpython-ec6486d52d89cea1362697dd0d92e127c188d298.tar.gz
cpython-ec6486d52d89cea1362697dd0d92e127c188d298.tar.bz2
#16306: report only the first unknown option and add more tests. Patch by Serhiy Storchaka.
-rw-r--r--Lib/test/test_cmd_line.py18
-rw-r--r--Modules/main.c1
-rw-r--r--Python/getopt.c2
3 files changed, 16 insertions, 5 deletions
diff --git a/Lib/test/test_cmd_line.py b/Lib/test/test_cmd_line.py
index b803046..12f26d9 100644
--- a/Lib/test/test_cmd_line.py
+++ b/Lib/test/test_cmd_line.py
@@ -116,14 +116,24 @@ class CmdLineTest(unittest.TestCase):
print >>script, "del sys.modules['__main__']"
assert_python_ok(filename)
-
def test_unknown_options(self):
- # Add "without='-E'" to prevent _assert_python append env_vars -E
- # which changes the output of stderr
+ rc, out, err = assert_python_failure('-E', '-z')
+ self.assertIn(b'Unknown option: -z', err)
+ self.assertEqual(err.splitlines().count(b'Unknown option: -z'), 1)
+ 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', err)
+ 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():
test.test_support.run_unittest(CmdLineTest)
diff --git a/Modules/main.c b/Modules/main.c
index 1ce7c8f..ef9b245 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -264,6 +264,7 @@ Py_Main(int argc, char **argv)
/* Hash randomization needed early for all string operations
(including -W and -X options). */
+ _PyOS_opterr = 0; /* prevent printing the error in 1st pass */
while ((c = _PyOS_GetOpt(argc, argv, PROGRAM_OPTS)) != EOF) {
if (c == 'm' || c == 'c') {
/* -c / -m is the last option: following arguments are
diff --git a/Python/getopt.c b/Python/getopt.c
index 624da9a..af5b03c 100644
--- a/Python/getopt.c
+++ b/Python/getopt.c
@@ -41,7 +41,7 @@ static char *opt_ptr = "";
void _PyOS_ResetGetOpt(void)
{
- _PyOS_opterr = 0; /* prevent printing the error in 2nd loop in main.c */
+ _PyOS_opterr = 1;
_PyOS_optind = 1;
_PyOS_optarg = NULL;
opt_ptr = "";