From cf31fe9b4fb650b27e19f5d7ee7297e383660caf Mon Sep 17 00:00:00 2001 From: The Android Open Source Project Date: Tue, 21 Oct 2008 07:00:00 -0700 Subject: Initial Contribution --- pager.py | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 pager.py (limited to 'pager.py') diff --git a/pager.py b/pager.py new file mode 100755 index 00000000..320131cd --- /dev/null +++ b/pager.py @@ -0,0 +1,84 @@ +# +# Copyright (C) 2008 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os +import select +import sys + +active = False + +def RunPager(globalConfig): + global active + + if not os.isatty(0): + return + pager = _SelectPager(globalConfig) + if pager == '' or pager == 'cat': + return + + # This process turns into the pager; a child it forks will + # do the real processing and output back to the pager. This + # is necessary to keep the pager in control of the tty. + # + try: + r, w = os.pipe() + pid = os.fork() + if not pid: + os.dup2(w, 1) + os.dup2(w, 2) + os.close(r) + os.close(w) + active = True + return + + os.dup2(r, 0) + os.close(r) + os.close(w) + + _BecomePager(pager) + except Exception: + print >>sys.stderr, "fatal: cannot start pager '%s'" % pager + os.exit(255) + +def _SelectPager(globalConfig): + try: + return os.environ['GIT_PAGER'] + except KeyError: + pass + + pager = globalConfig.GetString('core.pager') + if pager: + return pager + + try: + return os.environ['PAGER'] + except KeyError: + pass + + return 'less' + +def _BecomePager(pager): + # Delaying execution of the pager until we have output + # ready works around a long-standing bug in popularly + # available versions of 'less', a better 'more'. + # + a, b, c = select.select([0], [], [0]) + + os.environ['LESS'] = 'FRSX' + + try: + os.execvp(pager, [pager]) + except OSError, e: + os.execv('/bin/sh', ['sh', '-c', pager]) -- cgit v1.2.3-54-g00ecf