| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- #
- # 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])
|