# HG changeset patch # User Matt Harbison # Date 2017-03-25 02:40:08 # Node ID c60091fa1426892552dd6c0dd4b9c49e3c3da045 # Parent a01e1132f6fa553bfb4d193359ee92b921276eb5 pager: improve support for various flavors of `more` on Windows Hardcoding 'more' -> 'more.com' means that 'more.exe' from MSYS would need to be configured with its *.exe extension. This will resolve to either one, as cmd.exe would have done if the command ran through the shell. Something that's maybe problematic with this is it comes after 'pageractive' and various ui configs have been set by the calling method. But the other early exits in this method don't undo those changes either. diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -846,15 +846,6 @@ class ui(object): if not pagercmd: return - if pycompat.osname == 'nt': - # `more` cannot be invoked with shell=False, but `more.com` can. - # Hide this implementation detail from the user, so we can also get - # sane bad PAGER behavior. If args are also given, the space in the - # command line forces shell=True, so that case doesn't need to be - # handled here. - if pagercmd == 'more': - pagercmd = 'more.com' - self.debug('starting pager for command %r\n' % command) self.flush() self.pageractive = True @@ -881,6 +872,21 @@ class ui(object): # simple pager command configurations, we can degrade # gracefully and tell the user about their broken pager. shell = any(c in command for c in "|&;<>()$`\\\"' \t\n*?[#~=%") + + if pycompat.osname == 'nt' and not shell: + # Window's built-in `more` cannot be invoked with shell=False, but + # its `more.com` can. Hide this implementation detail from the + # user so we can also get sane bad PAGER behavior. MSYS has + # `more.exe`, so do a cmd.exe style resolution of the executable to + # determine which one to use. + fullcmd = util.findexe(command) + if not fullcmd: + self.warn(_("missing pager command '%s', skipping pager\n") + % command) + return + + command = fullcmd + try: pager = subprocess.Popen( command, shell=shell, bufsize=-1,