| # Copyright 2012-2013 Gentoo Foundation |
| # Distributed under the terms of the GNU General Public License v2 |
| |
| import gzip |
| import errno |
| |
| from portage import _encodings |
| from portage import _unicode_encode |
| from portage.util import writemsg_level |
| from ..SlotObject import SlotObject |
| |
| class SchedulerInterface(SlotObject): |
| |
| _event_loop_attrs = ("IO_ERR", "IO_HUP", "IO_IN", |
| "IO_NVAL", "IO_OUT", "IO_PRI", |
| "child_watch_add", "idle_add", "io_add_watch", |
| "iteration", "source_remove", "timeout_add") |
| |
| __slots__ = _event_loop_attrs + ("_event_loop", "_is_background") |
| |
| def __init__(self, event_loop, is_background=None, **kwargs): |
| SlotObject.__init__(self, **kwargs) |
| self._event_loop = event_loop |
| if is_background is None: |
| is_background = self._return_false |
| self._is_background = is_background |
| for k in self._event_loop_attrs: |
| setattr(self, k, getattr(event_loop, k)) |
| |
| @staticmethod |
| def _return_false(): |
| return False |
| |
| def output(self, msg, log_path=None, background=None, |
| level=0, noiselevel=-1): |
| """ |
| Output msg to stdout if not self._is_background(). If log_path |
| is not None then append msg to the log (appends with |
| compression if the filename extension of log_path corresponds |
| to a supported compression type). |
| """ |
| |
| global_background = self._is_background() |
| if background is None or global_background: |
| # Use the global value if the task does not have a local |
| # background value. For example, parallel-fetch tasks run |
| # in the background while other tasks concurrently run in |
| # the foreground. |
| background = global_background |
| |
| msg_shown = False |
| if not background: |
| writemsg_level(msg, level=level, noiselevel=noiselevel) |
| msg_shown = True |
| |
| if log_path is not None: |
| try: |
| f = open(_unicode_encode(log_path, |
| encoding=_encodings['fs'], errors='strict'), |
| mode='ab') |
| f_real = f |
| except IOError as e: |
| if e.errno not in (errno.ENOENT, errno.ESTALE): |
| raise |
| if not msg_shown: |
| writemsg_level(msg, level=level, noiselevel=noiselevel) |
| else: |
| |
| if log_path.endswith('.gz'): |
| # NOTE: The empty filename argument prevents us from |
| # triggering a bug in python3 which causes GzipFile |
| # to raise AttributeError if fileobj.name is bytes |
| # instead of unicode. |
| f = gzip.GzipFile(filename='', mode='ab', fileobj=f) |
| |
| f.write(_unicode_encode(msg)) |
| f.close() |
| if f_real is not f: |
| f_real.close() |