# Copyright (c) MetaCommunications, Inc. 2003-2004 # # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or copy at # http://www.boost.org/LICENSE_1_0.txt) import shutil import os.path import os import string import time import sys import utils import runner report_types = [ 'us', 'ds', 'ud', 'dd', 'l', 'p', 'x', 'i', 'n', 'ddr', 'dsr' ] if __name__ == '__main__': run_dir = os.path.abspath( os.path.dirname( sys.argv[ 0 ] ) ) else: run_dir = os.path.abspath( os.path.dirname( sys.modules[ __name__ ].__file__ ) ) def map_path( path ): return os.path.join( run_dir, path ) def xsl_path( xsl_file_name, v2 = 0 ): if v2: return map_path( os.path.join( 'xsl/v2', xsl_file_name ) ) else: return map_path( os.path.join( 'xsl', xsl_file_name ) ) def make_result_pages( test_results_file , expected_results_file , failures_markup_file , tag , run_date , comment_file , results_dir , result_prefix , reports , v2 ): utils.log( 'Producing the reports...' ) __log__ = 1 output_dir = os.path.join( results_dir, result_prefix ) utils.makedirs( output_dir ) if comment_file != '': comment_file = os.path.abspath( comment_file ) if expected_results_file != '': expected_results_file = os.path.abspath( expected_results_file ) else: expected_results_file = os.path.abspath( map_path( 'empty_expected_results.xml' ) ) extended_test_results = os.path.join( output_dir, 'extended_test_results.xml' ) if 'x' in reports: utils.log( ' Merging with expected results...' ) utils.libxslt( utils.log , test_results_file , xsl_path( 'add_expected_results.xsl', v2 ) , extended_test_results , { 'expected_results_file': expected_results_file , 'failures_markup_file' : failures_markup_file , 'source' : tag } ) links = os.path.join( output_dir, 'links.html' ) utils.makedirs( os.path.join( output_dir, 'output' ) ) for mode in ( 'developer', 'user' ): utils.makedirs( os.path.join( output_dir, mode , 'output' ) ) if 'l' in reports: utils.log( ' Making test output files...' ) utils.libxslt( utils.log , extended_test_results , xsl_path( 'links_page.xsl', v2 ) , links , { 'source': tag , 'run_date': run_date , 'comment_file': comment_file , 'explicit_markup_file': failures_markup_file } ) issues = os.path.join( output_dir, 'developer', 'issues.html' ) if 'i' in reports: utils.log( ' Making issues list...' ) utils.libxslt( utils.log , extended_test_results , xsl_path( 'issues_page.xsl', v2 ) , issues , { 'source': tag , 'run_date': run_date , 'comment_file': comment_file , 'explicit_markup_file': failures_markup_file } ) for mode in ( 'developer', 'user' ): if mode[0] + 'd' in reports: utils.log( ' Making detailed %s report...' % mode ) utils.libxslt( utils.log , extended_test_results , xsl_path( 'result_page.xsl', v2 ) , os.path.join( output_dir, mode, 'index.html' ) , { 'links_file': 'links.html' , 'mode': mode , 'source': tag , 'run_date': run_date , 'comment_file': comment_file , 'expected_results_file': expected_results_file , 'explicit_markup_file' : failures_markup_file } ) for mode in ( 'developer', 'user' ): if mode[0] + 's' in reports: utils.log( ' Making summary %s report...' % mode ) utils.libxslt( utils.log , extended_test_results , xsl_path( 'summary_page.xsl', v2 ) , os.path.join( output_dir, mode, 'summary.html' ) , { 'mode' : mode , 'source': tag , 'run_date': run_date , 'comment_file': comment_file , 'explicit_markup_file' : failures_markup_file } ) if v2 and "ddr" in reports: utils.log( ' Making detailed %s release report...' % mode ) utils.libxslt( utils.log , extended_test_results , xsl_path( 'result_page.xsl', v2 ) , os.path.join( output_dir, "developer", 'index_release.html' ) , { 'links_file': 'links.html' , 'mode': "developer" , 'source': tag , 'run_date': run_date , 'comment_file': comment_file , 'expected_results_file': expected_results_file , 'explicit_markup_file' : failures_markup_file , 'release': "yes" } ) if v2 and "dsr" in reports: utils.log( ' Making summary %s release report...' % mode ) utils.libxslt( utils.log , extended_test_results , xsl_path( 'summary_page.xsl', v2 ) , os.path.join( output_dir, "developer", 'summary_release.html' ) , { 'mode' : "developer" , 'source': tag , 'run_date': run_date , 'comment_file': comment_file , 'explicit_markup_file' : failures_markup_file , 'release': 'yes' } ) if 'e' in reports: utils.log( ' Generating expected_results ...' ) utils.libxslt( utils.log , extended_test_results , xsl_path( 'produce_expected_results.xsl', v2 ) , os.path.join( output_dir, 'expected_results.xml' ) ) if v2 and 'n' in reports: utils.log( ' Making runner comment files...' ) utils.libxslt( utils.log , extended_test_results , xsl_path( 'runners.xsl', v2 ) , os.path.join( output_dir, 'runners.html' ) ) shutil.copyfile( xsl_path( 'html/master.css', v2 ) , os.path.join( output_dir, 'master.css' ) ) def build_xsl_reports( locate_root_dir , tag , expected_results_file , failures_markup_file , comment_file , results_dir , result_file_prefix , dont_collect_logs = 0 , reports = report_types , v2 = 0 , user = None , upload = False ): ( run_date ) = time.strftime( '%Y-%m-%dT%H:%M:%SZ', time.gmtime() ) test_results_file = os.path.join( results_dir, 'test_results.xml' ) bin_boost_dir = os.path.join( locate_root_dir, 'bin', 'boost' ) if v2: import merger merger.merge_logs( tag , user , results_dir , test_results_file , dont_collect_logs ) else: utils.log( ' dont_collect_logs: %s' % dont_collect_logs ) if not dont_collect_logs: f = open( test_results_file, 'w+' ) f.write( '\n' ) runner.collect_test_logs( [ bin_boost_dir ], f ) f.write( '\n' ) f.close() make_result_pages( test_results_file , expected_results_file , failures_markup_file , tag , run_date , comment_file , results_dir , result_file_prefix , reports , v2 ) if v2 and upload: upload_dir = 'regression-logs/' utils.log( 'Uploading v2 results into "%s" [connecting as %s]...' % ( upload_dir, user ) ) archive_name = '%s.tar.gz' % result_file_prefix utils.tar( os.path.join( results_dir, result_file_prefix ) , archive_name ) utils.sourceforge.upload( os.path.join( results_dir, archive_name ), upload_dir, user ) utils.sourceforge.untar( os.path.join( upload_dir, archive_name ), user, background = True ) def accept_args( args ): args_spec = [ 'locate-root=' , 'tag=' , 'expected-results=' , 'failures-markup=' , 'comment=' , 'results-dir=' , 'results-prefix=' , 'dont-collect-logs' , 'reports=' , 'v2' , 'user=' , 'upload' , 'help' ] options = { '--comment': '' , '--expected-results': '' , '--failures-markup': '' , '--reports': string.join( report_types, ',' ) , '--tag': None , '--user': None , 'upload': False } utils.accept_args( args_spec, args, options, usage ) if not options.has_key( '--results-dir' ): options[ '--results-dir' ] = options[ '--locate-root' ] if not options.has_key( '--results-prefix' ): if options.has_key( '--v2' ): options[ '--results-prefix' ] = 'all' else: options[ '--results-prefix' ] = '' return ( options[ '--locate-root' ] , options[ '--tag' ] , options[ '--expected-results' ] , options[ '--failures-markup' ] , options[ '--comment' ] , options[ '--results-dir' ] , options[ '--results-prefix' ] , options.has_key( '--dont-collect-logs' ) , options[ '--reports' ].split( ',' ) , options.has_key( '--v2' ) , options[ '--user' ] , options.has_key( '--upload' ) ) def usage(): print 'Usage: %s [options]' % os.path.basename( sys.argv[0] ) print ''' \t--locate-root the same as --locate-root in compiler_status \t--tag the tag for the results (i.e. 'CVS-HEAD') \t--expected-results the file with the results to be compared with \t the current run \t--failures-markup the file with the failures markup \t--comment an html comment file (will be inserted in the reports) \t--results-dir the directory containing -links.html, -fail.html \t files produced by compiler_status (by default the \t same as specified in --locate-root) \t--results-prefix the prefix of -links.html, -fail.html \t files produced by compiler_status \t--v2 v2 reports (combine multiple runners results into a \t single set of reports) The following options are valid only for v2 reports: \t--user SourceForge user name for a shell account \t--upload upload v2 reports to SourceForge The following options are useful in debugging: \t--dont-collect-logs dont collect the test logs \t--reports produce only the specified reports \t us - user summary \t ds - developer summary \t ud - user detailed \t dd - developer detailed \t l - links \t p - patches \t x - extended results file \t i - issues ''' def main(): build_xsl_reports( *accept_args( sys.argv[ 1 : ] ) ) if __name__ == '__main__': main()