mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-27 07:16:20 +00:00
8f82a4f828
The repo script often uses a pager by default and will produce control characters (coloring) to standard output when using the pager, even if the output is redirected to another pipe or script. This is because the pager setup checked for the terminal presence on FD 0, and in case of redirection FD 0 is still attached to the terminal. Instead require that both FD 0 and FD 1 are connected to the terminal in order to start the pager. Bug: REPO-19, b.android.com/2004 Signed-off-by: Shawn O. Pearce <sop@google.com>
85 lines
2.0 KiB
Python
Executable File
85 lines
2.0 KiB
Python
Executable File
#
|
|
# 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) or not os.isatty(1):
|
|
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])
|