chgserver: remove Python 2 file descriptor logic
Follows up 0bb28b7736bc "chgserver: remove Python 2 support code."
On Python 2, we had to close newfp prior to restoring the original file
description since "delete newfp" would otherwise close the file descriptor
shared with the long-lived fp:
in attachio():
newfp = os.fdopen(fp.fileno(), mode, bufsize)
in _restoreio():
newfp.close() # temporarily close newfp.fileno() (= fp.fileno())
os.dup2(fd, fp.fileno()) # reopen fp.fileno() with original fd
On the other hand, we shouldn't call newfp.close() on Python 3 since
any function calls are proxied to the underlying file object by
procutil.LineBufferedWrapper.
--- a/mercurial/chgserver.py Tue Feb 08 15:51:52 2022 +0100
+++ b/mercurial/chgserver.py Fri Mar 04 10:28:46 2022 +0900
@@ -438,14 +438,8 @@
nullfd = os.open(os.devnull, os.O_WRONLY)
ui = self.ui
for (ch, fp, fd), (cn, fn, mode) in zip(self._oldios, _iochannels):
- newfp = getattr(ui, fn)
- # On Python 3, newfp is just a wrapper around fp even if newfp is
- # not fp, so deleting newfp is safe.
- if newfp is not fp:
- newfp.close()
- # restore original fd: fp is open again
try:
- if newfp is fp and 'w' in mode:
+ if 'w' in mode:
# Discard buffered data which couldn't be flushed because
# of EPIPE. The data should belong to the current session
# and should never persist.