Exheredludis/python/paludis_output_wrapper.py
2007-10-23 23:33:12 +00:00

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")