]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-41137: Use utf-8 encoding while reading .pdbrc files (GH-21263)
authorSrinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) <thatiparthysreenivas@gmail.com>
Thu, 8 Jul 2021 07:16:08 +0000 (12:46 +0530)
committerGitHub <noreply@github.com>
Thu, 8 Jul 2021 07:16:08 +0000 (16:16 +0900)
Doc/library/pdb.rst
Doc/whatsnew/3.11.rst
Lib/pdb.py
Lib/test/test_pdb.py
Misc/NEWS.d/next/Library/2020-07-01-17-42-41.bpo-41137.AnqbP-.rst [new file with mode: 0644]

index ed1e9712c0e3de41247ffcfb2ca4cb381b85dd42..6d1dba1bf2eb01e8a964b752fb21238df1615161 100644 (file)
@@ -241,10 +241,14 @@ middle of a quoted string.
    triple: debugger; configuration; file
 
 If a file :file:`.pdbrc` exists in the user's home directory or in the current
-directory, it is read in and executed as if it had been typed at the debugger
-prompt.  This is particularly useful for aliases.  If both files exist, the one
-in the home directory is read first and aliases defined there can be overridden
-by the local file.
+directory, it is read with ``'utf-8'`` encoding and executed as if it had been
+typed at the debugger prompt.  This is particularly useful for aliases.  If both
+files exist, the one in the home directory is read first and aliases defined there
+can be overridden by the local file.
+
+.. versionchanged:: 3.11
+   :file:`.pdbrc` is now read with ``'utf-8'`` encoding. Previously, it was read
+   with the system locale encoding.
 
 .. versionchanged:: 3.2
    :file:`.pdbrc` can now contain commands that continue debugging, such as
index 5b51273ed6b9a2b6814fb908ac40910545f6448a..5b58ef681c671fb3c417561ced7f6bd724384c99 100644 (file)
@@ -151,6 +151,9 @@ Optimizations
   (Contributed by Ken Jin and Mark Shannon in :issue:`26110`, based on ideas
   implemented in PyPy.)
 
+* :file:`.pdbrc` is now read with ``'utf-8'`` encoding.
+
+
 CPython bytecode changes
 ========================
 
index 1b4ff54833fcb424ff730828dbf01573ab99cbee..72ebd711ea9765667e7ebf994969a4e970b83b18 100755 (executable)
@@ -166,12 +166,12 @@ class Pdb(bdb.Bdb, cmd.Cmd):
         self.rcLines = []
         if readrc:
             try:
-                with open(os.path.expanduser('~/.pdbrc')) as rcFile:
+                with open(os.path.expanduser('~/.pdbrc'), encoding='utf-8') as rcFile:
                     self.rcLines.extend(rcFile)
             except OSError:
                 pass
             try:
-                with open(".pdbrc") as rcFile:
+                with open(".pdbrc", encoding='utf-8') as rcFile:
                     self.rcLines.extend(rcFile)
             except OSError:
                 pass
index 63afb81cb168ff9b86c6f303b1d7e0c65304adb4..17634c707b6a1902f1d6a132b6e6ccf09637812c 100644 (file)
@@ -1627,6 +1627,40 @@ def bœr():
                 if save_home is not None:
                     os.environ["HOME"] = save_home
 
+    def test_read_pdbrc_with_ascii_encoding(self):
+        script = textwrap.dedent("""
+            import pdb; pdb.Pdb().set_trace()
+            print('hello')
+        """)
+        save_home = os.environ.pop('HOME', None)
+        try:
+            with os_helper.temp_cwd():
+                with open('.pdbrc', 'w', encoding='utf-8') as f:
+                    f.write("Fran\u00E7ais")
+
+                with open('main.py', 'w', encoding='utf-8') as f:
+                    f.write(script)
+
+                cmd = [sys.executable, 'main.py']
+                env = {'PYTHONIOENCODING': 'ascii'}
+                if sys.platform == 'win32':
+                    env['PYTHONLEGACYWINDOWSSTDIO'] = 'non-empty-string'
+                proc = subprocess.Popen(
+                    cmd,
+                    stdout=subprocess.PIPE,
+                    stdin=subprocess.PIPE,
+                    stderr=subprocess.PIPE,
+                    env={**os.environ, **env}
+                )
+                with proc:
+                    stdout, stderr = proc.communicate(b'c\n')
+                    self.assertIn(b"UnicodeEncodeError: \'ascii\' codec can\'t encode character "
+                                  b"\'\\xe7\' in position 21: ordinal not in range(128)", stderr)
+
+        finally:
+            if save_home is not None:
+                os.environ['HOME'] = save_home
+
     def test_header(self):
         stdout = StringIO()
         header = 'Nobody expects... blah, blah, blah'
diff --git a/Misc/NEWS.d/next/Library/2020-07-01-17-42-41.bpo-41137.AnqbP-.rst b/Misc/NEWS.d/next/Library/2020-07-01-17-42-41.bpo-41137.AnqbP-.rst
new file mode 100644 (file)
index 0000000..f91b47d
--- /dev/null
@@ -0,0 +1 @@
+Use utf-8 encoding while reading .pdbrc files. Patch by Srinivas Reddy Thatiparthy
\ No newline at end of file