📄 regression.py
字号:
def bjam_command( toolsets ):
build_path = regression_root
if build_path[-1] == '\\': build_path += '\\'
result = '"%s" "-sBOOST_BUILD_PATH=%s" "-sBOOST_ROOT=%s"'\
% (
tool_path( bjam )
, build_path
, boost_root
)
if not toolsets is None:
result += ' "-sTOOLS=%s"' % string.join( string.split( toolsets, ',' ), ' ' )
return result
def install( toolsets, **unused ):
import_utils()
os.chdir( os.path.join( boost_root ) )
log( 'Making "%s" directory...' % regression_results )
utils.makedirs( regression_results )
install_cmd = '%s -d2 install >>%s 2>&1' % ( bjam_command( toolsets ), install_log )
log( 'Installing libraries (%s)...' % install_cmd )
utils.system( [ install_cmd ] )
def start_build_monitor( timeout ):
if sys.platform == 'win32':
build_monitor_path = tool_path( 'build_monitor.exe' )
if os.path.exists( build_monitor_path ):
utils.system( [ 'start /belownormal "" "%s" bjam.exe %d' % ( build_monitor_path, timeout*60 ) ] )
else:
log( 'Warning: Build monitor is not found at "%s"' % build_monitor_path )
def stop_build_monitor():
if sys.platform == 'win32':
build_monitor_path = tool_path( 'build_monitor.exe' )
if os.path.exists( build_monitor_path ):
utils.system( [ '"%s" build_monitor' % tool_path( 'pskill.exe' ) ] )
def run_process_jam_log():
log( 'Getting test case results out of "%s"...' % regression_log )
utils.checked_system( [
'"%s" "%s" <"%s"' % (
tool_path( process_jam_log )
, regression_results
, regression_log
)
] )
def test(
toolsets
, bjam_options
, monitored
, timeout
, args
, **unused
):
if args == []:
args = [ "test", "process" ]
import_utils()
try:
if monitored:
start_build_monitor( timeout )
cd = os.getcwd()
os.chdir( os.path.join( boost_root, 'status' ) )
log( 'Making "%s" directory...' % regression_results )
utils.makedirs( regression_results )
results_libs = os.path.join( regression_results, 'libs' )
results_status = os.path.join( regression_results, 'status' )
if "clean" in args:
rmtree( results_libs )
rmtree( results_status )
if "test" in args:
test_cmd = '%s -d2 --dump-tests %s "-sALL_LOCATE_TARGET=%s" >>"%s" 2>&1' % (
bjam_command( toolsets )
, bjam_options
, regression_results
, regression_log
)
log( 'Starting tests (%s)...' % test_cmd )
utils.system( [ test_cmd ] )
if "process" in args:
run_process_jam_log()
os.chdir( cd )
finally:
if monitored:
stop_build_monitor()
def collect_logs(
tag
, runner
, platform
, user
, comment
, incremental
, args
, **unused
):
import_utils()
if comment is None:
comment = 'comment.html'
comment_path = os.path.join( regression_root, comment )
if not os.path.exists( comment_path ):
log( 'Comment file "%s" not found; creating default comment.' % comment_path )
f = open( comment_path, 'w' )
f.write( '<p>Tests are run on %s platform.</p>' % platform_name() )
f.close()
run_type = ''
if incremental: run_type = 'incremental'
else: run_type = 'full'
source = 'tarball'
cvs_root_file = os.path.join( boost_root, 'CVS', 'root' )
if os.path.exists( cvs_root_file ):
if string.split( open( cvs_root_file ).readline(), '@' )[0] == ':pserver:anonymous':
source = 'anonymous CVS'
else:
source = 'CVS'
from runner import collect_logs
collect_logs(
regression_results
, runner
, tag
, platform
, comment_path
, timestamp_path
, user
, source
, run_type
)
def upload_logs(
tag
, runner
, user
, ftp_proxy
, debug_level
, **unused
):
import_utils()
from runner import upload_logs
retry(
upload_logs
, ( regression_results, runner, tag, user, ftp_proxy, debug_level )
)
def update_itself( tag, **unused ):
source = os.path.join( xsl_reports_dir, 'runner', os.path.basename( sys.argv[0] ) )
self = os.path.join( regression_root, os.path.basename( sys.argv[0] ) )
log( 'Updating %s from %s...' % ( self, source ) )
log( ' Checking modification dates...' )
if os.stat( self ).st_mtime > os.stat( source ).st_mtime:
log( 'Warning: The current version of script appears to be newer than the source.' )
log( ' Update skipped.' )
else:
log( ' Saving a backup copy of the current script...' )
os.chmod( self, stat.S_IWRITE ) # Win32 workaround
shutil.move( self, '%s~' % self )
log( ' Replacing %s with a newer version...' % self )
shutil.copy2( source, self )
def send_mail( smtp_login, mail, subject, msg = '', debug_level = 0 ):
import smtplib
if not smtp_login:
server_name = 'mail.%s' % mail.split( '@' )[-1]
user_name = None
password = None
else:
server_name = smtp_login.split( '@' )[-1]
( user_name, password ) = string.split( smtp_login.split( '@' )[0], ':' )
log( ' Sending mail through "%s"...' % server_name )
smtp_server = smtplib.SMTP( server_name )
smtp_server.set_debuglevel( debug_level )
if user_name:
smtp_server.login( user_name, password )
smtp_server.sendmail(
mail
, [ mail ]
, 'Subject: %s\nTo: %s\n\n%s' % ( subject, mail, msg )
)
def regression(
tag
, local
, runner
, platform
, user
, comment
, toolsets
, bjam_options
, bjam_toolset
, pjl_toolset
, incremental
, force_update
, monitored
, timeout
, mail = None
, smtp_login = None
, proxy = None
, ftp_proxy = None
, debug_level = 0
, args = []
):
try:
mail_subject = 'Boost regression for %s on %s' % ( tag, string.split(socket.gethostname(), '.')[0] )
start_time = time.localtime()
if mail:
log( 'Sending start notification to "%s"' % mail )
send_mail(
smtp_login
, mail
, '%s started at %s.' % ( mail_subject, format_time( start_time ) )
, debug_level = debug_level
)
if local is not None:
log( 'Using local file "%s"' % local )
b = os.path.basename( local )
tag = b[ 0: b.find( '.' ) ]
log( 'Tag: "%s"' % tag )
unpack_tarball( local, regression_root )
else:
if incremental or force_update:
if not incremental: cleanup( [ 'bin' ] )
update_source( user, tag, proxy, [] )
else:
cleanup( [] )
get_source( user, tag, proxy, [] )
setup( comment, toolsets, bjam_toolset, pjl_toolset, monitored, proxy, [] )
test( toolsets, bjam_options, monitored, timeout, [] )
collect_logs( tag, runner, platform, user, comment, incremental, [] )
upload_logs( tag, runner, user, ftp_proxy, debug_level )
update_itself( tag )
if mail:
log( 'Sending report to "%s"' % mail )
end_time = time.localtime()
send_mail(
smtp_login
, mail
, '%s completed successfully at %s.' % ( mail_subject, format_time( end_time ) )
, debug_level = debug_level
)
except:
if mail:
log( 'Sending report to "%s"' % mail )
traceback_ = '\n'.join( apply( traceback.format_exception, sys.exc_info() ) )
end_time = time.localtime()
send_mail(
smtp_login
, mail
, '%s failed at %s.' % ( mail_subject, format_time( end_time ) )
, traceback_
, debug_level
)
raise
def show_revision( **unused ):
modified = '$Date: 2005/07/26 11:24:23 $'
revision = '$Revision: 1.56 $'
import re
re_keyword_value = re.compile( r'^\$\w+:\s+(.*)\s+\$$' )
print '\n\tResivion: %s' % re_keyword_value.match( revision ).group( 1 )
print '\tLast modified on: %s\n' % re_keyword_value.match( modified ).group( 1 )
def accept_args( args ):
args_spec = [
'tag='
, 'local='
, 'runner='
, 'platform='
, 'user='
, 'comment='
, 'toolsets='
, 'bjam-options='
, 'bjam-toolset='
, 'pjl-toolset='
, 'timeout='
, 'mail='
, 'smtp-login='
, 'proxy='
, 'ftp-proxy='
, 'debug-level='
, 'incremental'
, 'force-update'
, 'monitored'
, 'help'
]
options = {
'--tag' : 'CVS-HEAD'
, '--local' : None
, '--platform' : platform_name()
, '--user' : None
, '--comment' : None
, '--toolsets' : None
, '--bjam-options' : ''
, '--bjam-toolset' : None
, '--pjl-toolset' : None
, '--timeout' : 5
, '--mail' : None
, '--smtp-login' : None
, '--proxy' : None
, '--debug-level' : 0
, '--ftp-proxy' : None
}
( option_pairs, other_args ) = getopt.getopt( args, '', args_spec )
map( lambda x: options.__setitem__( x[0], x[1] ), option_pairs )
if not options.has_key( '--runner' ) or options.has_key( '--help' ):
usage()
sys.exit( 1 )
return {
'tag' : options[ '--tag' ]
, 'local' : options[ '--local' ]
, 'runner' : options[ '--runner' ]
, 'platform' : options[ '--platform']
, 'user' : options[ '--user' ]
, 'comment' : options[ '--comment' ]
, 'toolsets' : options[ '--toolsets' ]
, 'bjam_options' : options[ '--bjam-options' ]
, 'bjam_toolset' : options[ '--bjam-toolset' ]
, 'pjl_toolset' : options[ '--pjl-toolset' ]
, 'incremental' : options.has_key( '--incremental' )
, 'force_update' : options.has_key( '--force-update' )
, 'monitored' : options.has_key( '--monitored' )
, 'timeout' : options[ '--timeout' ]
, 'mail' : options[ '--mail' ]
, 'smtp_login' : options[ '--smtp-login' ]
, 'proxy' : options[ '--proxy' ]
, 'ftp_proxy' : options[ '--ftp-proxy' ]
, 'debug_level' : int(options[ '--debug-level' ])
, 'args' : other_args
}
commands = {
'cleanup' : cleanup
, 'get-source' : get_source
, 'update-source' : update_source
, 'setup' : setup
, 'install' : install
, 'test' : test
, 'collect-logs' : collect_logs
, 'upload-logs' : upload_logs
, 'update-itself' : update_itself
, 'regression' : regression
, 'show-revision' : show_revision
}
def usage():
print 'Usage:\n\t%s [command] options' % os.path.basename( sys.argv[0] )
print '''
Commands:
\t%s
Options:
\t--runner runner ID (e.g. 'Metacomm')
\t--tag the tag for the results ('CVS-HEAD' by default)
\t--local the name of the boost tarball
\t--comment an HTML comment file to be inserted in the reports
\t ('comment.html' by default)
\t--incremental do incremental run (do not remove previous binaries)
\t--force-update do a CVS update (if applicable) instead of a clean
\t checkout, even when performing a full run
\t--monitored do a monitored run
\t--timeout specifies the timeout, in minutes, for a single test
\t run/compilation (enforced only in monitored runs, 5 by
\t default)
\t--user SourceForge user name for a shell/CVS account (optional)
\t--toolsets comma-separated list of toolsets to test with (optional)
\t--bjam-options options to pass to the regression test (optional)
\t--bjam-toolset bootstrap toolset for 'bjam' executable (optional)
\t--pjl-toolset bootstrap toolset for 'process_jam_log' executable
\t (optional)
\t--mail email address to send run notification to (optional)
\t--smtp-login STMP server address/login information, in the following
\t form: <user>:<password>@<host>[:<port>] (optional).
\t--proxy HTTP proxy server address and port (e.g.
\t 'http://www.someproxy.com:3128', optional)
\t--ftp-proxy FTP proxy server (e.g. 'ftpproxy', optional)
\t--debug-level debugging level; controls the amount of debugging
\t output printed; 0 by default (no debug output)
''' % '\n\t'.join( commands.keys() )
print 'Example:\n\t%s --runner=Metacomm\n' % os.path.basename( sys.argv[0] )
print 'For more documentation, see http://tinyurl.com/4f2zp\n'
if __name__ == '__main__':
if len(sys.argv) > 1 and sys.argv[1] in commands:
command = sys.argv[1]
args = sys.argv[ 2: ]
if command not in [ 'collect-logs', 'upload-logs' ]:
args.insert( 0, '--runner=' )
else:
command = 'regression'
args = sys.argv[ 1: ]
commands[ command ]( **accept_args( args ) )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -