103 lines
2.6 KiB
Python
103 lines
2.6 KiB
Python
# vim: set fileencoding=utf-8 sw=4 sts=4 et :
|
|
|
|
#
|
|
# Copyright (c) 2007 Piotr JaroszyĆski
|
|
#
|
|
# This file is part of the Paludis package manager. Paludis is free software;
|
|
# you can redistribute it and/or modify it under the terms of the GNU General
|
|
# Public License version 2, as published by the Free Software Foundation.
|
|
#
|
|
# Paludis is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
|
|
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
|
|
# details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along with
|
|
# this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
|
# Place, Suite 330, Boston, MA 02111-1307 USA
|
|
#
|
|
|
|
import sys
|
|
|
|
stdout_cache = []
|
|
stderr_cache = []
|
|
|
|
class CommonOutput:
|
|
def __init__(self, out):
|
|
self.out = out
|
|
|
|
def writelines(self, seq):
|
|
for s in seq:
|
|
self.write(s)
|
|
|
|
def closed(self):
|
|
self.out.closed()
|
|
|
|
def close(self):
|
|
self.out.close()
|
|
|
|
def isatty(self):
|
|
return self.out.isatty()
|
|
|
|
def mode(self):
|
|
return self.out.mode()
|
|
|
|
def name(self):
|
|
return self.out.name()
|
|
|
|
def encoding(self):
|
|
return self.out.encoding()
|
|
|
|
class PrefixOutput(CommonOutput):
|
|
def __init__(self, out, prefix):
|
|
CommonOutput.__init__(self, out)
|
|
|
|
self.prefix = prefix
|
|
self.need_prefix = True
|
|
|
|
def write(self, str):
|
|
if self.need_prefix:
|
|
self.out.write(self.prefix)
|
|
|
|
if str.endswith("\n"):
|
|
self.need_prefix = True
|
|
newlines = -1
|
|
else:
|
|
self.need_prefix = False
|
|
newlines = 0
|
|
|
|
newlines += str.count("\n")
|
|
self.out.write(str.replace("\n", "\n" + self.prefix, newlines))
|
|
|
|
def save(what):
|
|
if what == "stderr" or what == "both":
|
|
stderr_cache.append(sys.stderr)
|
|
elif what == "stdout" or what == "both":
|
|
stdout_cache.append(sys.stdout)
|
|
|
|
def restore(what):
|
|
if what == "stderr" or what == "both":
|
|
if len(stderr_cache):
|
|
sys.stderr = stderr_cache.pop()
|
|
else:
|
|
sys.stderr = sys.__stderr__
|
|
|
|
elif what == "stdout" or what == "both":
|
|
if len(stdout_cache):
|
|
sys.stdout = stdout_cache.pop()
|
|
else:
|
|
sys.stdout = sys.__stdout__
|
|
|
|
def set_prefix(prefix):
|
|
save("both")
|
|
if prefix:
|
|
sys.stdout = PrefixOutput(sys.__stdout__, prefix)
|
|
sys.stderr = PrefixOutput(sys.__stderr__, prefix)
|
|
else:
|
|
sys.stdout = sys.__stdout__
|
|
sys.stderr = sys.__stderr__
|
|
|
|
def restore_prefix():
|
|
restore("both")
|
|
|