diff options
Diffstat (limited to 'tools/regression/xsl_reports/boostbook_report.py')
-rw-r--r-- | tools/regression/xsl_reports/boostbook_report.py | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/tools/regression/xsl_reports/boostbook_report.py b/tools/regression/xsl_reports/boostbook_report.py new file mode 100644 index 0000000000..6c91a939dd --- /dev/null +++ b/tools/regression/xsl_reports/boostbook_report.py @@ -0,0 +1,179 @@ +import ftplib +import optparse +import os +import time +import urlparse +import utils +import shutil +import sys +import zipfile +import xml.sax.saxutils + + +import utils.libxslt + +def get_date( words ): + date = words[ 5: -1 ] + t = time.localtime() + + month_names = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ] + + year = time.localtime()[0] # If year is not secified is it the current year + month = month_names.index( date[0] ) + 1 + day = int( date[1] ) + hours = 0 + minutes = 0 + + if date[2].find( ":" ) != -1: + ( hours, minutes ) = [ int(x) for x in date[2].split( ":" ) ] + else: + # there is no way to get seconds for not current year dates + year = int( date[2] ) + + return ( year, month, day, hours, minutes, 0, 0, 0, 0 ) + +#def check_for_new_upload( target_dir, boostbook_info ): + +def accept_args( args ): + parser = optparse.OptionParser() + parser.add_option( '-t', '--tag', dest='tag', help="the tag for the results (i.e. 'RC_1_34_0')" ) + parser.add_option( '-d', '--destination', dest='destination', help='destination directory' ) + + if len(args) == 0: + parser.print_help() + sys.exit( 1 ) + + (options, args) = parser.parse_args() + if not options.destination: + print '-d is required' + parser.print_help() + sys.exit( 1 ) + return options + +def unzip( archive_path, result_dir ): + utils.log( 'Unpacking %s into %s' % ( archive_path, result_dir ) ) + z = zipfile.ZipFile( archive_path, 'r', zipfile.ZIP_DEFLATED ) + for f in z.infolist(): + dir = os.path.join( result_dir, os.path.dirname( f.filename ) ) + if not os.path.exists( dir ): + os.makedirs( dir ) + result = open( os.path.join( result_dir, f.filename ), 'wb' ) + result.write( z.read( f.filename ) ) + result.close() + + z.close() + +def boostbook_report( options ): + site = 'fx.meta-comm.com' + site_path = '/boost-regression/%s' % options.tag + + utils.log( 'Opening %s ...' % site ) + f = ftplib.FTP( site ) + f.login() + utils.log( ' cd %s ...' % site_path ) + f.cwd( site_path ) + + utils.log( ' dir' ) + lines = [] + f.dir( lambda x: lines.append( x ) ) + word_lines = [ x.split( None, 8 ) for x in lines ] + boostbook_info = [ ( l[-1], get_date( l ) ) for l in word_lines if l[-1] == "BoostBook.zip" ] + if len( boostbook_info ) > 0: + boostbook_info = boostbook_info[0] + utils.log( 'BoostBook found! (%s)' % ( boostbook_info, ) ) + local_copy = os.path.join( options.destination,'BoostBook-%s.zip' % options.tag ) + + if 1: + if os.path.exists( local_copy ): + utils.log( 'Local copy exists. Checking if it is older than uploaded one...' ) + uploaded_mtime = time.mktime( boostbook_info[1] ) + local_mtime = os.path.getmtime( local_copy ) + utils.log( ' uploaded: %s %s, local: %s %s' % + ( uploaded_mtime + , boostbook_info[1] + , local_mtime + , time.localtime( local_mtime )) ) + modtime = time.localtime( os.path.getmtime( local_copy ) ) + if uploaded_mtime <= local_mtime: + utils.log( 'Local copy is newer: exiting' ) + sys.exit() + + if 1: + temp = os.path.join( options.destination,'BoostBook.zip' ) + result = open( temp, 'wb' ) + f.retrbinary( 'RETR %s' % boostbook_info[0], result.write ) + result.close() + + if os.path.exists( local_copy ): + os.unlink( local_copy ) + os.rename( temp, local_copy ) + m = time.mktime( boostbook_info[1] ) + os.utime( local_copy, ( m, m ) ) + + + docs_name = os.path.splitext( os.path.basename( local_copy ) )[0] + if 1: + unpacked_docs_dir = os.path.join( options.destination, docs_name ) + utils.log( 'Dir %s ' % unpacked_docs_dir ) + if os.path.exists( unpacked_docs_dir ): + utils.log( 'Cleaning up...' ) + shutil.rmtree( unpacked_docs_dir ) + os.makedirs( unpacked_docs_dir ) + + unzip( local_copy, unpacked_docs_dir ) + + utils.system( [ 'cd %s' % unpacked_docs_dir + , 'tar -c -f ../%s.tar.gz -z --exclude=tarball *' % docs_name ] ) + + process_boostbook_build_log( os.path.join( unpacked_docs_dir, 'boostbook.log' ), read_timestamp( unpacked_docs_dir ) ) + utils.libxslt( log + , os.path.abspath( os.path.join( unpacked_docs_dir, 'boostbook.log.xml' ) ) + , os.path.abspath( os.path.join( os.path.dirname( __file__ ), 'xsl', 'v2', 'boostbook_log.xsl' ) ) + , os.path.abspath( os.path.join( unpacked_docs_dir, 'boostbook.log.html' ) ) ) + + +def log( msg ): + print msg + +def process_boostbook_build_log( path, timestamp ): + f = open( path + '.xml', 'w' ) + g = xml.sax.saxutils.XMLGenerator( f ) + lines = open( path ).read().splitlines() + output_lines = [] + result = 'success' + for line in lines: + type = 'output' + if line.startswith( '...failed' ): + type = 'failure' + result='failure' + + if line.startswith( 'runtime error:' ): + type = 'failure' + + if line.startswith( '...skipped' ): + type = 'skipped' + output_lines.append( ( type, line ) ) + + g.startDocument() + g.startElement( 'build', { 'result': result, 'timestamp': timestamp } ) + for line in output_lines: + g.startElement( 'line', { 'type': line[0]} ) + g.characters( line[1] ) + g.endElement( 'line' ) + g.endElement( 'build' ) + g.endDocument() + + +def read_timestamp( docs_directory ): + f = open( os.path.join( docs_directory, 'timestamp' ) ) + try: + return f.readline() + finally: + f.close() + +def main(): + options = accept_args( sys.argv[1:]) + boostbook_report( options ) + +if __name__ == '__main__': + main()
\ No newline at end of file |