source: rtems-source-builder/source-builder/sb/log.py @ f88fcf3

4.11
Last change on this file since f88fcf3 was f88fcf3, checked in by Chris Johns <chrisj@…>, on Mar 7, 2016 at 12:56:02 AM

sb: Update code base to support Python3 and Python2.

Fix Windows support to allow MSYS2 Python to be used.

Updates #2619.

  • Property mode set to 100755
File size: 6.1 KB
Line 
1#
2# RTEMS Tools Project (http://www.rtems.org/)
3# Copyright 2010-2012 Chris Johns (chrisj@rtems.org)
4# All rights reserved.
5#
6# This file is part of the RTEMS Tools package in 'rtems-testing'.
7#
8# Permission to use, copy, modify, and/or distribute this software for any
9# purpose with or without fee is hereby granted, provided that the above
10# copyright notice and this permission notice appear in all copies.
11#
12# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
20#
21# Log output to stdout and/or a file.
22#
23
24from __future__ import print_function
25
26import os
27import sys
28
29import error
30
31#
32# A global log.
33#
34default = None
35
36#
37# Global parameters.
38#
39tracing = False
40quiet = False
41
42def set_default_once(log):
43    if default is None:
44        default = log
45
46def _output(text = os.linesep, log = None):
47    """Output the text to a log if provided else send it to stdout."""
48    if text is None:
49        text = os.linesep
50    if type(text) is list:
51        _text = ''
52        for l in text:
53            _text += l + os.linesep
54        text = _text
55    if log:
56        log.output(text)
57    elif default is not None:
58        default.output(text)
59    else:
60        for l in text.replace(chr(13), '').splitlines():
61            print(l)
62        sys.stdout.flush()
63
64def stdout_raw(text = os.linesep):
65    print(text, end=' ')
66    sys.stdout.flush()
67
68def stderr(text = os.linesep, log = None):
69    for l in text.replace(chr(13), '').splitlines():
70        print(l, file = sys.stderr)
71        sys.stderr.flush()
72
73def output(text = os.linesep, log = None):
74    if not quiet:
75        _output(text, log)
76
77def notice(text = os.linesep, log = None):
78    if not quiet and default is not None and not default.has_stdout():
79        for l in text.replace(chr(13), '').splitlines():
80            print(l)
81        sys.stdout.flush()
82    _output(text, log)
83
84def trace(text = os.linesep, log = None):
85    if tracing:
86        _output(text, log)
87
88def warning(text = os.linesep, log = None):
89    for l in text.replace(chr(13), '').splitlines():
90        notice('warning: %s' % (l), log)
91
92def flush(log = None):
93    if log:
94        log.flush()
95    elif default is not None:
96        default.flush()
97
98def tail(log = None):
99    if log is not None:
100        return log.tail
101    if default is not None:
102        return default.tail
103    return 'No log output'
104
105class log:
106    """Log output to stdout or a file."""
107    def __init__(self, streams = None, tail_size = 200):
108        self.tail = []
109        self.tail_size = tail_size
110        self.fhs = [None, None]
111        if streams:
112            for s in streams:
113                if s == 'stdout':
114                    self.fhs[0] = sys.stdout
115                elif s == 'stderr':
116                    self.fhs[1] = sys.stderr
117                else:
118                    try:
119                        self.fhs.append(open(s, 'w'))
120                    except IOError as ioe:
121                         raise error.general("creating log file '" + s + \
122                                             "': " + str(ioe))
123
124    def __del__(self):
125        for f in range(2, len(self.fhs)):
126            self.fhs[f].close()
127
128    def __str__(self):
129        t = ''
130        for tl in self.tail:
131            t += tl + os.linesep
132        return t[:-len(os.linesep)]
133
134    def _tail(self, text):
135        if type(text) is not list:
136            text = text.splitlines()
137        self.tail += text
138        if len(self.tail) > self.tail_size:
139            self.tail = self.tail[-self.tail_size:]
140
141    def has_stdout(self):
142        return self.fhs[0] is not None
143
144    def has_stderr(self):
145        return self.fhs[1] is not None
146
147    def output(self, text):
148        """Output the text message to all the logs."""
149        # Reformat the text to have local line types.
150        text = text.replace(chr(13), '').splitlines()
151        self._tail(text)
152        out = ''
153        for l in text:
154            out += l + os.linesep
155        for f in range(0, len(self.fhs)):
156            if self.fhs[f] is not None:
157                self.fhs[f].write(out)
158        self.flush()
159
160    def flush(self):
161        """Flush the output."""
162        for f in range(0, len(self.fhs)):
163            if self.fhs[f] is not None:
164                self.fhs[f].flush()
165
166if __name__ == "__main__":
167    l = log(['stdout', 'log.txt'], tail_size = 20)
168    for i in range(0, 10):
169        l.output('log: hello world: %d\n' % (i))
170    l.output('log: hello world CRLF\r\n')
171    l.output('log: hello world NONE')
172    l.flush()
173    print('=-' * 40)
174    print('tail: %d' % (len(l.tail)))
175    print(l)
176    print('=-' * 40)
177    for i in range(0, 10):
178        l.output('log: hello world 2: %d\n' % (i))
179    l.flush()
180    print('=-' * 40)
181    print('tail: %d' % (len(l.tail)))
182    print(l)
183    print('=-' * 40)
184    for i in [0, 1]:
185        quiet = False
186        tracing = False
187        print('- quiet:%s - trace:%s %s' % (str(quiet), str(tracing), '-' * 30))
188        trace('trace with quiet and trace off')
189        notice('notice with quiet and trace off')
190        quiet = True
191        tracing = False
192        print('- quiet:%s - trace:%s %s' % (str(quiet), str(tracing), '-' * 30))
193        trace('trace with quiet on and trace off')
194        notice('notice with quiet on and trace off')
195        quiet = False
196        tracing = True
197        print('- quiet:%s - trace:%s %s' % (str(quiet), str(tracing), '-' * 30))
198        trace('trace with quiet off and trace on')
199        notice('notice with quiet off and trace on')
200        quiet = True
201        tracing = True
202        print('- quiet:%s - trace:%s %s' % (str(quiet), str(tracing), '-' * 30))
203        trace('trace with quiet on and trace on')
204        notice('notice with quiet on and trace on')
205        default = l
206    print('=-' * 40)
207    print('tail: %d' % (len(l.tail)))
208    print(l)
209    print('=-' * 40)
210    del l
Note: See TracBrowser for help on using the repository browser.