#!/usr/bin/env python # coding: utf-8 # Copyright (C) 1994-2018 Altair Engineering, Inc. # For more information, contact Altair at www.altair.com. # # This file is part of the PBS Professional ("PBS Pro") software. # # Open Source License Information: # # PBS Pro is free software. You can redistribute it and/or modify it under the # terms of the GNU Affero General Public License as published by the Free # Software Foundation, either version 3 of the License, or (at your option) any # later version. # # PBS Pro 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 Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # # Commercial License Information: # # For a copy of the commercial license terms and conditions, # go to: (http://www.pbspro.com/UserArea/agreement.html) # or contact the Altair Legal Department. # # Altair’s dual-license business model allows companies, individuals, and # organizations to create proprietary derivative works of PBS Pro and # distribute them - whether embedded or bundled with other software - # under a commercial license agreement. # # Use of Altair’s trademarks, including but not limited to "PBS™", # "PBS Professional®", and "PBS Pro™" and Altair’s logos is subject to Altair's # trademark licensing policies. import os import sys import getopt import logging import logging.config import errno import ptl from ptl.utils.pbs_cliutils import CliUtils from ptl.utils.pbs_covutils import LcovUtils from ptl.lib.pbs_testlib import PtlConfig # trap SIGINT and SIGPIPE def trap_exceptions(etype, value, tb): sys.excepthook = sys.__excepthook__ if issubclass(etype, IOError) and value.errno == errno.EPIPE: pass else: sys.__excepthook__(etype, value, tb) sys.excepthook = trap_exceptions def usage(): msg = [] msg += ['Usage: ' + os.path.basename(sys.argv[0]) + ' [OPTION]\n\n'] msg += [' code coverage tools\n\n'] msg += ['-c: capture coverage\n'] msg += ['-d : path to directory that contains coverage data\n'] msg += ['-i: initialize coverage\n'] msg += ['-o : path to output directory\n'] msg += ['-m : merge comma-separated coverage files\n'] msg += ['-r : path to file to remove coverage patterns from\n'] msg += ['-z: reset coverage counters\n'] msg += ['--exclude=: comma-separated pattern of files to exclude\n'] msg += ['--summarize: summarize coverage analysis\n'] msg += ['--html: Generate HTML from coverage analysis\n'] msg += ['--no-source: don\'t include PBS source in coverage analysis'] msg += [' (Must be used with --html)\n'] msg += ['--baseurl=: use as baseurl in html report'] msg += [' (Must be used with --html)\n'] msg += [' Default source will be in coverage analysis\n'] msg += ['--version: print version number and exit\n'] print "".join(msg) if __name__ == '__main__': if len(sys.argv) < 2: usage() sys.exit(1) data_dir = None capture = None initialize = None merge = None reset = None remove = None out = None html_nosrc = False html = False html_baseurl = None exclude = ['"*work/gSOAP/*"', '"*/pbs/doc/*"', 'lex.yy.c', 'pbs_ifl_wrap.c', 'usr/include/*', 'unsupported/*'] summarize = None lvl = logging.INFO logconf = None lopts = ["version", "exclude=", "summarize", 'no-source', 'html'] lopts += ['baseurl='] try: opts, args = getopt.getopt(sys.argv[1:], "ciszd:mo:l:rh", lopts) except: usage() sys.exit(1) for o, val in opts: if o == '-d': data_dir = CliUtils.expand_abs_path(val) elif o == '-c': capture = True elif o == '-o': out = CliUtils.expand_abs_path(val) elif o == '-i': initialize = True elif o == '-l': lvl = CliUtils.get_logging_level(val) elif o == '-m': merge = val elif o == '-l': lvl = CliUtils().get_logging_level(val) elif o == '-r': remove = CliUtils.expand_abs_path(val) elif o == '-z': reset = True elif o == '-h': usage() sys.exit(0) elif o == '--exclude': exclude = val.split(',') elif o == '--log-conf': logconf = val elif o in ('-s', '--summarize'): summarize = True elif o == '--html': html = True elif o in '--no-source': html_nosrc = False elif o in '--baseurl': html_baseurl = val elif o == '--version': print ptl.__version__ sys.exit(0) else: sys.stderr.write("Unrecognized option") usage() sys.exit(1) PtlConfig() if logconf: logging.config.fileConfig(logconf) else: logging.basicConfig(level=lvl) if html_nosrc and not html: logging.error('--no-source must be used with --html') sys.exit(1) if html_baseurl and not html: logging.error('--baseurl must be used with --html') sys.exit(1) cu = LcovUtils(cov_out=out, data_dir=data_dir, html_nosrc=html_nosrc, html_baseurl=html_baseurl) if reset: cu.zero_coverage() if initialize: cu.initialize_coverage() if capture: cu.capture_coverage() if merge is not None: for m in merge.split(','): cu.add_trace(m) cu.merge_coverage_traces(exclude=exclude) if html: cu.generate_html() if html_baseurl: cu.change_baseurl() if summarize: cu.summarize_coverage()