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,