Mercurial > hg
comparison mercurial/chgserver.py @ 48951:cf99c4af1079
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.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Fri, 04 Mar 2022 10:28:46 +0900 |
parents | 642e31cb55f0 |
children | cd51d4957b28 |
comparison
equal
deleted
inserted
replaced
48950:11c0411bf4e2 | 48951:cf99c4af1079 |
---|---|
436 if not self._oldios: | 436 if not self._oldios: |
437 return | 437 return |
438 nullfd = os.open(os.devnull, os.O_WRONLY) | 438 nullfd = os.open(os.devnull, os.O_WRONLY) |
439 ui = self.ui | 439 ui = self.ui |
440 for (ch, fp, fd), (cn, fn, mode) in zip(self._oldios, _iochannels): | 440 for (ch, fp, fd), (cn, fn, mode) in zip(self._oldios, _iochannels): |
441 newfp = getattr(ui, fn) | |
442 # On Python 3, newfp is just a wrapper around fp even if newfp is | |
443 # not fp, so deleting newfp is safe. | |
444 if newfp is not fp: | |
445 newfp.close() | |
446 # restore original fd: fp is open again | |
447 try: | 441 try: |
448 if newfp is fp and 'w' in mode: | 442 if 'w' in mode: |
449 # Discard buffered data which couldn't be flushed because | 443 # Discard buffered data which couldn't be flushed because |
450 # of EPIPE. The data should belong to the current session | 444 # of EPIPE. The data should belong to the current session |
451 # and should never persist. | 445 # and should never persist. |
452 os.dup2(nullfd, fp.fileno()) | 446 os.dup2(nullfd, fp.fileno()) |
453 fp.flush() | 447 fp.flush() |