pager: avoid shell=True on subprocess.Popen for better errors (
issue5491)
man(1) behaves as poorly as Mercurial without this change. This cribs
from git's run-command[0], which has a list of characters that imply a
string that needs to be run using 'sh -c'. If none of those characters
are present in the command string, we can use shell=False mode on
subprocess and get significantly better error messages (see the test)
when the pager process is invalid. With a complicated pager command
(that contains one of the unsafe characters), we behave as we do today
(which is no worse than git manages.)
I briefly tried tapdancing in a thread to catch early pager exits, but
it's just too perilous: you get races between fd duping operations and
a bad pager exiting, and it's too hard to differentiate between a
slow-bad-pager result and a fast-human-quit-pager-early result.
I've observed some weird variation in exit code handling in the "bad
experience" case in test-pager.t: on my Mac hg predictably exits
nonzero, but on Linux hg always exits zero in that case. For now,
we'll work around it with || true. :(
0: https://github.com/git/git/blob/
cddbda4bc87b9d2c985b6749b1cf026b15e2d3e7/run-command.c#L201
<Include>
<!-- These are component GUIDs used for Mercurial installers.
YOU MUST CHANGE ALL GUIDs below when copying this file
and replace 'Mercurial' in this notice with the name of
your project. Component GUIDs have global namespace! -->
<!-- contrib.wxs -->
<?define contrib.guid = {4E11FFC2-E2F7-482A-8460-9394B5489F02} ?>
<?define contrib.vim.guid = {BB04903A-652D-4C4F-9590-2BD07A2304F2} ?>
<!-- dist.wxs -->
<?define dist.guid = {CE405FE6-CD1E-4873-9C9A-7683AE5A3D90} ?>
<?define lib.guid = {91D53B14-E924-432A-ACA2-65F9B3F7C56A} ?>
<!-- doc.wxs -->
<?define doc.hg.1.html.guid = {AAAA3FDA-EDC5-4220-B59D-D342722358A2} ?>
<?define doc.hgignore.5.html.guid = {AA9118C4-F3A0-4429-A5F4-5A1906B2D67F} ?>
<?define doc.hgrc.5.html = {E0CEA1EB-FA01-408c-844B-EE5965165BAE} ?>
<?define doc.style.css = {172F8262-98E0-4711-BD39-4DAE0D77EF05} ?>
<!-- help.wxs -->
<?define help.root.guid = {9FA957DB-6DFE-44f2-AD03-293B2791CF17} ?>
<?define help.internals.guid = {2DD7669D-0DB8-4C39-9806-78E6475E7ACC} ?>
<!-- i18n.wxs -->
<?define i18nFolder.guid = {1BF8026D-CF7C-4174-AEE6-D6B7BF119248} ?>
<!-- templates.wxs -->
<?define templates.root.guid = {437FD55C-7756-4EA0-87E5-FDBE75DC8595} ?>
<?define templates.atom.guid = {D30E14A5-8AF0-4268-8B00-00BEE9E09E39} ?>
<?define templates.coal.guid = {B63CCAAB-4EAF-43b4-901E-4BD13F5B78FC} ?>
<?define templates.gitweb.guid = {827334AF-1EFD-421B-962C-5660A068F612} ?>
<?define templates.json.guid = {F535BE7A-EC34-46E0-B9BE-013F3DBAFB19} ?>
<?define templates.monoblue.guid = {8060A1E4-BD4C-453E-92CB-9536DC44A9E3} ?>
<?define templates.paper.guid = {61AB1DE9-645F-46ED-8AF8-0CF02267FFBB} ?>
<?define templates.raw.guid = {834DF8D7-9784-43A6-851D-A96CE1B3575B} ?>
<?define templates.rss.guid = {9338FA09-E128-4B1C-B723-1142DBD09E14} ?>
<?define templates.spartan.guid = {80222625-FA8F-44b1-86CE-1781EF375D09} ?>
<?define templates.static.guid = {6B3D7C24-98DA-4B67-9F18-35F77357B0B4} ?>
<!-- mercurial.wxs -->
<?define ProductUpgradeCode = {A1CC6134-E945-4399-BE36-EB0017FDF7CF} ?>
<?define ComponentMainExecutableGUID = {D102B8FA-059B-4ACC-9FA3-8C78C3B58EEF} ?>
<?define ReadMe.guid = {56A8E372-991D-4DCA-B91D-93D775974CF5} ?>
<?define COPYING.guid = {B7801DBA-1C49-4BF4-91AD-33C65F5C7895} ?>
<?define mercurial.rc.guid = {1D5FAEEE-7E6E-43B1-9F7F-802714316B15} ?>
<?define mergetools.rc.guid = {E8A1DC29-FF40-4B5F-BD12-80B9F7BF0CCD} ?>
<?define ProgramMenuDir.guid = {D5A63320-1238-489B-B68B-CF053E9577CA} ?>
</Include>