diff options
author | Peter Kjellerstedt <peter.kjellerstedt@axis.com> | 2013-11-15 18:08:50 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2013-11-18 12:40:46 +0000 |
commit | 6f1568e54a7808b2ab568618fc5bb244249579f1 (patch) | |
tree | bb16107b7fd8a3be426b0841da058c620374b4f1 /scripts/pybootchartgui/pybootchartgui/main.py.in | |
parent | 3cfce710faf82024c5d8973fe83a125d0375309b (diff) | |
download | openembedded-core-contrib-6f1568e54a7808b2ab568618fc5bb244249579f1.tar.gz |
pybootchartgui: Import pybootchartgui 0.14.5
This update the pybootchartgui code to the latest release from its new
location at "https://github.com/mmeeks/bootchart". This only imports
the relevant parts, and not all of bootchart2.
Signed-off-by: Peter Kjellerstedt <peter.kjellerstedt@axis.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'scripts/pybootchartgui/pybootchartgui/main.py.in')
-rw-r--r-- | scripts/pybootchartgui/pybootchartgui/main.py.in | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/scripts/pybootchartgui/pybootchartgui/main.py.in b/scripts/pybootchartgui/pybootchartgui/main.py.in new file mode 100644 index 0000000000..265cb18383 --- /dev/null +++ b/scripts/pybootchartgui/pybootchartgui/main.py.in @@ -0,0 +1,171 @@ +# +# *********************************************************************** +# Warning: This file is auto-generated from main.py.in - edit it there. +# *********************************************************************** +# +# pybootchartgui is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# pybootchartgui 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 pybootchartgui. If not, see <http://www.gnu.org/licenses/>. + +from __future__ import print_function + +import sys +import os +import optparse + +from . import parsing +from . import batch + +def _mk_options_parser(): + """Make an options parser.""" + usage = "%prog [options] /path/to/tmp/buildstats/<recipe-machine>/<BUILDNAME>/" + version = "%prog v1.0.0" + parser = optparse.OptionParser(usage, version=version) + parser.add_option("-i", "--interactive", action="store_true", dest="interactive", default=False, + help="start in active mode") + parser.add_option("-f", "--format", dest="format", default="png", choices=["png", "svg", "pdf"], + help="image format (png, svg, pdf); default format png") + parser.add_option("-o", "--output", dest="output", metavar="PATH", default=None, + help="output path (file or directory) where charts are stored") + parser.add_option("-s", "--split", dest="num", type=int, default=1, + help="split the output chart into <NUM> charts, only works with \"-o PATH\"") + parser.add_option("-m", "--mintime", dest="mintime", type=int, default=8, + help="only tasks longer than this time will be displayed") + parser.add_option("-n", "--no-prune", action="store_false", dest="prune", default=True, + help="do not prune the process tree") + parser.add_option("-q", "--quiet", action="store_true", dest="quiet", default=False, + help="suppress informational messages") + parser.add_option("-t", "--boot-time", action="store_true", dest="boottime", default=False, + help="only display the boot time of the boot in text format (stdout)") + parser.add_option("--very-quiet", action="store_true", dest="veryquiet", default=False, + help="suppress all messages except errors") + parser.add_option("--verbose", action="store_true", dest="verbose", default=False, + help="print all messages") + parser.add_option("--profile", action="store_true", dest="profile", default=False, + help="profile rendering of chart (only useful when in batch mode indicated by -f)") + parser.add_option("--show-pid", action="store_true", dest="show_pid", default=False, + help="show process ids in the bootchart as 'processname [pid]'") + parser.add_option("--show-all", action="store_true", dest="show_all", default=False, + help="show all process information in the bootchart as '/process/path/exe [pid] [args]'") + parser.add_option("--crop-after", dest="crop_after", metavar="PROCESS", default=None, + help="crop chart when idle after PROCESS is started") + parser.add_option("--annotate", action="append", dest="annotate", metavar="PROCESS", default=None, + help="annotate position where PROCESS is started; can be specified multiple times. " + + "To create a single annotation when any one of a set of processes is started, use commas to separate the names") + parser.add_option("--annotate-file", dest="annotate_file", metavar="FILENAME", default=None, + help="filename to write annotation points to") + return parser + +class Writer: + def __init__(self, write, options): + self.write = write + self.options = options + + def error(self, msg): + self.write(msg) + + def warn(self, msg): + if not self.options.quiet: + self.write(msg) + + def info(self, msg): + if self.options.verbose: + self.write(msg) + + def status(self, msg): + if not self.options.quiet: + self.write(msg) + +def _mk_writer(options): + def write(s): + print(s) + return Writer(write, options) + +def _get_filename(path): + """Construct a usable filename for outputs""" + dname = "." + fname = "bootchart" + if path != None: + if os.path.isdir(path): + dname = path + else: + fname = path + return os.path.join(dname, fname) + +def main(argv=None): + try: + if argv is None: + argv = sys.argv[1:] + + parser = _mk_options_parser() + options, args = parser.parse_args(argv) + writer = _mk_writer(options) + + if len(args) == 0: + print("No path given, trying /var/log/bootchart.tgz") + args = [ "/var/log/bootchart.tgz" ] + + res = parsing.Trace(writer, args, options) + + if options.interactive or options.output == None: + from . import gui + gui.show(res, options) + elif options.boottime: + import math + proc_tree = res.proc_tree + if proc_tree.idle: + duration = proc_tree.idle + else: + duration = proc_tree.duration + dur = duration / 100.0 + print('%02d:%05.2f' % (math.floor(dur/60), dur - 60 * math.floor(dur/60))) + else: + if options.annotate_file: + f = open (options.annotate_file, "w") + try: + for time in res[4]: + if time is not None: + # output as ms + print(time * 10, file=f) + else: + print(file=f) + finally: + f.close() + filename = _get_filename(options.output) + res_list = parsing.split_res(res, options.num) + n = 1 + for r in res_list: + if len(res_list) == 1: + f = filename + "." + options.format + else: + f = filename + "_" + str(n) + "." + options.format + n = n + 1 + def render(): + batch.render(writer, r, options, f) + if options.profile: + import cProfile + import pstats + profile = '%s.prof' % os.path.splitext(filename)[0] + cProfile.runctx('render()', globals(), locals(), profile) + p = pstats.Stats(profile) + p.strip_dirs().sort_stats('time').print_stats(20) + else: + render() + + return 0 + except parsing.ParseError as ex: + print(("Parse error: %s" % ex)) + return 2 + + +if __name__ == '__main__': + sys.exit(main()) |