|
|
@@ -0,0 +1,197 @@
|
|
|
+# smoke test - every so many minutes, check svn revision, and if changed:
|
|
|
+# update working copy, run tests, upload results
|
|
|
+
|
|
|
+# Copyright Beman Dawes 2007
|
|
|
+
|
|
|
+# 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 os
|
|
|
+import sys
|
|
|
+import platform
|
|
|
+import time
|
|
|
+import ftplib
|
|
|
+
|
|
|
+# invoke the system command line processor
|
|
|
+def cmd(command):
|
|
|
+ print "command:", command
|
|
|
+ os.system(command)
|
|
|
+
|
|
|
+# update SVN working copy
|
|
|
+def update_working_copy(boost_path):
|
|
|
+ os.chdir(boost_path)
|
|
|
+ cmd("svn update")
|
|
|
+
|
|
|
+# get repository url
|
|
|
+def repository_url(path, results_path):
|
|
|
+ url = ""
|
|
|
+ svn_info_file = results_path + "/svn_info.xml"
|
|
|
+ command = "svn info --xml " + path + " >" + svn_info_file
|
|
|
+ cmd(command)
|
|
|
+ f = open( svn_info_file, 'r' )
|
|
|
+ svn_info = f.read()
|
|
|
+ f.close()
|
|
|
+ i = svn_info.find('//svn.boost.org')
|
|
|
+ if i >= 0:
|
|
|
+ url = svn_info[i:svn_info.find("</url>")]
|
|
|
+ return url
|
|
|
+
|
|
|
+# get revision number of a path, which may be a filesystem path or URL
|
|
|
+def revision(path, results_path, test_name):
|
|
|
+ rev = 0
|
|
|
+ svn_info_file = results_path + "/" + test_name + "-svn_info.xml"
|
|
|
+ command = "svn info --xml " + path + " >" + svn_info_file
|
|
|
+ cmd(command)
|
|
|
+ f = open( svn_info_file, 'r' )
|
|
|
+ svn_info = f.read()
|
|
|
+ f.close()
|
|
|
+ i = svn_info.find( 'revision=' )
|
|
|
+ if i >= 0:
|
|
|
+ i += 10
|
|
|
+ while svn_info[i] >= '0' and svn_info[i] <= '9':
|
|
|
+ rev = rev*10 + int(svn_info[i])
|
|
|
+ i += 1
|
|
|
+ return rev
|
|
|
+
|
|
|
+# run bjam in current directory
|
|
|
+def bjam(boost_path, args, output_path, test_name):
|
|
|
+
|
|
|
+ # bjam seems to need BOOST_BUILD_PATH
|
|
|
+ #os.environ["BOOST_BUILD_PATH"]=boost_path + "/tools/build/v2"
|
|
|
+
|
|
|
+ print "Begin bjam..."
|
|
|
+ command = "bjam --v2 --dump-tests -l180"
|
|
|
+ if args != "": command += " " + args
|
|
|
+ command += " >" + output_path + "/" + test_name +"-bjam.log 2>&1"
|
|
|
+ cmd(command)
|
|
|
+
|
|
|
+# run process_jam_log in current directory
|
|
|
+def process_jam_log(boost_path, output_path, test_name):
|
|
|
+ print "Begin log processing..."
|
|
|
+ command = "process_jam_log " + boost_path + " <" +\
|
|
|
+ output_path + "/" + test_name +"-bjam.log"
|
|
|
+ cmd(command)
|
|
|
+
|
|
|
+# run compiler_status in current directory
|
|
|
+def compiler_status(boost_path, output_path, test_name):
|
|
|
+ print "Begin compiler status html creation... "
|
|
|
+ command = "compiler_status --v2 --ignore-pass --no-warn --locate-root " + boost_path + " " +\
|
|
|
+ boost_path + " " + output_path + "/" + test_name + "-results.html " +\
|
|
|
+ output_path + "/" + test_name + "-details.html "
|
|
|
+ cmd(command)
|
|
|
+
|
|
|
+# upload results via ftp
|
|
|
+def upload_to_ftp(results_path, test_name, ftp_url, user, psw, debug_level):
|
|
|
+
|
|
|
+ # to minimize the time web pages are not available, upload with temporary
|
|
|
+ # names and then rename to the permanent names
|
|
|
+
|
|
|
+ i = 0 # dummy variable
|
|
|
+ os.chdir(results_path)
|
|
|
+
|
|
|
+ tmp_results = "temp-" + test_name + "-results.html"
|
|
|
+ results = test_name + "-results.html"
|
|
|
+ tmp_details = "temp-" + test_name + "-details.html"
|
|
|
+ details = test_name + "-details.html"
|
|
|
+
|
|
|
+ print "Uploading results via ftp..."
|
|
|
+ ftp = ftplib.FTP( ftp_url, user, psw )
|
|
|
+ ftp.set_debuglevel( debug_level )
|
|
|
+
|
|
|
+ # ftp.cwd( site_path )
|
|
|
+
|
|
|
+ try: ftp.delete(tmp_results)
|
|
|
+ except: ++i
|
|
|
+
|
|
|
+ f = open( results, 'rb' )
|
|
|
+ ftp.storbinary( 'STOR %s' % tmp_results, f )
|
|
|
+ f.close()
|
|
|
+
|
|
|
+ try: ftp.delete(tmp_details)
|
|
|
+ except: ++i
|
|
|
+
|
|
|
+ f = open( details, 'rb' )
|
|
|
+ ftp.storbinary( 'STOR %s' % tmp_details, f )
|
|
|
+ f.close()
|
|
|
+
|
|
|
+ try: ftp.delete(results)
|
|
|
+ except: ++i
|
|
|
+
|
|
|
+ try: ftp.delete(details)
|
|
|
+ except: ++i
|
|
|
+
|
|
|
+ ftp.rename(tmp_results, results)
|
|
|
+ ftp.rename(tmp_details, details)
|
|
|
+
|
|
|
+ ftp.dir()
|
|
|
+ ftp.quit()
|
|
|
+
|
|
|
+def commit_results(results_path, test_name, rev):
|
|
|
+ print "Commit results..."
|
|
|
+ cwd = os.getcwd()
|
|
|
+ os.chdir(results_path)
|
|
|
+ command = "svn commit --non-interactive -m "+'"'+str(rev)+'" '+test_name+"-results.html"
|
|
|
+ cmd(command)
|
|
|
+ os.chdir(cwd)
|
|
|
+
|
|
|
+
|
|
|
+# ---------------------------------------------------------------------------- #
|
|
|
+
|
|
|
+if len(sys.argv) < 7:
|
|
|
+ print "Invoke with: minutes boost-path test-name results-path ftp-url user psw [bjam-args]"
|
|
|
+ print " boost-path must be path for a boost svn working directory."
|
|
|
+ print " results-path must be path for a svn working directory where an"
|
|
|
+ print " svn commit test-name+'-results.html' is valid."
|
|
|
+ print "Warning: This program hangs or crashes on network failures."
|
|
|
+ exit()
|
|
|
+
|
|
|
+minutes = int(sys.argv[1])
|
|
|
+boost_path = sys.argv[2]
|
|
|
+test_name = sys.argv[3]
|
|
|
+results_path = sys.argv[4]
|
|
|
+ftp_url = sys.argv[5]
|
|
|
+user = sys.argv[6]
|
|
|
+psw = sys.argv[7]
|
|
|
+if len(sys.argv) > 8: bjam_args = sys.argv[8]
|
|
|
+else: bjam_args = ""
|
|
|
+
|
|
|
+os.chdir(boost_path) # convert possible relative path
|
|
|
+boost_path = os.getcwd() # to absolute path
|
|
|
+
|
|
|
+print "minutes is ", minutes
|
|
|
+print "boost_path is ", boost_path
|
|
|
+print "test_name is ", test_name
|
|
|
+print "results_path is ", results_path
|
|
|
+print "ftp_url is ", ftp_url
|
|
|
+print "user is ", user
|
|
|
+print "psw is ", psw
|
|
|
+print 'bjam args are "' + bjam_args + '"'
|
|
|
+
|
|
|
+url = repository_url(boost_path, results_path)
|
|
|
+print "respository url is ", url
|
|
|
+
|
|
|
+first = 1
|
|
|
+while 1:
|
|
|
+ working_rev = revision(boost_path, results_path, test_name)
|
|
|
+ repos_rev = revision("http:" + url, results_path, test_name)
|
|
|
+ print "Working copy revision: ", working_rev, " repository revision: ", repos_rev
|
|
|
+ if first or working_rev != repos_rev:
|
|
|
+ first = 0
|
|
|
+ start_time = time.time()
|
|
|
+ print
|
|
|
+ print "start at", time.strftime("%H:%M:%S", time.localtime())
|
|
|
+ update_working_copy(boost_path)
|
|
|
+ os.chdir(boost_path+"/status")
|
|
|
+ bjam(boost_path, bjam_args, results_path, test_name)
|
|
|
+ process_jam_log(boost_path, results_path, test_name)
|
|
|
+ compiler_status(boost_path, results_path, test_name)
|
|
|
+ upload_to_ftp(results_path, test_name, ftp_url, user, psw, 0)
|
|
|
+ commit_results(results_path, test_name,revision(boost_path, results_path, test_name))
|
|
|
+ elapsed_time = time.time() - start_time
|
|
|
+ print elapsed_time/60.0, "minutes elapsed time"
|
|
|
+ print
|
|
|
+
|
|
|
+ print "sleep ", minutes, "minutes..."
|
|
|
+ time.sleep(60 * minutes)
|