Boost logo

Boost-Commit :

From: troy_at_[hidden]
Date: 2007-06-16 15:09:35


Author: troy
Date: 2007-06-16 15:09:34 EDT (Sat, 16 Jun 2007)
New Revision: 7079
URL: http://svn.boost.org/trac/boost/changeset/7079

Log:

Fixed scheduling bug, cleanup and comments.

Text files modified:
   sandbox-branches/boost-cmake/dart-client/client.py | 102 +++++++++++++++++++++++++++++++--------
   sandbox-branches/boost-cmake/dart-client/conf.py | 13 ++--
   2 files changed, 87 insertions(+), 28 deletions(-)

Modified: sandbox-branches/boost-cmake/dart-client/client.py
==============================================================================
--- sandbox-branches/boost-cmake/dart-client/client.py (original)
+++ sandbox-branches/boost-cmake/dart-client/client.py 2007-06-16 15:09:34 EDT (Sat, 16 Jun 2007)
@@ -1,5 +1,22 @@
 #!/usr/bin/env python
 
+#
+# Continuous/nightly testing script.
+#
+# This script runs continuous and nightly tests in a continuous loop.
+#
+# 'client.py checkout' will check out the necessary source and set up
+# the necessary directories.
+#
+# 'client.py run' will run the tests in an infinite loop.
+#
+# The script runs the test which was run least recently. It
+# determines how long it was since each test run with the *_dt(time)
+# functions in conf.py. Nightly tests are run only once per day
+# because nightly_dt returns zero if its time argument occurs on the
+# same day as the current time.
+#
+
 import sys
 import os.path
 import time
@@ -7,23 +24,39 @@
 from datetime import datetime, timedelta
 from xml.dom.minidom import parseString
 
+configfile = "conf.py"
+
+#
+# Build class holds the information about each build.
+#
+# build_variant: as specified in build_variants in the configuration file.
+# ctest_variant: as specified in ctest_variants in the configuration file (continuous/nightly).
+# revision: svn revision of the local checkout as of the last time this test was run.
+# last_start: time this test was last started.
+#
 class Build:
     def __init__(self, id_, build_variant_, ctest_variant_):
         self.id = id_
         self.build_variant = build_variant_
         self.ctest_variant = ctest_variant_
         self.revision = -1
- self.last_start = datetime.min
+ self.last_start = datetime.now()
 
     def __str__(self):
         return self.id + "/" + self.build_variant + "/" + self.ctest_variant + " r" + str(self.revision) + " last_t:" + str(self.last_start)
 
+#
+# Get current svn revision number of srcdir
+#
 def svn_status_revision(srcdir):
     output = subprocess.Popen([svn, "info", "--xml", srcdir], stdout=subprocess.PIPE).communicate()[0]
     dom = parseString(output)
     rev = dom.getElementsByTagName("commit")[0].getAttribute("revision")
     return rev
 
+#
+# svn update "srcdir" to revision "revision"
+#
 def svn_update(srcdir, revision):
     try:
         retcode = subprocess.call([svn, "update", "-r", revision, srcdir])
@@ -34,6 +67,9 @@
     except OSError, e:
         print >> sys.stderr, "Execution failed:", e
 
+#
+# svn checkout "url" to local directory "srcdir"
+#
 def svn_checkout(url, srcdir):
     try:
         retcode = subprocess.call([svn, "co", url, srcdir])
@@ -44,18 +80,24 @@
     except OSError, e:
         print >> sys.stderr, "Execution failed:", e
 
+#
+# return the build that was run longest ago
+# as reported by the *_dt functions in the config file.
+#
 def nextbuild(builds):
- front = Build('none', 'none', 'none')
- front_deltat = datetime.min
- front.last_start = datetime.max
-
- for build in builds:
- thisdt = ctest_variants[build.ctest_variant][1](build.last_start)
- print "Delta for build " + str(build) + " is: " + str(thisdt)
- if build.last_start <= front.last_start:
- front = build
- return front
+ nextbuild = Build('none', 'none', 'none')
+ nextbuild_deltat = timedelta.min
+
+ for b in builds:
+ b_dt = ctest_variants[b.ctest_variant][1](b.last_start)
+ if b_dt > nextbuild_deltat:
+ nextbuild_deltat = b_dt
+ nextbuild = b
+ return nextbuild
     
+#
+# Create list of builds (used in initialization)
+#
 def initbuilds():
     builds = []
     for id in urls:
