[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