[PATCH] Implementing the pager patch as an extension

David Soria Parra sn_ at gmx.net
Wed Mar 19 19:02:51 CDT 2008


MPM and some others discussed the pager patch from me today in IRC and they wanted to see the pager
patch as an extension instead of having it in core.

so here is the patch. Alexis though that we should preserve the default behaviour of piping into a
pager, which means that we accept broken pipe errors. As I don't like that solution very much, as
those messages are really annoying I implemented it as a "feature". By default, the pager behaves
exaclty the same way as it would if you pipe it on the shell "hg log | less", but you can silence
the broken pipe errors by setting the pager.quiet variable to true.

I hope you like the solution.

--------------------

# HG changeset patch
# User David Soria Parra <dsp at php.net>
# Date 1205971034 -3600
# Node ID 17f7b62c5926250882b31abc17e574b4b693d2e9
# Parent  bace1990ab123f998567b1f2e9584cfc5fc7948d
Use the pager given by the environment to display long output

Unix systems usually have a PAGER environment variable set.
If it is set, mercurial will use the pager application to display
output.

Two configuration variables are available to influence the
behaviour of the pager:
  pager.application
    sets the application to be used
  pager.quiet
   silences Broken Pipe errors that might occur when the user
   quits the pager before mercurial finished to write the output

diff -r bace1990ab12 -r 17f7b62c5926 hgext/pager.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext/pager.py	Thu Mar 20 00:57:14 2008 +0100
@@ -0,0 +1,54 @@
+# pager.py - display output using a pager
+#
+# Copyright 2008 David Soria Parra <dsp at php.net>
+#
+# This software may be used and distributed according to the terms
+# of the GNU General Public License, incorporated herein by reference.
+#
+# To load the extension add it to your .hgrc file
+#
+#   [extension]
+#   hgext.pager =
+#
+# To set the pager that should be used, set the application variable
+#
+#   [pager]
+#   application = less
+#
+# You can also set environment variables there
+#
+#   [pager]
+#   application = LESS='FSRX' less
+#
+# If no application is set, the pager extensions use the environment
+# variable $PAGER. If neither pager.application, nor
+# $PAGER is set, no pager is used.
+#
+# If you notice "BROKEN PIPE" error messages, you can disable them
+# by setting
+#
+#  [pager]
+#  quiet = True
+#
+
+import sys, os, signal
+
+def getpager(ui):
+    '''return a pager
+
+    We separate this method from the pager class as we don't want to
+    instantiate a pager if it is not used at all
+    '''
+    if sys.stdout.isatty():
+        return (ui.config("pager", "application")
+                or os.environ.get("PAGER"))
+
+def uisetup(ui):
+    # disable broken pipe error messages
+    if ui.configbool('pager', 'quiet', False):
+        signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+
+    if getpager(ui):
+        pager = os.popen(getpager(ui), 'wb')
+        sys.stderr = pager
+        sys.stdout = pager



More information about the Mercurial-devel mailing list