@@ -64,12 +106,16 @@
                 builds.append(Build(id, bv, cv))
     return builds
 
+#
+# print error message
+#
 def print_error(msg, cmd):
     sys.stderr.write('%s: Error: %s\n' % (cmd, msg))
     sys.exit(1)
 
-configfile = "conf.py"
-
+#
+# read the configuration file "configfile" into the current environment
+#
 def read_conf():
     if os.path.exists(configfile):
         execfile(configfile, globals())
@@ -77,6 +123,11 @@
         print_error("Config file '" + configfile + "' not found, run " + sys.argv[0] + " init first.", sys.argv[0])
         exit(1)
 
+#
+# run when './client.py checkout' is specified. Create the necessary
+# directories for the various build/test variants and checkout the
+# source.
+#
 def checkout(argv):
     builds = initbuilds()
     for id, url in urls.items():
@@ -102,6 +153,9 @@
             print cmd
             os.system(cmd)
     
+#
+# Do the builds in an infinite loop.
+#
 def run(args):
     builds = initbuilds()
     while True:
@@ -113,22 +167,24 @@
         build.last_start = datetime.now()
         os.chdir(os.path.join(topdir, prefix, build.id, build.build_variant, build.ctest_variant))
         cmd = ctest + " " + " ".join(ctest_variants[build.ctest_variant][0])
- print ">>> " + cmd
         os.system(cmd)
         srcdir = os.path.join(topdir, prefix, build.id, "src")
         rev = svn_status_revision(srcdir)
         build.revision = rev
- print ">>> New last-built revision of " + srcdir + " is " + str(rev)
- print ">>>\n>>> Finshed build " + str(build) + "\n>>>"
+ print ">>> Finished %s/%s/%s @%s" % (build.id, build.build_variant, build.ctest_variant, build.revision)
+ print ">>> Sleeping %s seconds..." % interbuild_sleep
         time.sleep(interbuild_sleep)
-
+
+#
+# eh.
+#
 def help(argv):
- print __name__
+ print "Usage:\n\n " + argv[0] + " (checkout|run)\n\ncheckout: checks out source and sets up build environment. Do this first.\nrun: run regression tests in a loop.\n\n"
+ sys.exit(1)
     
 topdir = '?'
 def main(argv):
     globals()['topdir'] = os.getcwd()
- print "topdir is " + topdir
     if argv[1] == "init":
         init(argv)
     elif not action_mapping.has_key(argv[1]):
@@ -137,9 +193,9 @@
         read_conf()
         action_mapping[argv[1]](argv)
 
-def dropenv(fn, *args):
- return lambda x: fn(*args)
-
+#
+# map command-line strings to functions
+#
 action_mapping = {
     'checkout' : checkout,
     'run' : run,
@@ -147,4 +203,6 @@
     }
 
 if __name__ == "__main__":
+ if len(sys.argv) != 2:
+ help(sys.argv)
     main(sys.argv)

Modified: sandbox-branches/boost-cmake/dart-client/conf.py
==============================================================================
--- sandbox-branches/boost-cmake/dart-client/conf.py (original)
+++ sandbox-branches/boost-cmake/dart-client/conf.py 2007-06-16 15:09:34 EDT (Sat, 16 Jun 2007)
@@ -4,9 +4,10 @@
 prefix = 'prefix'
 
 #
-# Wait 3 minutes between builds
+# Wait 1 minute between builds
+# Each build will trigger an svn update. Go easy on the repository.
 #
-interbuild_sleep = 180
+interbuild_sleep = 60
 
 #
 # Association tag => url of things to build/test
@@ -31,8 +32,8 @@
     current_time = datetime.now()
     if current_time.date() > t.date():
         return current_time - t
- else:
- return timedelta(-1) # delta of negative one day, won't get run
+ else:
+ return timedelta(0)
 
 #
 # For testing, return dt if t didn't happen this minute.
@@ -42,7 +43,7 @@
     if current_time.replace(microsecond=0, second=0) > t:
         return current_time - t
     else:
- return timedelta(-1) # delta of negative one day, won't get run
+ return timedelta(0)
 
 #
 # Straight delta-time for continuous builds
@@ -62,7 +63,7 @@
 #
 ctest_variants = {
     'continuous' : (['-D', 'Continuous'], continuous_dt),
- 'nightly' : (['-D', 'Nightly'], nightly_dt)
+ 'nightly' : (['-D', 'Nightly'], minutely_dt)
     }
 
 #


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk