Patchwork D12556: windows: disable pager when packaged with py2exe

login
register
mail settings
Submitter phabricator
Date April 13, 2022, 10:48 p.m.
Message ID <differential-rev-PHID-DREV-r4gx3py54kvioddsif2t-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/50905/
State New
Headers show

Comments

phabricator - April 13, 2022, 10:48 p.m.
mharbison72 created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  With Windows and py3, all output that got directed to the pager was lost.  It
  can be worked around by the user piping to `more`, but that's easy to forget,
  and can be dangerous if `hg diff` or similar incorrectly shows no changes.  The
  problem appears to be the new WindowsConsoleIO in py3.6[1].  We've worked around
  it with PyOxidizer by setting the `Py_LegacyWindowsStdioFlag` interpreter
  option, and worked around it with `hg.bat` and `exewrapper.c` by internally
  setting `PYTHONLEGACYWINDOWSSTDIO=1`.
  
  Unfortunately, py2exe doesn't appear to be able to set the interpreter option,
  and somehow seems to also ignore the environment variable.  The latter isn't a
  good fix anyway, since setting it in the environment would affect other python
  programs too.  We can't install a global config for this because a config closer
  to the user (e.g. from before pager was turned on by default) can override it.
  
  [1] https://peps.python.org/pep-0528/

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D12556

AFFECTED FILES
  mercurial/ui.py

CHANGE DETAILS




To: mharbison72, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/mercurial/ui.py b/mercurial/ui.py
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -1432,6 +1432,14 @@ 
             # HGPLAINEXCEPT=pager, and the user didn't specify --debug.
             return
 
+        # py2exe doesn't appear to be able to use legacy I/O, and nothing is
+        # output to the pager for paged commands.  Piping to `more` in cmd.exe
+        # works, but is easy to forget.  Just disable pager for py2exe, but
+        # leave it working for pyoxidizer and exewrapper builds.
+        if pycompat.iswindows and getattr(sys, "frozen", None) == "console_exe":
+            self.debug(b"pager is unavailable with py2exe packaging\n")
+            return
+
         pagercmd = self.config(b'pager', b'pager', rcutil.fallbackpager)
         if not pagercmd:
             return