# HG changeset patch # User Matt Harbison # Date 1489983573 14400 # Node ID c5d924e5dfdb73fa17af18a33367cab91c7a3bd5 # Parent 2c02bb7fd7fc1212029dc903527e35a9efb7dbe1 pager: fix the invocation of `more` on Windows After 9335dc6b2a9c, with 'shell' being (mostly) set to False, invoking `more` no longer worked. Instead, a warning was printed and the pager was disabled. Invoking `more.com` works. Since a user may have configured 'pager.pager=more', do this substitution at the end. Surprisingly, `more` does allow for arguments, so those are preserved. This also allows `more` to work in MSYS. Setting 'shell=False' runs the executable via CreateProcess(), which has rather wonky rules for resolving an executable without an extension [1]. Resolving to *.com is not among them. Since 'shell=True' yields a cryptic error for a bad $PAGER, and a *.exe program will work without specifying the extension, sticking with current 'shell=False' seems like the right thing to do. I don't think there are any other *.com pagers out there, so this one special case seems OK. If somebody wants to do something crazy that requires cmd.exe, I was able to get normal paged output with 'pager.pager="cmd.exe /c more"'. I assume you can replace `more` with *.bat, *.vbs or various other creatures listed in $PATHEXT. [1] https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx diff -r 2c02bb7fd7fc -r c5d924e5dfdb mercurial/ui.py --- a/mercurial/ui.py Wed Mar 22 16:36:53 2017 -0700 +++ b/mercurial/ui.py Mon Mar 20 00:19:33 2017 -0400 @@ -846,6 +846,15 @@ 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