From 22f06d6ce344ba80f2213fbe12fe951ca77cab4e Mon Sep 17 00:00:00 2001
From: "Miss Islington (bot)"
 <31488909+miss-islington@users.noreply.github.com>
Date: Sat, 23 Jul 2022 20:05:10 -0700
Subject: [PATCH] gh-93157: Fix fileinput didn't support `errors` in `inplace`
 mode (GH-95128)

(cherry picked from commit 5c7f3bcdafedd60a385e8ca5403bc6b0b7a862b3)

Co-authored-by: Inada Naoki <songofacandy@gmail.com>
---
 Lib/fileinput.py                                       |  9 ++++++---
 Lib/test/test_fileinput.py                             | 10 ++++++++++
 .../2022-07-22-17-19-57.gh-issue-93157.RXByAk.rst      |  2 ++
 3 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 Misc/NEWS.d/next/Library/2022-07-22-17-19-57.gh-issue-93157.RXByAk.rst

diff --git a/Lib/fileinput.py b/Lib/fileinput.py
index 9f41c18510d..e234dc9ea65 100644
--- a/Lib/fileinput.py
+++ b/Lib/fileinput.py
@@ -335,18 +335,21 @@ def _readline(self):
                     pass
                 # The next few lines may raise OSError
                 os.rename(self._filename, self._backupfilename)
-                self._file = open(self._backupfilename, self._mode, encoding=encoding)
+                self._file = open(self._backupfilename, self._mode,
+                                  encoding=encoding, errors=self._errors)
                 try:
                     perm = os.fstat(self._file.fileno()).st_mode
                 except OSError:
-                    self._output = open(self._filename, self._write_mode, encoding=encoding)
+                    self._output = open(self._filename, self._write_mode,
+                                        encoding=encoding, errors=self._errors)
                 else:
                     mode = os.O_CREAT | os.O_WRONLY | os.O_TRUNC
                     if hasattr(os, 'O_BINARY'):
                         mode |= os.O_BINARY
 
                     fd = os.open(self._filename, mode, perm)
-                    self._output = os.fdopen(fd, self._write_mode, encoding=encoding)
+                    self._output = os.fdopen(fd, self._write_mode,
+                                             encoding=encoding, errors=self._errors)
                     try:
                         os.chmod(self._filename, perm)
                     except OSError:
diff --git a/Lib/test/test_fileinput.py b/Lib/test/test_fileinput.py
index 819200010a2..ac20c74baa0 100644
--- a/Lib/test/test_fileinput.py
+++ b/Lib/test/test_fileinput.py
@@ -326,6 +326,16 @@ def test_inplace_binary_write_mode(self):
         with open(temp_file, 'rb') as f:
             self.assertEqual(f.read(), b'New line.')
 
+    def test_inplace_encoding_errors(self):
+        temp_file = self.writeTmp(b'Initial text \x88', mode='wb')
+        with FileInput(temp_file, inplace=True,
+                       encoding="ascii", errors="replace") as fobj:
+            line = fobj.readline()
+            self.assertEqual(line, 'Initial text \ufffd')
+            print("New line \x88")
+        with open(temp_file, 'rb') as f:
+            self.assertEqual(f.read().rstrip(b'\r\n'), b'New line ?')
+
     def test_file_hook_backward_compatibility(self):
         def old_hook(filename, mode):
             return io.StringIO("I used to receive only filename and mode")
diff --git a/Misc/NEWS.d/next/Library/2022-07-22-17-19-57.gh-issue-93157.RXByAk.rst b/Misc/NEWS.d/next/Library/2022-07-22-17-19-57.gh-issue-93157.RXByAk.rst
new file mode 100644
index 00000000000..054b318ec63
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-07-22-17-19-57.gh-issue-93157.RXByAk.rst
@@ -0,0 +1,2 @@
+Fix :mod:`fileinput` module didn't support ``errors`` option when
+``inplace`` is true.
-- 
GitLab