mercurial/ui.py
changeset 6302 8e3dc3de7e73
parent 5943 ffaf2419de44
child 6303 577a7da1d44b
--- a/mercurial/ui.py	Tue Mar 18 18:14:59 2008 -0300
+++ b/mercurial/ui.py	Tue Mar 18 22:12:34 2008 +0100
@@ -31,6 +31,7 @@
                  parentui=None):
         self.overlay = None
         self.buffers = []
+        self.pager = None
         if parentui is None:
             # this is the parent of all ui children
             self.parentui = None
@@ -64,6 +65,15 @@
     def __getattr__(self, key):
         return getattr(self.parentui, key)
 
+    def __del__(self):
+        if self.pager:
+            try:
+                self.pager.close()
+            except IOException:
+                # we might get into an broken pipe if the users quit
+                # the pager before we finished io
+                pass
+
     def isatty(self):
         if ui._isatty is None:
             ui._isatty = sys.stdin.isatty()
@@ -370,9 +380,14 @@
         return "".join(self.buffers.pop())
 
     def write(self, *args):
+        """Write to a pager if available, otherwise to stdout"""
         if self.buffers:
             self.buffers[-1].extend([str(a) for a in args])
         else:
+            if self.getpager() and not self.pager:
+                self.pager = os.popen(self.getpager(), "w")
+                sys.stderr = self.pager
+                sys.stdout = self.pager
             for a in args:
                 sys.stdout.write(str(a))
 
@@ -478,3 +493,8 @@
                 os.environ.get("VISUAL") or
                 os.environ.get("EDITOR", "vi"))
 
+    def getpager(self):
+        '''return a pager'''
+        if self.configbool("ui", "usepager", False):
+            return (self.config("ui", "pager")
+                    or os.environ.get("PAGER"))