]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-108791: Fix `pdb` CLI invalid argument handling (#108816)
authorRadislav Chugunov <52372310+chgnrdv@users.noreply.github.com>
Mon, 16 Oct 2023 09:38:07 +0000 (12:38 +0300)
committerGitHub <noreply@github.com>
Mon, 16 Oct 2023 09:38:07 +0000 (10:38 +0100)
Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2023-09-02-16-07-23.gh-issue-108791.fBcAqh.rst [new file with mode: 0644]

index 129dd65bf592b378f90d94e8995768b7a3878e93..67f8d57c1a7768f4e7b35ae7fc84e04c24d55e85 100755 (executable)
@@ -138,6 +138,9 @@ class _ScriptTarget(str):
         if not os.path.exists(self):
             print('Error:', self.orig, 'does not exist')
             sys.exit(1)
+        if os.path.isdir(self):
+            print('Error:', self.orig, 'is a directory')
+            sys.exit(1)
 
         # Replace pdb's dir with script's dir in front of module search path.
         sys.path[0] = os.path.dirname(self)
@@ -164,6 +167,9 @@ class _ModuleTarget(str):
     def check(self):
         try:
             self._details
+        except ImportError as e:
+            print(f"ImportError: {e}")
+            sys.exit(1)
         except Exception:
             traceback.print_exc()
             sys.exit(1)
index a668b6cf2a84f83c6cc0e6b4fa77271910913cc7..4701fa0cc9656ade878fc85d3590f3b8d85e84b2 100644 (file)
@@ -2820,8 +2820,7 @@ def bœr():
         stdout, stderr = self._run_pdb(
             ['-m', module_name], "", expected_returncode=1
         )
-        self.assertIn("ImportError: No module named t_main.__main__",
-                      stdout.splitlines())
+        self.assertIn("ImportError: No module named t_main.__main__;", stdout)
 
     def test_package_without_a_main(self):
         pkg_name = 't_pkg'
@@ -2839,6 +2838,22 @@ def bœr():
             "'t_pkg.t_main' is a package and cannot be directly executed",
             stdout)
 
+    def test_nonexistent_module(self):
+        assert not os.path.exists(os_helper.TESTFN)
+        stdout, stderr = self._run_pdb(["-m", os_helper.TESTFN], "", expected_returncode=1)
+        self.assertIn(f"ImportError: No module named {os_helper.TESTFN}", stdout)
+
+    def test_dir_as_script(self):
+        with os_helper.temp_dir() as temp_dir:
+            stdout, stderr = self._run_pdb([temp_dir], "", expected_returncode=1)
+            self.assertIn(f"Error: {temp_dir} is a directory", stdout)
+
+    def test_invalid_cmd_line_options(self):
+        stdout, stderr = self._run_pdb(["-c"], "", expected_returncode=2)
+        self.assertIn(f"pdb: error: argument -c/--command: expected one argument", stdout.split('\n')[1])
+        stdout, stderr = self._run_pdb(["--spam", "-m", "pdb"], "", expected_returncode=2)
+        self.assertIn(f"pdb: error: unrecognized arguments: --spam", stdout.split('\n')[1])
+
     def test_blocks_at_first_code_line(self):
         script = """
                 #This is a comment, on line 2
diff --git a/Misc/NEWS.d/next/Library/2023-09-02-16-07-23.gh-issue-108791.fBcAqh.rst b/Misc/NEWS.d/next/Library/2023-09-02-16-07-23.gh-issue-108791.fBcAqh.rst
new file mode 100644 (file)
index 0000000..84a2cd5
--- /dev/null
@@ -0,0 +1 @@
+Improved error handling in :mod:`pdb` command line interface, making it produce more concise error messages.