mirror of
https://github.com/borgbackup/borg.git
synced 2024-12-26 09:47:58 +00:00
Merge pull request #1379 from PlasmaPower/stdio-broken-pipe
Ignore stdout/stderr broken pipe errors
This commit is contained in:
commit
e32dcc4c8a
2 changed files with 29 additions and 3 deletions
|
@ -22,7 +22,7 @@
|
|||
get_cache_dir, prune_within, prune_split, \
|
||||
Manifest, NoManifestError, remove_surrogates, update_excludes, format_archive, check_extension_modules, Statistics, \
|
||||
dir_is_tagged, bigint_to_int, ChunkerParams, CompressionSpec, PrefixSpec, is_slow_msgpack, yes, sysinfo, \
|
||||
EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR, log_multi, PatternMatcher
|
||||
EXIT_SUCCESS, EXIT_WARNING, EXIT_ERROR, log_multi, PatternMatcher, ErrorIgnoringTextIOWrapper
|
||||
from .logger import create_logger, setup_logging
|
||||
logger = create_logger()
|
||||
from .compress import Compressor, COMPR_BUFFER
|
||||
|
@ -1592,8 +1592,8 @@ def setup_signal_handlers(): # pragma: no cover
|
|||
def main(): # pragma: no cover
|
||||
# Make sure stdout and stderr have errors='replace') to avoid unicode
|
||||
# issues when print()-ing unicode file names
|
||||
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, sys.stdout.encoding, 'replace', line_buffering=True)
|
||||
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, sys.stderr.encoding, 'replace', line_buffering=True)
|
||||
sys.stdout = ErrorIgnoringTextIOWrapper(sys.stdout.buffer, sys.stdout.encoding, 'replace', line_buffering=True)
|
||||
sys.stderr = ErrorIgnoringTextIOWrapper(sys.stderr.buffer, sys.stderr.encoding, 'replace', line_buffering=True)
|
||||
setup_signal_handlers()
|
||||
archiver = Archiver()
|
||||
msg = None
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
import platform
|
||||
import time
|
||||
import unicodedata
|
||||
import io
|
||||
import errno
|
||||
|
||||
import logging
|
||||
from .logger import create_logger
|
||||
|
@ -1089,3 +1091,27 @@ def log_multi(*msgs, level=logging.INFO):
|
|||
lines.extend(msg.splitlines())
|
||||
for line in lines:
|
||||
logger.log(level, line)
|
||||
|
||||
|
||||
class ErrorIgnoringTextIOWrapper(io.TextIOWrapper):
|
||||
def read(self, n):
|
||||
if not self.closed:
|
||||
try:
|
||||
return super().read(n)
|
||||
except BrokenPipeError:
|
||||
try:
|
||||
super().close()
|
||||
except OSError:
|
||||
pass
|
||||
return ''
|
||||
|
||||
def write(self, s):
|
||||
if not self.closed:
|
||||
try:
|
||||
return super().write(s)
|
||||
except BrokenPipeError:
|
||||
try:
|
||||
super().close()
|
||||
except OSError:
|
||||
pass
|
||||
return len(s)
|
||||
|
|
Loading…
Reference in a new issue