HomePhabricator

dispatch: ignore failure to flush ui

Authored by martinvonz.

Description

dispatch: ignore failure to flush ui

When the pager dies, we get a SIGPIPE. That causes
error.SignalInterrupt to be raised (from ui._catchterm()`). Any
further writes or flushes will cause further SIGPIPEs and furhter
error.SignalInterrupt. If we write or flush outside of the
try/except that handle KeyboardInterrupt (which
error.SignalInterrupt is a subclass of), then control will escape
from the dispatch module. Let's fix that by ignoring errors from
flushing the ui.

I would have rather fixed this by restoring the stdout and stderr
streams when the pager dies, but it gets complicated because of
multiple ui instances (ui/lui) and different pager setups between
regular hg and chg.

This changes a test in test-pager.t, but I don't understand why. I
would have thought that all the output from the command should have
gone to the broken pager.

Differential Revision: https://phab.mercurial-scm.org/D11627