Просмотр исходного кода

Merge regression reports fixed from RC_1_34_0

[SVN r37016]
Aleksey Gurtovoy 19 лет назад
Родитель
Сommit
ab4194f48f

+ 0 - 35
tools/regression/build/Jamfile

@@ -1,35 +0,0 @@
-# Regression test status reporting tools build Jamfile
-
-subproject tools/regression/build ;
-
-exe process_jam_log
-        :
-        ../process_jam_log.cpp ../detail/tiny_xml.cpp
-        <lib>../../../libs/filesystem/build/boost_filesystem
-        :
-        <sysinclude>$(BOOST_ROOT)
-        <define>BOOST_ALL_NO_LIB=1
-        :
-        release
-        ;
-
-exe compiler_status
-        :
-        ../compiler_status.cpp ../detail/tiny_xml.cpp
-        <lib>../../../libs/filesystem/build/boost_filesystem
-        :
-        <sysinclude>$(BOOST_ROOT)
-        <define>BOOST_ALL_NO_LIB=1
-        :
-        release
-        ;
-
-stage run
-    :
-        <exe>process_jam_log
-        <exe>compiler_status
-    :
-    :
-        release
-        <suppress>true
-    ;

+ 1 - 1
tools/regression/compiler_status.cpp

@@ -84,7 +84,7 @@ namespace
   const string empty_string;
   const string empty_string;
 
 
   // prefix for library and test hyperlink prefix
   // prefix for library and test hyperlink prefix
-  const string cvs_root ( "http://boost.cvs.sourceforge.net/" );
+  string cvs_root ( "http://boost.cvs.sourceforge.net/" );
   string url_prefix_dir_view( cvs_root + "boost/boost" );
   string url_prefix_dir_view( cvs_root + "boost/boost" );
   string url_prefix_checkout_view( cvs_root + "*checkout*/boost/boost" );
   string url_prefix_checkout_view( cvs_root + "*checkout*/boost/boost" );
   string url_suffix_text_view( "?view=markup&rev=HEAD" );
   string url_suffix_text_view( "?view=markup&rev=HEAD" );

+ 1 - 1
tools/regression/index.htm

@@ -30,7 +30,7 @@ used to generate the actual status reports.</p>
     <li><a href="compiler_status.cpp">compiler_status.cpp</a> -
     <li><a href="compiler_status.cpp">compiler_status.cpp</a> -
         Generates HTML status tables from test_log.xml and other
         Generates HTML status tables from test_log.xml and other
         files.</li>
         files.</li>
-    <li><a href="build/Jamfile">Jamfile</a> - Builds
+    <li><a href="build/Jamfile.v2">Jamfile.v2</a> - Builds
         process_jam_log and compiler_status executables.</li>
         process_jam_log and compiler_status executables.</li>
 </ul>
 </ul>
 
 

+ 0 - 46
tools/regression/test/Jamfile

@@ -1,46 +0,0 @@
-# Boost Regression Reporting test Jamfile
-
-#  (C) Copyright Beman Dawes 2003. Permission to copy, use, modify, sell and
-#  distribute this software is granted provided this copyright notice appears in
-#  all copies. This software is provided "as is" without express or implied
-#  warranty, and with no claim as to its suitability for any purpose.
-
-subproject libs/regression/test ;
-
-# bring in rules for testing
-import testing ;
-
-# Make tests run by default.
-DEPENDS all : test ;
-
-{
-    # look in BOOST_ROOT for sources first, just in this Jamfile
-    local SEARCH_SOURCE = $(BOOST_ROOT) $(SEARCH_SOURCE) ;
-    
-
-#  Test naming convention: the portion of the name before the tilde ("~")
-#  identifies the bjam test type. The portion after the tilde
-#  identifies the correct result to be reported by compiler_status.
-
-    compile compile~fail.cpp ;
-    compile compile~pass.cpp ;
-    compile compile~warn.cpp ;
-    
-    compile-fail compile-fail~fail.cpp ;
-    compile-fail compile-fail~pass.cpp ;
-    
-    run run~compile-fail.cpp ;
-    run run~fail.cpp ;
-    run run~fail-note.cpp ;
-    run run~fail-warn.cpp ;
-    run run~note.cpp ;
-    run run~pass.cpp ;
-    run run~warn.cpp ;
-    run run~warn-note.cpp ;
-    
-    run-fail run-fail~compile-fail.cpp ;
-    run-fail run-fail~fail.cpp ;
-    run-fail run-fail~fail-warn.cpp ;
-    run-fail run-fail~pass.cpp ;
-    run-fail run-fail~warn.cpp ;
-}

+ 87 - 37
tools/regression/test/test.py

@@ -51,7 +51,7 @@ def list_recursively( dir ):
 def find_process_jam_log():
 def find_process_jam_log():
     root = "../../../"
     root = "../../../"
     
     
-    for root, dirs, files in os.walk( os.path.join( root, "bin" ), topdown=False ):
+    for root, dirs, files in os.walk( os.path.join( root, "bin.v2" ), topdown=False ):
         if "process_jam_log.exe" in files:
         if "process_jam_log.exe" in files:
             return os.path.abspath( os.path.normpath( os.path.join( root, "process_jam_log.exe" ) ) )
             return os.path.abspath( os.path.normpath( os.path.join( root, "process_jam_log.exe" ) ) )
         if "process_jam_log" in files:
         if "process_jam_log" in files:
@@ -61,9 +61,11 @@ def find_process_jam_log():
 def process_jam_log( executable, file, locate_root, results_dir ):
 def process_jam_log( executable, file, locate_root, results_dir ):
     args = []
     args = []
     args.append( executable )
     args.append( executable )
-    args.append( "--results-dir" )
-    args.append( results_dir )
+    # args.append( '--echo' )
+    args.append( '--create-directories' )
+    args.append( '--v2' )
     args.append( locate_root )
     args.append( locate_root )
+    args.append( '<' )
     args.append( file )
     args.append( file )
 
 
     cmd = " ".join( args )
     cmd = " ".join( args )
@@ -80,50 +82,98 @@ def read_file( file_path ):
 
 
 def remove_timestamps( log_lines ):
 def remove_timestamps( log_lines ):
     return [ re.sub( "timestamp=\"[^\"]+\"", "timestamp=\"\"", x ) for x in log_lines ]    
     return [ re.sub( "timestamp=\"[^\"]+\"", "timestamp=\"\"", x ) for x in log_lines ]    
-    
+
+def determine_locate_root( bjam_log ):
+    locate_root = None
+    f = open( 'bjam.log' )
+    try:
+        locate_root_re = re.compile( r'locate-root\s+"(.*)"' )
+        for l in f.readlines():
+            m = locate_root_re.match( l )
+            if m:
+                locate_root = m.group(1)
+                break
+    finally:
+        f.close()
+    return locate_root
+
+def read_file( path ):    
+    f = open( path )
+    try:
+        return f.read()
+    finally:
+        f.close()
+
+def read_file_lines( path ):    
+    f = open( path )
+    try:
+        return f.readlines()
+    finally:
+        f.close()
+
+def write_file( path, content ):    
+    f = open( path, 'w' )
+    try:
+        return f.write( content )
+    finally:
+        f.close()
+
+def write_file_lines( path, content ):    
+    f = open( path, 'w' )
+    try:
+        return f.writelines( content )
+    finally:
+        f.close()
+
+        
 def run_test_cases( test_cases ):
 def run_test_cases( test_cases ):
     process_jam_log_executable = find_process_jam_log()
     process_jam_log_executable = find_process_jam_log()
+    print 'Found process_jam_log: %s' % process_jam_log_executable
+    initial_dir = os.getcwd()
     for test_case in test_cases:
     for test_case in test_cases:
+        os.chdir( initial_dir )
         print 'Running test case "%s"' % test_case
         print 'Running test case "%s"' % test_case
         os.chdir( test_case )
         os.chdir( test_case )
         if os.path.exists( "expected" ):
         if os.path.exists( "expected" ):
+            locate_root = determine_locate_root( 'bjam.log' )
+            print 'locate_root: %s' % locate_root
+            
             actual_results_dir = os.path.join( test_case, "actual" )
             actual_results_dir = os.path.join( test_case, "actual" )
-            f = open( "locate_root.txt" ) 
-            try:
-                locate_root = f.read().splitlines()[0]
-            finally:
-                f.close()
-
             clean_dir( "actual" )
             clean_dir( "actual" )
             os.chdir( "actual" )
             os.chdir( "actual" )
-            process_jam_log( executable = process_jam_log_executable
-                             , results_dir = "."
-                             , locate_root = locate_root
-                             , file="..\\bjam.log" )
-            os.chdir( ".." )
-
-            actual_content = list_recursively( "actual" )
+            root = os.getcwd()
+            i = 0
+            while 1:
+                if i == 0:
+                    bjam_log_file = 'bjam.log'
+                else:
+                    bjam_log_file = 'bjam.log.%0d' % i
+                i += 1
+                print 'Looking for %s' % bjam_log_file
+                if not os.path.exists( os.path.join( '..', bjam_log_file ) ):
+                    print '    does not exists'
+                    break
+                print '    found'
+                write_file_lines(bjam_log_file.replace( 'bjam', 'bjam_' ), 
+                                 [ x.replace( locate_root, root  ) for x in read_file_lines( os.path.join( '..', bjam_log_file ) ) ]  )
+                
+                process_jam_log( executable = process_jam_log_executable
+                                 , results_dir = "."
+                                 , locate_root = root 
+                                 , file=bjam_log_file.replace( 'bjam', 'bjam_' ) )
+            
+            actual_content = list_recursively( "." )
             actual_content.sort()
             actual_content.sort()
-
-            expected_content = list_recursively( "expected" )
-            expected_content.sort()
-
-            structure_diffs = list( difflib.unified_diff( actual_content, expected_content ) )
-            if ( len( structure_diffs ) > 0 ):
-                raise "Actual results are different from expected \n %s" % "\n".join( structure_diffs )
-            else:
-                for i in range( 0, len( actual_content ) ):
-                    expected_file = os.path.join( "expected", expected_content[ i ] )
-                    actual_file = os.path.join( "actual", actual_content[ i ] )
-                    
-                    print "Comparing %s to %s" % ( expected_file, actual_file )
-                    if ( not os.path.isdir( expected_file ) and not os.path.isdir( actual_file ) ):
-                        expected = remove_timestamps( read_file( expected_file ).splitlines() )
-                        actual = remove_timestamps( read_file( actual_file ).splitlines() )
-                        content_diff = list( difflib.unified_diff( expected, actual ) )
-                        if ( len( content_diff ) > 0 ):
-                            raise "difference \n%s" % "\n".join( content_diff )
-                                         
+            result_xml = []
+            for test_log in [ x for x in actual_content if os.path.splitext( x )[1] == '.xml' ]:
+                print 'reading %s' % test_log
+                result = [ re.sub( r'timestamp="(.*)"', 'timestamp="xxx"', x ) for x in read_file_lines( test_log ) ]
+                result_xml.extend( result )
+                
+            write_file_lines( 'results.xml', result_xml )
+            os.chdir( '..' )
+            assert read_file( 'expected/results.xml' ) == read_file( 'actual/results.xml' )
+            os.chdir( '..' )
         else:
         else:
             raise '   Test case "%s" doesn\'t contain the expected results directory ("expected" )' % ( test_case )
             raise '   Test case "%s" doesn\'t contain the expected results directory ("expected" )' % ( test_case )
         
         

+ 2 - 0
tools/regression/xsl_reports/boost_wide_report.py

@@ -9,6 +9,7 @@ import shutil
 import codecs
 import codecs
 import xml.sax.handler
 import xml.sax.handler
 import glob
 import glob
+import re
 import os.path
 import os.path
 import os
 import os
 import string
 import string
@@ -346,6 +347,7 @@ def ftp_task( site, site_path , destination ):
     f.cwd( site_path )
     f.cwd( site_path )
 
 
     source_content = list_ftp( f )
     source_content = list_ftp( f )
+    source_content = [ x for x in source_content if re.match( r'.+[.](?<!log[.])zip', x.name ) and x.name.lower() != 'boostbook.zip' ]
     destination_content = list_dir( destination )
     destination_content = list_dir( destination )
     d = diff( source_content, destination_content )
     d = diff( source_content, destination_content )
 
 

+ 179 - 0
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()

+ 114 - 153
tools/regression/xsl_reports/runner/instructions.html

@@ -3,41 +3,33 @@
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
 <head>
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-<meta name="generator" content="Docutils 0.4.1: http://docutils.sourceforge.net/" />
+<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
 <title>Running Boost Regression Tests</title>
 <title>Running Boost Regression Tests</title>
 <style type="text/css">
 <style type="text/css">
 
 
 /*
 /*
 :Author: David Goodger
 :Author: David Goodger
 :Contact: goodger@users.sourceforge.net
 :Contact: goodger@users.sourceforge.net
-:Date: $Date$
-:Revision: $Revision$
-:Copyright: This stylesheet has been placed in the public domain.
+:date: $Date$
+:version: $Revision$
+:copyright: This stylesheet has been placed in the public domain.
 
 
 Default cascading style sheet for the HTML output of Docutils.
 Default cascading style sheet for the HTML output of Docutils.
-
-See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
-customize this style sheet.
 */
 */
 
 
-/* used to remove borders from tables and images */
-.borderless, table.borderless td, table.borderless th {
-  border: 0 }
+body {
+    background-color: #fffff5;
+}
 
 
-table.borderless td, table.borderless th {
-  /* Override padding for "table.docutils td" with "! important".
-     The right padding separates the table cells. */
-  padding: 0 0.5em 0 0 ! important }
+h2 {
+    text-decoration: underline;
+}
 
 
 .first {
 .first {
-  /* Override more specific margin styles with "! important". */
-  margin-top: 0 ! important }
-
-.last, .with-subtitle {
-  margin-bottom: 0 ! important }
+  margin-top: 0 }
 
 
-.hidden {
-  display: none }
+.last {
+  margin-bottom: 0 }
 
 
 a.toc-backref {
 a.toc-backref {
   text-decoration: none ;
   text-decoration: none ;
@@ -46,14 +38,9 @@ a.toc-backref {
 blockquote.epigraph {
 blockquote.epigraph {
   margin: 2em 5em ; }
   margin: 2em 5em ; }
 
 
-dl.docutils dd {
+dd {
   margin-bottom: 0.5em }
   margin-bottom: 0.5em }
 
 
-/* Uncomment (and remove this text!) to get bold-faced definition list terms
-dl.docutils dt {
-  font-weight: bold }
-*/
-
 div.abstract {
 div.abstract {
   margin: 2em 5em }
   margin: 2em 5em }
 
 
@@ -61,18 +48,12 @@ div.abstract p.topic-title {
   font-weight: bold ;
   font-weight: bold ;
   text-align: center }
   text-align: center }
 
 
-div.admonition, div.attention, div.caution, div.danger, div.error,
-div.hint, div.important, div.note, div.tip, div.warning {
+div.attention, div.caution, div.danger, div.error, div.hint,
+div.important, div.note, div.tip, div.warning, div.admonition {
   margin: 2em ;
   margin: 2em ;
   border: medium outset ;
   border: medium outset ;
   padding: 1em }
   padding: 1em }
 
 
-div.admonition p.admonition-title, div.hint p.admonition-title,
-div.important p.admonition-title, div.note p.admonition-title,
-div.tip p.admonition-title {
-  font-weight: bold ;
-  font-family: sans-serif }
-
 div.attention p.admonition-title, div.caution p.admonition-title,
 div.attention p.admonition-title, div.caution p.admonition-title,
 div.danger p.admonition-title, div.error p.admonition-title,
 div.danger p.admonition-title, div.error p.admonition-title,
 div.warning p.admonition-title {
 div.warning p.admonition-title {
@@ -80,14 +61,11 @@ div.warning p.admonition-title {
   font-weight: bold ;
   font-weight: bold ;
   font-family: sans-serif }
   font-family: sans-serif }
 
 
-/* Uncomment (and remove this text!) to get reduced vertical space in
-   compound paragraphs.
-div.compound .compound-first, div.compound .compound-middle {
-  margin-bottom: 0.5em }
-
-div.compound .compound-last, div.compound .compound-middle {
-  margin-top: 0.5em }
-*/
+div.hint p.admonition-title, div.important p.admonition-title,
+div.note p.admonition-title, div.tip p.admonition-title,
+div.admonition p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
 
 
 div.dedication {
 div.dedication {
   margin: 2em 5em ;
   margin: 2em 5em ;
@@ -99,27 +77,15 @@ div.dedication p.topic-title {
   font-style: normal }
   font-style: normal }
 
 
 div.figure {
 div.figure {
-  margin-left: 2em ;
-  margin-right: 2em }
+  margin-left: 2em }
 
 
 div.footer, div.header {
 div.footer, div.header {
-  clear: both;
   font-size: smaller }
   font-size: smaller }
 
 
-div.line-block {
-  display: block ;
-  margin-top: 1em ;
-  margin-bottom: 1em }
-
-div.line-block div.line-block {
-  margin-top: 0 ;
-  margin-bottom: 0 ;
-  margin-left: 1.5em }
-
 div.sidebar {
 div.sidebar {
   margin-left: 1em ;
   margin-left: 1em ;
   border: medium outset ;
   border: medium outset ;
-  padding: 1em ;
+  padding: 0em 1em ;
   background-color: #ffffee ;
   background-color: #ffffee ;
   width: 40% ;
   width: 40% ;
   float: right ;
   float: right ;
@@ -146,25 +112,15 @@ div.system-message p.system-message-title {
 div.topic {
 div.topic {
   margin: 2em }
   margin: 2em }
 
 
-h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
-h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
-  margin-top: 0.4em }
-
 h1.title {
 h1.title {
   text-align: center }
   text-align: center }
 
 
 h2.subtitle {
 h2.subtitle {
   text-align: center }
   text-align: center }
 
 
-hr.docutils {
+hr {
   width: 75% }
   width: 75% }
 
 
-img.align-left {
-  clear: left }
-
-img.align-right {
-  clear: right }
-
 ol.simple, ul.simple {
 ol.simple, ul.simple {
   margin-bottom: 1em }
   margin-bottom: 1em }
 
 
@@ -221,6 +177,10 @@ pre.address {
   font-family: serif ;
   font-family: serif ;
   font-size: 100% }
   font-size: 100% }
 
 
+pre.line-block {
+  font-family: serif ;
+  font-size: 100% }
+
 pre.literal-block, pre.doctest-block {
 pre.literal-block, pre.doctest-block {
   margin-left: 2em ;
   margin-left: 2em ;
   margin-right: 2em ;
   margin-right: 2em ;
@@ -240,48 +200,44 @@ span.interpreted {
 span.option {
 span.option {
   white-space: nowrap }
   white-space: nowrap }
 
 
+span.option-argument {
+  font-style: italic }
+
 span.pre {
 span.pre {
   white-space: pre }
   white-space: pre }
 
 
 span.problematic {
 span.problematic {
   color: red }
   color: red }
 
 
-span.section-subtitle {
-  /* font-size relative to parent (h1..h6 element) */
-  font-size: 80% }
+table {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
 
 
 table.citation {
 table.citation {
-  border-left: solid 1px gray;
-  margin-left: 1px }
+  border-left: solid thin gray ;
+  padding-left: 0.5ex }
 
 
 table.docinfo {
 table.docinfo {
   margin: 2em 4em }
   margin: 2em 4em }
 
 
-table.docutils {
-  margin-top: 0.5em ;
-  margin-bottom: 0.5em }
-
 table.footnote {
 table.footnote {
-  border-left: solid 1px black;
-  margin-left: 1px }
+  border-left: solid thin black ;
+  padding-left: 0.5ex }
 
 
-table.docutils td, table.docutils th,
-table.docinfo td, table.docinfo th {
+td, th {
   padding-left: 0.5em ;
   padding-left: 0.5em ;
   padding-right: 0.5em ;
   padding-right: 0.5em ;
   vertical-align: top }
   vertical-align: top }
 
 
-table.docutils th.field-name, table.docinfo th.docinfo-name {
+th.docinfo-name, th.field-name {
   font-weight: bold ;
   font-weight: bold ;
   text-align: left ;
   text-align: left ;
-  white-space: nowrap ;
-  padding-left: 0 }
+  white-space: nowrap }
 
 
-h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
-h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+h1 tt, h2 tt, h3 tt, h4 tt, h5 tt, h6 tt {
   font-size: 100% }
   font-size: 100% }
 
 
-tt.docutils {
+tt {
   background-color: #eeeeee }
   background-color: #eeeeee }
 
 
 ul.auto-toc {
 ul.auto-toc {
@@ -290,21 +246,21 @@ ul.auto-toc {
 </style>
 </style>
 </head>
 </head>
 <body>
 <body>
-<div class="document" id="running-boost-regression-tests">
 <h1 class="title">Running Boost Regression Tests</h1>
 <h1 class="title">Running Boost Regression Tests</h1>
-<div class="section">
-<h1><a id="requirements" name="requirements">Requirements</a></h1>
+<div class="document" id="running-boost-regression">
+<div class="section" id="requirements">
+<h1><a name="requirements">Requirements</a></h1>
 <ul class="simple">
 <ul class="simple">
 <li>Python 2.3 or higher</li>
 <li>Python 2.3 or higher</li>
 <li>Some spare disk space (~5 Gb per each tested compiler)</li>
 <li>Some spare disk space (~5 Gb per each tested compiler)</li>
 </ul>
 </ul>
 <p>That's it! You don't even need a CVS client installed.</p>
 <p>That's it! You don't even need a CVS client installed.</p>
 </div>
 </div>
-<div class="section">
-<h1><a id="installation" name="installation">Installation</a></h1>
+<div class="section" id="installation">
+<h1><a name="installation">Installation</a></h1>
 <ul class="simple">
 <ul class="simple">
 <li>Download regression driver <tt class="docutils literal"><span class="pre">regression.py</span></tt> from <a class="reference" href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/tools/regression/xsl_reports/runner/regression.py">here</a> (<a class="reference" href="http://tinyurl.com/uufav">http://tinyurl.com/uufav</a>)
 <li>Download regression driver <tt class="docutils literal"><span class="pre">regression.py</span></tt> from <a class="reference" href="http://boost.cvs.sourceforge.net/*checkout*/boost/boost/tools/regression/xsl_reports/runner/regression.py">here</a> (<a class="reference" href="http://tinyurl.com/uufav">http://tinyurl.com/uufav</a>)
-and put it in the directory where you want all the regression
+and put it in the directory where you want all the regression 
 test files to be placed.</li>
 test files to be placed.</li>
 </ul>
 </ul>
 <ul>
 <ul>
@@ -318,12 +274,12 @@ my_boost_regressions/
 </li>
 </li>
 </ul>
 </ul>
 </div>
 </div>
-<div class="section">
-<h1><a id="running-tests" name="running-tests">Running tests</a></h1>
+<div class="section" id="running-tests">
+<h1><a name="running-tests">Running tests</a></h1>
 <p>To start a regression run, simply run <tt class="docutils literal"><span class="pre">regression.py</span></tt> providing it with the following
 <p>To start a regression run, simply run <tt class="docutils literal"><span class="pre">regression.py</span></tt> providing it with the following
 two arguments:</p>
 two arguments:</p>
 <ul class="simple">
 <ul class="simple">
-<li>runner id (something unique of your choice that will identify your
+<li>runner id (something unique of your choice that will identify your 
 results in the reports <a class="footnote-reference" href="#runnerid1" id="id2" name="id2">[1]</a>, <a class="footnote-reference" href="#runnerid2" id="id3" name="id3">[2]</a>)</li>
 results in the reports <a class="footnote-reference" href="#runnerid1" id="id2" name="id2">[1]</a>, <a class="footnote-reference" href="#runnerid2" id="id3" name="id3">[2]</a>)</li>
 <li>a particular set of toolsets you want to test with <a class="footnote-reference" href="#toolsets" id="id4" name="id4">[3]</a>.</li>
 <li>a particular set of toolsets you want to test with <a class="footnote-reference" href="#toolsets" id="id4" name="id4">[3]</a>.</li>
 </ul>
 </ul>
@@ -333,33 +289,33 @@ python regression.py --runner=Metacomm --toolsets=gcc,vc7
 </pre>
 </pre>
 <p>If you are interested in seeing all available options, run <tt class="docutils literal"><span class="pre">python</span> <span class="pre">regression.py</span></tt>
 <p>If you are interested in seeing all available options, run <tt class="docutils literal"><span class="pre">python</span> <span class="pre">regression.py</span></tt>
 or <tt class="docutils literal"><span class="pre">python</span> <span class="pre">regression.py</span> <span class="pre">--help</span></tt>. See also the <a class="reference" href="#advanced-use">Advanced use</a> section below.</p>
 or <tt class="docutils literal"><span class="pre">python</span> <span class="pre">regression.py</span> <span class="pre">--help</span></tt>. See also the <a class="reference" href="#advanced-use">Advanced use</a> section below.</p>
-<p><strong>Note</strong>: If you are behind a firewall/proxy server, everything should still &quot;just work&quot;.
-In the rare cases when it doesn't, you can explicitly specify the proxy server
+<p><strong>Note</strong>: If you are behind a firewall/proxy server, everything should still &quot;just work&quot;. 
+In the rare cases when it doesn't, you can explicitly specify the proxy server 
 parameters through the <tt class="docutils literal"><span class="pre">--proxy</span></tt> option, e.g.:</p>
 parameters through the <tt class="docutils literal"><span class="pre">--proxy</span></tt> option, e.g.:</p>
 <pre class="literal-block">
 <pre class="literal-block">
 python regression.py ... <strong>--proxy=http://www.someproxy.com:3128</strong>
 python regression.py ... <strong>--proxy=http://www.someproxy.com:3128</strong>
 </pre>
 </pre>
 </div>
 </div>
-<div class="section">
-<h1><a id="details" name="details">Details</a></h1>
+<div class="section" id="details">
+<h1><a name="details">Details</a></h1>
 <p>The regression run procedure will:</p>
 <p>The regression run procedure will:</p>
 <ul class="simple">
 <ul class="simple">
 <li>Download the most recent tarball from <a class="reference" href="http://www.meta-comm.com/engineering/boost/snapshot/">http://www.meta-comm.com/engineering/boost/snapshot/</a>,
 <li>Download the most recent tarball from <a class="reference" href="http://www.meta-comm.com/engineering/boost/snapshot/">http://www.meta-comm.com/engineering/boost/snapshot/</a>,
 unpack it in the subdirectory <tt class="docutils literal"><span class="pre">boost</span></tt>.</li>
 unpack it in the subdirectory <tt class="docutils literal"><span class="pre">boost</span></tt>.</li>
 <li>Build <tt class="docutils literal"><span class="pre">bjam</span></tt> and <tt class="docutils literal"><span class="pre">process_jam_log</span></tt> if needed. (<tt class="docutils literal"><span class="pre">process_jam_log</span></tt> is an
 <li>Build <tt class="docutils literal"><span class="pre">bjam</span></tt> and <tt class="docutils literal"><span class="pre">process_jam_log</span></tt> if needed. (<tt class="docutils literal"><span class="pre">process_jam_log</span></tt> is an
-utility, which extracts the test results from the log file produced by
+utility, which extracts the test results from the log file produced by 
 Boost.Build).</li>
 Boost.Build).</li>
 <li>Run regression tests, process and collect the results.</li>
 <li>Run regression tests, process and collect the results.</li>
 <li>Upload the results to <a class="reference" href="ftp://fx.meta-comm.com/boost-regression">ftp://fx.meta-comm.com/boost-regression</a>.</li>
 <li>Upload the results to <a class="reference" href="ftp://fx.meta-comm.com/boost-regression">ftp://fx.meta-comm.com/boost-regression</a>.</li>
 </ul>
 </ul>
-<p>The report merger process running continuously on MetaCommunications site will
-merge all submitted test runs and publish them at
+<p>The report merger process running continuously on MetaCommunications site will 
+merge all submitted test runs and publish them at 
 <a class="reference" href="http://boost.sourceforge.net/regression-logs/developer">http://boost.sourceforge.net/regression-logs/developer</a>.</p>
 <a class="reference" href="http://boost.sourceforge.net/regression-logs/developer">http://boost.sourceforge.net/regression-logs/developer</a>.</p>
 </div>
 </div>
-<div class="section">
-<h1><a id="advanced-use" name="advanced-use">Advanced use</a></h1>
-<div class="section">
-<h2><a id="providing-detailed-information-about-your-environment" name="providing-detailed-information-about-your-environment">Providing detailed information about your environment</a></h2>
+<div class="section" id="advanced-use">
+<h1><a name="advanced-use">Advanced use</a></h1>
+<div class="section" id="providing-detailed">
+<h2><a name="providing-detailed">Providing detailed information about your environment</a></h2>
 <p>Once you have your regression results displayed in the Boost-wide
 <p>Once you have your regression results displayed in the Boost-wide
 reports, you may consider providing a bit more information about
 reports, you may consider providing a bit more information about
 yourself and your test environment. This additional information will
 yourself and your test environment. This additional information will
@@ -372,52 +328,52 @@ and test schedule, by simply altering the file's content. Also, please
 consider providing your name and email address for cases where Boost
 consider providing your name and email address for cases where Boost
 developers have questions specific to your particular set of results.</p>
 developers have questions specific to your particular set of results.</p>
 </div>
 </div>
-<div class="section">
-<h2><a id="incremental-runs" name="incremental-runs">Incremental runs</a></h2>
-<p>You can run <tt class="docutils literal"><span class="pre">regression.py</span></tt> in incremental mode <a class="footnote-reference" href="#incremental" id="id5" name="id5">[4]</a> by simply passing
+<div class="section" id="incremental-runs">
+<h2><a name="incremental-runs">Incremental runs</a></h2>
+<p>You can run <tt class="docutils literal"><span class="pre">regression.py</span></tt> in incremental mode <a class="footnote-reference" href="#incremental" id="id5" name="id5">[4]</a> by simply passing 
 it an identically named command-line flag:</p>
 it an identically named command-line flag:</p>
 <pre class="literal-block">
 <pre class="literal-block">
 python regression.py ... <strong>--incremental</strong>
 python regression.py ... <strong>--incremental</strong>
 </pre>
 </pre>
 </div>
 </div>
-<div class="section">
-<h2><a id="dealing-with-misbehaved-tests-compilers" name="dealing-with-misbehaved-tests-compilers">Dealing with misbehaved tests/compilers</a></h2>
-<p>Depending on the environment/C++ runtime support library the test is compiled with,
+<div class="section" id="dealing-with-misbehaved">
+<h2><a name="dealing-with-misbehaved">Dealing with misbehaved tests/compilers</a></h2>
+<p>Depending on the environment/C++ runtime support library the test is compiled with, 
 a test failure/termination may cause an appearance of a dialog window, requiring
 a test failure/termination may cause an appearance of a dialog window, requiring
 human intervention to proceed. Moreover, the test (or even of the compiler itself)
 human intervention to proceed. Moreover, the test (or even of the compiler itself)
-can fall into infinite loop, or simply run for too long. To allow <tt class="docutils literal"><span class="pre">regression.py</span></tt>
-to take care of these obstacles, add the <tt class="docutils literal"><span class="pre">--monitored</span></tt> flag to the script
+can fall into infinite loop, or simply run for too long. To allow <tt class="docutils literal"><span class="pre">regression.py</span></tt> 
+to take care of these obstacles, add the <tt class="docutils literal"><span class="pre">--monitored</span></tt> flag to the script 
 invocation:</p>
 invocation:</p>
 <pre class="literal-block">
 <pre class="literal-block">
 python regression.py ... <strong>--monitored</strong>
 python regression.py ... <strong>--monitored</strong>
 </pre>
 </pre>
-<p>That's it. Knowing your intentions, the script will be able to automatically deal
+<p>That's it. Knowing your intentions, the script will be able to automatically deal 
 with the listed issues <a class="footnote-reference" href="#monitored" id="id6" name="id6">[5]</a>.</p>
 with the listed issues <a class="footnote-reference" href="#monitored" id="id6" name="id6">[5]</a>.</p>
 </div>
 </div>
-<div class="section">
-<h2><a id="getting-sources-from-cvs" name="getting-sources-from-cvs">Getting sources from CVS</a></h2>
+<div class="section" id="getting-sources-from-cvs">
+<h2><a name="getting-sources-from-cvs">Getting sources from CVS</a></h2>
 <p>If you already have a CVS client installed and configured, you might prefer to get
 <p>If you already have a CVS client installed and configured, you might prefer to get
-the sources directly from the Boost CVS repository. To communicate this to the
-script, you just need to pass it your SourceForge user ID using the <tt class="docutils literal"><span class="pre">--user</span></tt>
+the sources directly from the Boost CVS repository. To communicate this to the 
+script, you just need to pass it your SourceForge user ID using the <tt class="docutils literal"><span class="pre">--user</span></tt> 
 option; for instance:</p>
 option; for instance:</p>
 <pre class="literal-block">
 <pre class="literal-block">
 python regression.py ... <strong>--user=agurtovoy</strong>
 python regression.py ... <strong>--user=agurtovoy</strong>
 </pre>
 </pre>
-<p>You can also specify the user as <tt class="docutils literal"><span class="pre">anonymous</span></tt>, requesting anonymous CVS access.
-Note, though, that the files obtained this way tend to lag behind the actual CVS
-state by several hours, sometimes up to twelve. By contrast, the tarball the script
+<p>You can also specify the user as <tt class="docutils literal"><span class="pre">anonymous</span></tt>, requesting anonymous CVS access. 
+Note, though, that the files obtained this way tend to lag behind the actual CVS 
+state by several hours, sometimes up to twelve. By contrast, the tarball the script 
 downloads by default is at most one hour behind.</p>
 downloads by default is at most one hour behind.</p>
 </div>
 </div>
-<div class="section">
-<h2><a id="integration-with-a-custom-driver-script" name="integration-with-a-custom-driver-script">Integration with a custom driver script</a></h2>
-<p>Even if you've already been using a custom driver script, and for some
-reason you don't  want <tt class="docutils literal"><span class="pre">regression.py</span></tt> to take over of the entire test cycle,
+<div class="section" id="integration-with-a-custom">
+<h2><a name="integration-with-a-custom">Integration with a custom driver script</a></h2>
+<p>Even if you've already been using a custom driver script, and for some 
+reason you don't  want <tt class="docutils literal"><span class="pre">regression.py</span></tt> to take over of the entire test cycle, 
 getting your regression results into <a class="reference" href="http://www.boost.org/regression-logs/developer/">Boost-wide reports</a> is still easy!</p>
 getting your regression results into <a class="reference" href="http://www.boost.org/regression-logs/developer/">Boost-wide reports</a> is still easy!</p>
-<p>In fact, it's just a matter of modifying your script to perform two straightforward
+<p>In fact, it's just a matter of modifying your script to perform two straightforward 
 operations:</p>
 operations:</p>
 <ol class="arabic">
 <ol class="arabic">
 <li><p class="first"><em>Timestamp file creation</em> needs to be done before the CVS update/checkout.
 <li><p class="first"><em>Timestamp file creation</em> needs to be done before the CVS update/checkout.
-The file's location doesn't matter (nor does the content), as long as you know how
+The file's location doesn't matter (nor does the content), as long as you know how 
 to access it later. Making your script to do something as simple as
 to access it later. Making your script to do something as simple as
 <tt class="docutils literal"><span class="pre">echo</span> <span class="pre">&gt;timestamp</span></tt> would work just fine.</p>
 <tt class="docutils literal"><span class="pre">echo</span> <span class="pre">&gt;timestamp</span></tt> would work just fine.</p>
 </li>
 </li>
@@ -430,14 +386,14 @@ arguments:</p>
 <pre class="literal-block">
 <pre class="literal-block">
 --locate-root   directory to to scan for &quot;test_log.xml&quot; files
 --locate-root   directory to to scan for &quot;test_log.xml&quot; files
 --runner        runner ID (e.g. &quot;Metacomm&quot;)
 --runner        runner ID (e.g. &quot;Metacomm&quot;)
---timestamp     path to a file which modification time will be used
+--timestamp     path to a file which modification time will be used 
                 as a timestamp of the run (&quot;timestamp&quot; by default)
                 as a timestamp of the run (&quot;timestamp&quot; by default)
 </pre>
 </pre>
 <p>For example, assuming that the run's resulting  binaries are in the
 <p>For example, assuming that the run's resulting  binaries are in the
-<tt class="docutils literal"><span class="pre">$BOOST_ROOT/bin</span></tt> directory (the default Boost.Build setup), the
+<tt class="docutils literal"><span class="pre">$BOOST_ROOT/bin</span></tt> directory (the default Boost.Build setup), the 
 <tt class="docutils literal"><span class="pre">collect_and_upload_logs.py</span></tt> invocation might look like this:</p>
 <tt class="docutils literal"><span class="pre">collect_and_upload_logs.py</span></tt> invocation might look like this:</p>
 <pre class="literal-block">
 <pre class="literal-block">
-python $BOOST_ROOT/tools/regression/xsl_reports/runner/collect_and_upload_logs.py
+python $BOOST_ROOT/tools/regression/xsl_reports/runner/collect_and_upload_logs.py 
    --locate-root=$BOOST_ROOT/bin
    --locate-root=$BOOST_ROOT/bin
    --runner=Metacomm
    --runner=Metacomm
    --timestamp=timestamp
    --timestamp=timestamp
@@ -445,8 +401,8 @@ python $BOOST_ROOT/tools/regression/xsl_reports/runner/collect_and_upload_logs.p
 </li>
 </li>
 </ol>
 </ol>
 </div>
 </div>
-<div class="section">
-<h2><a id="patching-boost-sources" name="patching-boost-sources">Patching Boost sources</a></h2>
+<div class="section" id="patching-boost-sources">
+<h2><a name="patching-boost-sources">Patching Boost sources</a></h2>
 <p>You might encounter an occasional need to make local modifications to
 <p>You might encounter an occasional need to make local modifications to
 the Boost codebase before running the tests, without disturbing the
 the Boost codebase before running the tests, without disturbing the
 automatic nature of the regression process. To implement this under
 automatic nature of the regression process. To implement this under
@@ -461,18 +417,18 @@ script named <tt class="docutils literal"><span class="pre">patch_boost</span></
 and, if found, execute it after obtaining the Boost sources.</p>
 and, if found, execute it after obtaining the Boost sources.</p>
 </div>
 </div>
 </div>
 </div>
-<div class="section">
-<h1><a id="feedback" name="feedback">Feedback</a></h1>
-<p>Please send all comments/suggestions regarding this document and the testing procedure
+<div class="section" id="feedback">
+<h1><a name="feedback">Feedback</a></h1>
+<p>Please send all comments/suggestions regarding this document and the testing procedure 
 itself to the <a class="reference" href="http://lists.boost.org/mailman/listinfo.cgi/boost-testing">Boost Testing list</a>.</p>
 itself to the <a class="reference" href="http://lists.boost.org/mailman/listinfo.cgi/boost-testing">Boost Testing list</a>.</p>
 </div>
 </div>
-<div class="section">
-<h1><a id="notes" name="notes">Notes</a></h1>
+<div class="section" id="notes">
+<h1><a name="notes">Notes</a></h1>
 <table class="docutils footnote" frame="void" id="runnerid1" rules="none">
 <table class="docutils footnote" frame="void" id="runnerid1" rules="none">
 <colgroup><col class="label" /><col /></colgroup>
 <colgroup><col class="label" /><col /></colgroup>
 <tbody valign="top">
 <tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id2" name="runnerid1">[1]</a></td><td>If you are running regressions interlacingly with a different
-set of compilers (e.g. for Intel in the morning and GCC at the end of the day), you need
+<tr><td class="label"><a class="fn-backref" href="#id2" name="runnerid1">[1]</a></td><td>If you are running regressions interlacingly with a different 
+set of compilers (e.g. for Intel in the morning and GCC at the end of the day), you need 
 to provide a <em>different</em> runner id for each of these runs, e.g. <tt class="docutils literal"><span class="pre">your_name-intel</span></tt>, and
 to provide a <em>different</em> runner id for each of these runs, e.g. <tt class="docutils literal"><span class="pre">your_name-intel</span></tt>, and
 <tt class="docutils literal"><span class="pre">your_name-gcc</span></tt>.</td></tr>
 <tt class="docutils literal"><span class="pre">your_name-gcc</span></tt>.</td></tr>
 </tbody>
 </tbody>
@@ -481,32 +437,32 @@ to provide a <em>different</em> runner id for each of these runs, e.g. <tt class
 <colgroup><col class="label" /><col /></colgroup>
 <colgroup><col class="label" /><col /></colgroup>
 <tbody valign="top">
 <tbody valign="top">
 <tr><td class="label"><a class="fn-backref" href="#id3" name="runnerid2">[2]</a></td><td>The limitations of the reports' format/medium impose a direct dependency
 <tr><td class="label"><a class="fn-backref" href="#id3" name="runnerid2">[2]</a></td><td>The limitations of the reports' format/medium impose a direct dependency
-between the number of compilers you are testing with and the amount of space available
-for your runner id. If you are running regressions for a single compiler, please make
+between the number of compilers you are testing with and the amount of space available 
+for your runner id. If you are running regressions for a single compiler, please make 
 sure to choose a short enough id that does not significantly disturb the reports' layout.</td></tr>
 sure to choose a short enough id that does not significantly disturb the reports' layout.</td></tr>
 </tbody>
 </tbody>
 </table>
 </table>
 <table class="docutils footnote" frame="void" id="toolsets" rules="none">
 <table class="docutils footnote" frame="void" id="toolsets" rules="none">
 <colgroup><col class="label" /><col /></colgroup>
 <colgroup><col class="label" /><col /></colgroup>
 <tbody valign="top">
 <tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id4" name="toolsets">[3]</a></td><td>If <tt class="docutils literal"><span class="pre">--toolsets</span></tt> option is not provided, the script will try to use the
+<tr><td class="label"><a class="fn-backref" href="#id4" name="toolsets">[3]</a></td><td>If <tt class="docutils literal"><span class="pre">--toolsets</span></tt> option is not provided, the script will try to use the 
 platform's default toolset (<tt class="docutils literal"><span class="pre">gcc</span></tt> for most Unix-based systems).</td></tr>
 platform's default toolset (<tt class="docutils literal"><span class="pre">gcc</span></tt> for most Unix-based systems).</td></tr>
 </tbody>
 </tbody>
 </table>
 </table>
 <table class="docutils footnote" frame="void" id="incremental" rules="none">
 <table class="docutils footnote" frame="void" id="incremental" rules="none">
 <colgroup><col class="label" /><col /></colgroup>
 <colgroup><col class="label" /><col /></colgroup>
 <tbody valign="top">
 <tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id5" name="incremental">[4]</a></td><td><p class="first">By default, the script runs in what is known as <em>full mode</em>: on
-each <tt class="docutils literal"><span class="pre">regression.py</span></tt> invocation all the files that were left in place by the
-previous run -- including the binaries for the successfully built tests and libraries
--- are deleted, and everything is rebuilt once again from scratch. By contrast, in
-<em>incremental mode</em> the already existing binaries are left intact, and only the
-tests and libraries which source files has changed since the previous run are
+<tr><td class="label"><a class="fn-backref" href="#id5" name="incremental">[4]</a></td><td><p class="first">By default, the script runs in what is known as <em>full mode</em>: on 
+each <tt class="docutils literal"><span class="pre">regression.py</span></tt> invocation all the files that were left in place by the 
+previous run -- including the binaries for the successfully built tests and libraries 
+-- are deleted, and everything is rebuilt once again from scratch. By contrast, in 
+<em>incremental mode</em> the already existing binaries are left intact, and only the 
+tests and libraries which source files has changed since the previous run are 
 re-built and re-tested.</p>
 re-built and re-tested.</p>
-<p>The main advantage of incremental runs is a significantly shorter turnaround time,
+<p>The main advantage of incremental runs is a significantly shorter turnaround time, 
 but unfortunately they don't always produce reliable results. Some type of changes
 but unfortunately they don't always produce reliable results. Some type of changes
 to the codebase (changes to the bjam testing subsystem in particular)
 to the codebase (changes to the bjam testing subsystem in particular)
-often require switching to a full mode for one cycle in order to produce
+often require switching to a full mode for one cycle in order to produce 
 trustworthy reports.</p>
 trustworthy reports.</p>
 <p class="last">As a general guideline, if you can afford it, testing in full mode is preferable.</p>
 <p class="last">As a general guideline, if you can afford it, testing in full mode is preferable.</p>
 </td></tr>
 </td></tr>
@@ -515,11 +471,16 @@ trustworthy reports.</p>
 <table class="docutils footnote" frame="void" id="monitored" rules="none">
 <table class="docutils footnote" frame="void" id="monitored" rules="none">
 <colgroup><col class="label" /><col /></colgroup>
 <colgroup><col class="label" /><col /></colgroup>
 <tbody valign="top">
 <tbody valign="top">
-<tr><td class="label"><a class="fn-backref" href="#id6" name="monitored">[5]</a></td><td>Note that at the moment this functionality is available only if you
+<tr><td class="label"><a class="fn-backref" href="#id6" name="monitored">[5]</a></td><td>Note that at the moment this functionality is available only if you 
 are running on a Windows platform. Contributions are welcome!</td></tr>
 are running on a Windows platform. Contributions are welcome!</td></tr>
 </tbody>
 </tbody>
 </table>
 </table>
 </div>
 </div>
 </div>
 </div>
+<hr class="docutils footer" />
+<div class="footer">
+Generated on: 2007-02-20 10:21 UTC.
+Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
+</div>
 </body>
 </body>
 </html>
 </html>

+ 64 - 9
tools/regression/xsl_reports/runner/regression.py

@@ -25,6 +25,8 @@ regression_root    = os.path.abspath( os.path.dirname( sys.argv[0] ) )
 regression_results = os.path.join( regression_root, 'results' )
 regression_results = os.path.join( regression_root, 'results' )
 regression_log     = os.path.join( regression_results, 'bjam.log' )
 regression_log     = os.path.join( regression_results, 'bjam.log' )
 install_log        = os.path.join( regression_results, 'bjam_install.log' )
 install_log        = os.path.join( regression_results, 'bjam_install.log' )
+boostbook_log      = os.path.join( regression_results, 'boostbook.log' )
+boostbook_archive_name = os.path.join( regression_results, 'boostbook.zip' )
 
 
 boost_root      = os.path.join( regression_root, 'boost' )
 boost_root      = os.path.join( regression_root, 'boost' )
 xsl_reports_dir = os.path.join( boost_root, 'tools', 'regression', 'xsl_reports' )
 xsl_reports_dir = os.path.join( boost_root, 'tools', 'regression', 'xsl_reports' )
@@ -442,6 +444,7 @@ def download_if_needed( tool_name, tool_url, proxy ):
 def setup(
 def setup(
           comment
           comment
         , toolsets
         , toolsets
+        , book
         , bjam_toolset
         , bjam_toolset
         , pjl_toolset
         , pjl_toolset
         , monitored
         , monitored
@@ -466,10 +469,9 @@ def setup(
             download_if_needed( 'build_monitor.exe', build_monitor_url, proxy )
             download_if_needed( 'build_monitor.exe', build_monitor_url, proxy )
             download_if_needed( 'pskill.exe', pskill_url, proxy )
             download_if_needed( 'pskill.exe', pskill_url, proxy )
         else:
         else:
-            log( 'Warning: Test monitoring is not supported on this platform (yet).' )
+            log( 'Warning: Test monitoring is not supported on this platform (yet).'     )
             log( '         Please consider contributing this piece!' )
             log( '         Please consider contributing this piece!' )
 
 
-
 def bjam_build_script_cmd( cmd ):
 def bjam_build_script_cmd( cmd ):
     env_setup_key = 'BJAM_ENVIRONMENT_SETUP'
     env_setup_key = 'BJAM_ENVIRONMENT_SETUP'
     if os.environ.has_key( env_setup_key ):
     if os.environ.has_key( env_setup_key ):
@@ -602,6 +604,23 @@ def test(
         if monitored:
         if monitored:
             stop_build_monitor()
             stop_build_monitor()
 
 
+def build_book( **kargs ):
+    # To do
+    # 1. PDF generation
+    # 2. Do we need to cleanup before the build?
+    # 3. Incremental builds
+    if not os.path.exists( regression_results ):
+        os.makedirs( regression_results )
+    import_utils()
+    cwd = os.getcwd()
+    try:
+        os.chdir( os.path.join( boost_root, 'doc' ) )
+        if os.path.exists( boostbook_log ):
+            os.unlink( boostbook_log )
+        utils.system( [ '%s --v2 html >>%s 2>&1' % ( tool_path( bjam, v2=True ), boostbook_log ) ] )
+        # utils.system( [ '%s --v2 pdf >>%s 2>&1' % ( tool_path( bjam, v2=True ), boostbook_log ) ] )
+    finally:
+        os.chdir( cwd )
 
 
 def collect_logs(
 def collect_logs(
           tag
           tag
@@ -650,7 +669,22 @@ def collect_logs(
         , run_type
         , run_type
         )
         )
 
 
-
+def collect_book( **unused ):
+    log( 'Collecting files for BoostBook into "%s"...' % boostbook_archive_name )
+    import zipfile
+    boostbook_archive = zipfile.ZipFile( boostbook_archive_name, 'w', zipfile.ZIP_DEFLATED )
+    html_root = os.path.join( boost_root, 'doc/html' )
+
+    boostbook_archive.writestr( 'timestamp', timestamp())
+    boostbook_archive.write( boostbook_log, os.path.basename( boostbook_log ) )
+    
+    def add_files( arg, dirname, names ):
+        for name in names:
+            path = os.path.join( dirname, name )
+            if not os.path.isdir( path ):
+                boostbook_archive.write( path, path[ len(html_root) + 1: ] )
+    os.path.walk( html_root, add_files, None ) 
+    
 def upload_logs(
 def upload_logs(
           tag
           tag
         , runner
         , runner
@@ -667,7 +701,11 @@ def upload_logs(
         , ( regression_results, runner, tag, user, ftp_proxy, debug_level, send_bjam_log, timestamp_path )
         , ( regression_results, runner, tag, user, ftp_proxy, debug_level, send_bjam_log, timestamp_path )
         )
         )
 
 
-
+def upload_book( tag, runner, ftp_proxy, debug_level, **unused ):
+    import_utils()
+    from runner import upload_to_ftp
+    upload_to_ftp( tag, boostbook_archive_name, ftp_proxy, debug_level )
+    
 def update_itself( tag, **unused ):
 def update_itself( tag, **unused ):
     source = os.path.join( xsl_reports_dir, 'runner', os.path.basename( sys.argv[0] ) )
     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] ) )
     self = os.path.join( regression_root, os.path.basename( sys.argv[0] ) )
@@ -716,6 +754,7 @@ def regression(
         , user
         , user
         , comment
         , comment
         , toolsets
         , toolsets
+        , book
         , bjam_options
         , bjam_options
         , bjam_toolset
         , bjam_toolset
         , pjl_toolset
         , pjl_toolset
@@ -761,11 +800,21 @@ def regression(
                 cleanup( [] )
                 cleanup( [] )
                 get_source( user, tag, proxy, [] )
                 get_source( user, tag, proxy, [] )
 
 
-        setup( comment, toolsets, bjam_toolset, pjl_toolset, monitored, proxy,
+        setup( comment, toolsets, book, bjam_toolset, pjl_toolset, monitored, proxy,
                v2, [] )
                v2, [] )
-        test( toolsets, bjam_options, monitored, timeout, v2, [] )
-        collect_logs( tag, runner, platform, user, comment, incremental, [] )
-        upload_logs( tag, runner, user, ftp_proxy, debug_level, send_bjam_log )
+        # Not specifying --toolset in command line is not enough
+        # that would mean to use Boost.Build default ones
+        # We can skip test only we were explictly 
+        # told to have no toolsets in command line "--toolset="
+        if  toolsets != '': # --toolset=,
+            test( toolsets, bjam_options, monitored, timeout, v2, [] )
+            collect_logs( tag, runner, platform, user, comment, incremental, [] )
+            upload_logs( tag, runner, user, ftp_proxy, debug_level, send_bjam_log )
+        if book:
+            build_book()    
+            collect_book()
+            upload_book( tag, runner, ftp_proxy, debug_level )
+
         update_itself( tag )
         update_itself( tag )
 
 
         if mail:
         if mail:
@@ -811,6 +860,7 @@ def accept_args( args ):
         , 'user='
         , 'user='
         , 'comment='
         , 'comment='
         , 'toolsets='
         , 'toolsets='
+        , 'book'
         , 'bjam-options='
         , 'bjam-options='
         , 'bjam-toolset='
         , 'bjam-toolset='
         , 'pjl-toolset='
         , 'pjl-toolset='
@@ -836,6 +886,7 @@ def accept_args( args ):
         , '--user'          : None
         , '--user'          : None
         , '--comment'       : None
         , '--comment'       : None
         , '--toolsets'      : None
         , '--toolsets'      : None
+        , '--book'          : False
         , '--bjam-options'  : ''
         , '--bjam-options'  : ''
         , '--bjam-toolset'  : None
         , '--bjam-toolset'  : None
         , '--pjl-toolset'   : None
         , '--pjl-toolset'   : None
@@ -862,6 +913,7 @@ def accept_args( args ):
         , 'user'            : options[ '--user' ]
         , 'user'            : options[ '--user' ]
         , 'comment'         : options[ '--comment' ]
         , 'comment'         : options[ '--comment' ]
         , 'toolsets'        : options[ '--toolsets' ]
         , 'toolsets'        : options[ '--toolsets' ]
+        , 'book'            : options.has_key( '--book' )
         , 'bjam_options'    : options[ '--bjam-options' ]
         , 'bjam_options'    : options[ '--bjam-options' ]
         , 'bjam_toolset'    : options[ '--bjam-toolset' ]
         , 'bjam_toolset'    : options[ '--bjam-toolset' ]
         , 'pjl_toolset'     : options[ '--pjl-toolset' ]
         , 'pjl_toolset'     : options[ '--pjl-toolset' ]
@@ -879,7 +931,6 @@ def accept_args( args ):
         , 'args'            : other_args
         , 'args'            : other_args
         }
         }
 
 
-
 commands = {
 commands = {
       'cleanup'         : cleanup
       'cleanup'         : cleanup
     , 'get-source'      : get_source
     , 'get-source'      : get_source
@@ -887,8 +938,11 @@ commands = {
     , 'setup'           : setup
     , 'setup'           : setup
     , 'install'         : install
     , 'install'         : install
     , 'test'            : test
     , 'test'            : test
+    , 'build-book'      : build_book
     , 'collect-logs'    : collect_logs
     , 'collect-logs'    : collect_logs
+    , 'collect-book'    : collect_book
     , 'upload-logs'     : upload_logs
     , 'upload-logs'     : upload_logs
+    , 'upload-book'     : upload_book
     , 'update-itself'   : update_itself
     , 'update-itself'   : update_itself
     , 'regression'      : regression
     , 'regression'      : regression
     , 'show-revision'   : show_revision
     , 'show-revision'   : show_revision
@@ -917,6 +971,7 @@ Options:
 \t                default)
 \t                default)
 \t--user          SourceForge user name for a shell/CVS account (optional)
 \t--user          SourceForge user name for a shell/CVS account (optional)
 \t--toolsets      comma-separated list of toolsets to test with (optional)
 \t--toolsets      comma-separated list of toolsets to test with (optional)
+\t--book          build BoostBook (optional)
 \t--bjam-options  options to pass to the regression test (optional)
 \t--bjam-options  options to pass to the regression test (optional)
 \t--bjam-toolset  bootstrap toolset for 'bjam' executable (optional)
 \t--bjam-toolset  bootstrap toolset for 'bjam' executable (optional)
 \t--pjl-toolset   bootstrap toolset for 'process_jam_log' executable
 \t--pjl-toolset   bootstrap toolset for 'process_jam_log' executable

+ 21 - 18
tools/regression/xsl_reports/test/common.py

@@ -45,10 +45,9 @@ def make_test_log( xml_generator
     toolset_name = make_toolset_name( toolset_idx )
     toolset_name = make_toolset_name( toolset_idx )
     
     
     target_directory = ""
     target_directory = ""
-
-    if test_type == "run":
+    if test_type != "lib":
         target_directory = make_test_target_directory( library_idx, toolset_idx, test_name, variant )
         target_directory = make_test_target_directory( library_idx, toolset_idx, test_name, variant )
-    if test_type == "lib":
+    else:
         target_directory = make_library_target_directory( library_idx, toolset_idx, variant )
         target_directory = make_library_target_directory( library_idx, toolset_idx, variant )
         
         
     xml_generator.startElement( "test-log", { "library": library
     xml_generator.startElement( "test-log", { "library": library
@@ -59,25 +58,29 @@ def make_test_log( xml_generator
                                   , "target-directory": target_directory
                                   , "target-directory": target_directory
                                   , "show-run-output": show_run_output
                                   , "show-run-output": show_run_output
                                   } )
                                   } )
-    if test_type ==  "run":
-        xml_generator.startElement( "compile", { "result": "success" } );
-        xml_generator.characters( "Compiling in %s" % target_directory )
-        xml_generator.endElement( "compile" )
 
 
-        
-        xml_generator.startElement( "lib", { "result": test_result } );
-        xml_generator.characters( make_library_target_directory( library_idx, toolset_idx ) )
-        xml_generator.endElement( "lib" )
+    if test_type != "lib":
 
 
-        xml_generator.startElement( "link", { "result": "success" } );
-        xml_generator.characters( "Linking in %s" % target_directory )
-        xml_generator.endElement( "link" )
+        if test_result == "success" and ( toolset_idx + 1 ) % 4:
+            xml_generator.startElement( "compile", { "result": "success" } );
+            xml_generator.characters( "Compiling in %s" % target_directory )
+            xml_generator.endElement( "compile" )
 
 
-        xml_generator.startElement( "run", { "result": test_result } );
-        xml_generator.characters( "Running in %s" % target_directory )
-        xml_generator.endElement( "run" )
+        if test_type.find( "link" ) == 0 or test_type.find( "run" ) == 0 and toolset_idx % 4:
+            xml_generator.startElement( "lib", { "result": test_result } );
+            xml_generator.characters( make_library_target_directory( library_idx, toolset_idx ) )
+            xml_generator.endElement( "lib" )
 
 
-    if test_type ==  "lib":
+            xml_generator.startElement( "link", { "result": "success" } );
+            xml_generator.characters( "Linking in %s" % target_directory )
+            xml_generator.endElement( "link" )
+
+        if test_type.find( "run" ) == 0 and ( toolset_idx + 2 ) % 4:
+            xml_generator.startElement( "run", { "result": test_result } );
+            xml_generator.characters( "Running in %s" % target_directory )
+            xml_generator.endElement( "run" )
+
+    else:
         xml_generator.startElement( "compile", { "result": test_result } );
         xml_generator.startElement( "compile", { "result": test_result } );
         xml_generator.characters( "Compiling in %s" % make_library_target_directory( library_idx, toolset_idx ) )
         xml_generator.characters( "Compiling in %s" % make_library_target_directory( library_idx, toolset_idx ) )
         xml_generator.endElement( "compile" )
         xml_generator.endElement( "compile" )

+ 43 - 10
tools/regression/xsl_reports/xsl/v2/add_expected_results.xsl

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <!--
 <!--
 
 
-Copyright MetaCommunications, Inc. 2003-2006.
+Copyright MetaCommunications, Inc. 2003-2007.
 
 
 Distributed under the Boost Software License, Version 1.0. (See
 Distributed under the Boost Software License, Version 1.0. (See
 accompanying file LICENSE_1_0.txt or copy at
 accompanying file LICENSE_1_0.txt or copy at
@@ -11,8 +11,10 @@ http://www.boost.org/LICENSE_1_0.txt)
 
 
 <xsl:stylesheet 
 <xsl:stylesheet 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
     xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+    xmlns:func="http://exslt.org/functions"
     xmlns:meta="http://www.meta-comm.com"
     xmlns:meta="http://www.meta-comm.com"
-    exclude-result-prefixes="meta"
+    extension-element-prefixes="func"
+    exclude-result-prefixes="func meta"
     version="1.0">
     version="1.0">
 
 
     <xsl:import href="common.xsl"/>
     <xsl:import href="common.xsl"/>
@@ -23,6 +25,29 @@ http://www.boost.org/LICENSE_1_0.txt)
     <xsl:param name="failures_markup_file"/>
     <xsl:param name="failures_markup_file"/>
     <xsl:variable name="expected_results" select="document( $expected_results_file )" />
     <xsl:variable name="expected_results" select="document( $expected_results_file )" />
 
 
+    <func:function name="meta:is_test_log_complete">
+        <xsl:param name="test_log"/>
+        <xsl:variable name="type" select="$test_log/@test-type"/>
+        <func:result>
+            <xsl:choose>
+                <xsl:when test="$type='compile' or $type='compile_fail'  or $test_log/compile/@result='fail' ">
+                    <xsl:value-of select="count( $test_log/compile ) = 1 and count( $test_log/link) = 0 and count( $test_log/run) = 0"/>
+                </xsl:when>
+                <xsl:when test="$type='link' or $type='link_fail' or $type='' or $type='lib' or $test_log/link/@result='fail'">
+                    <xsl:value-of select="count( $test_log/compile) = 1  and count( $test_log/link) = 1 and count( $test_log/run) = 0"/></xsl:when>
+                <xsl:when test="$type='run' or $type='run_fail' or $type='run_pyd'">
+                    <xsl:value-of select="count( $test_log/compile) = 1  and count( $test_log/link)  = 1 and count($test_log/run) = 1 "/>
+                </xsl:when>
+                <xsl:otherwise> 
+                    <xsl:message terminate="yes">
+                        Unknown test type "<xsl:value-of select="$type"/>"
+                    </xsl:message>
+                </xsl:otherwise>
+            </xsl:choose>
+        </func:result>            
+    </func:function>
+
+
     <xsl:key name = "trk" match = "test-result" use = "concat( ../../@name, '-', ../@name, '-', @test-name )" />
     <xsl:key name = "trk" match = "test-result" use = "concat( ../../@name, '-', ../@name, '-', @test-name )" />
     <xsl:key name = "tak" match = "toolset-alias" use = "@name" />
     <xsl:key name = "tak" match = "toolset-alias" use = "@name" />
 
 
@@ -37,23 +62,21 @@ http://www.boost.org/LICENSE_1_0.txt)
         <xsl:variable name="test-name" select="@test-name"/>
         <xsl:variable name="test-name" select="@test-name"/>
         <xsl:variable name="toolset" select="@toolset"/>
         <xsl:variable name="toolset" select="@toolset"/>
 
 
+        <xsl:variable name="is_complete" select="meta:is_test_log_complete( $test_log )"/>
+
         <xsl:element name="{local-name()}">
         <xsl:element name="{local-name()}">
             <xsl:apply-templates select="@*"/>
             <xsl:apply-templates select="@*"/>
 
 
-
+            <xsl:variable name="has_failures" select="./*/@result = 'fail'"/>
             <xsl:variable name="actual_result">
             <xsl:variable name="actual_result">
                 <xsl:choose>
                 <xsl:choose>
-                    <!-- Hack: needs to be researched (and removed). See M.Wille's incident. -->
-                    <xsl:when test="run/@result='succeed' and lib/@result='fail'">
-                        <xsl:text>success</xsl:text>
-                    </xsl:when>
-                    <xsl:when test="./*/@result = 'fail'" >
+                    <xsl:when test="$has_failures or not( $is_complete )" >
                         <xsl:text>fail</xsl:text>
                         <xsl:text>fail</xsl:text>
                     </xsl:when>
                     </xsl:when>
                     <xsl:otherwise>
                     <xsl:otherwise>
                         <xsl:text>success</xsl:text>
                         <xsl:text>success</xsl:text>
                     </xsl:otherwise>
                     </xsl:otherwise>
-                </xsl:choose>                     
+                </xsl:choose>
             </xsl:variable>
             </xsl:variable>
             
             
             <!-- 
             <!-- 
@@ -206,9 +229,19 @@ http://www.boost.org/LICENSE_1_0.txt)
                             </xsl:otherwise>
                             </xsl:otherwise>
                         </xsl:choose>
                         </xsl:choose>
                     </xsl:if>
                     </xsl:if>
+
+                    <xsl:if test="not( $is_complete ) and not( $has_failures )">
+                        <note>
+                            <span class="internal-error-note">
+                                <b>[Reporting Tools Internal Error]</b> This test case's XML is missing one or more log entries
+                                of the regression run's steps associated with the test case's type ("<xsl:value-of select="$test_log/@test-type"/>").
+                                Please <a href="mailto:mailto:boost-testing@lists.boost.org">contact reporting tools 
+                                maintainers</a> about this problem.
+                            </span>
+                        </note>
+                    </xsl:if>
                 </xsl:variable>
                 </xsl:variable>
                 
                 
-                
                 <xsl:attribute name="result"><xsl:value-of select="$actual_result"/></xsl:attribute>
                 <xsl:attribute name="result"><xsl:value-of select="$actual_result"/></xsl:attribute>
                 <xsl:attribute name="expected-result"><xsl:value-of select="$expected_result"/></xsl:attribute>
                 <xsl:attribute name="expected-result"><xsl:value-of select="$expected_result"/></xsl:attribute>
                 <xsl:attribute name="expected-reason"><xsl:value-of select="$expected_reason"/></xsl:attribute>
                 <xsl:attribute name="expected-reason"><xsl:value-of select="$expected_reason"/></xsl:attribute>

+ 42 - 0
tools/regression/xsl_reports/xsl/v2/boostbook_log.xsl

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+
+Copyright MetaCommunications, Inc. 2003-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)
+
+-->
+<xsl:stylesheet 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+    xmlns:func="http://exslt.org/functions"
+    xmlns:meta="http://www.meta-comm.com"
+    extension-element-prefixes="func"
+    exclude-result-prefixes="func meta"
+    version="1.0">
+
+<xsl:output method="html" encoding="UTF-8"/>
+<xsl:template match="/">
+    <html>
+        <head>
+            <title>BoostBook build log for <xsl:value-of select="build/@timestamp"/></title>
+            <style>
+                span.failure { background-color: red; }
+            </style>
+        </head>
+        <body>
+            <xsl:apply-templates/>
+        </body>
+    </html>
+</xsl:template>
+    <xsl:template match="build">
+        <pre>
+            <xsl:apply-templates/>
+        </pre>
+    </xsl:template>
+    
+    <xsl:template match="line">
+        <span class="{@type}"><xsl:value-of select="text()"/></span><br/>
+    </xsl:template>
+</xsl:stylesheet>

+ 1 - 1
tools/regression/xsl_reports/xsl/v2/common.xsl

@@ -108,8 +108,8 @@ http://www.boost.org/LICENSE_1_0.txt)
 
 
 
 
     <func:function name="meta:test_case_status">
     <func:function name="meta:test_case_status">
+        <xsl:param name="explicit_markup"/>
         <xsl:param name="test_log"/>
         <xsl:param name="test_log"/>
-        <xsl:param name="$explicit_markup"/>
 
 
         <xsl:variable name="status">
         <xsl:variable name="status">
             <xsl:choose> 
             <xsl:choose> 

+ 10 - 0
tools/regression/xsl_reports/xsl/v2/html/master.css

@@ -568,6 +568,11 @@ span.auto-note
     font-style: italic;
     font-style: italic;
 }
 }
 
 
+span.internal-error-note
+{
+    color: red;
+}
+
 /* Log */
 /* Log */
 
 
 div.log-test-title
 div.log-test-title
@@ -609,6 +614,11 @@ div.log-run-output-title
   font-weight: bold;
   font-weight: bold;
 }
 }
 
 
+span.output-fail
+{
+  color: red;
+}
+
 
 
 /* Issues page */
 /* Issues page */
 
 

+ 4 - 4
tools/regression/xsl_reports/xsl/v2/links_page.xsl

@@ -312,21 +312,21 @@ http://www.boost.org/LICENSE_1_0.txt)
                     
                     
                     <xsl:if test="compile">
                     <xsl:if test="compile">
                         <p>
                         <p>
-                            <div class="log-compiler-output-title">Compiler output [<xsl:value-of select="compile/@timestamp"/>]:</div>
+                            <div class="log-compiler-output-title">Compile [<xsl:value-of select="compile/@timestamp"/>]: <span class="output-{compile/@result}"><xsl:value-of select="compile/@result"/></span></div>
                             <pre><xsl:copy-of select="compile/node()"/></pre>
                             <pre><xsl:copy-of select="compile/node()"/></pre>
                         </p>
                         </p>
                     </xsl:if>
                     </xsl:if>
                 
                 
                     <xsl:if test="link">
                     <xsl:if test="link">
                         <p>
                         <p>
-                            <div class="log-linker-output-title">Linker output [<xsl:value-of select="link/@timestamp"/>]:</div>
+                            <div class="log-linker-output-title">Link [<xsl:value-of select="link/@timestamp"/>]: <span class="output-{link/@result}"><xsl:value-of select="link/@result"/></span></div>
                             <pre><xsl:copy-of select="link/node()"/></pre>
                             <pre><xsl:copy-of select="link/node()"/></pre>
                         </p>
                         </p>
                     </xsl:if>
                     </xsl:if>
                             
                             
                     <xsl:if test="lib">
                     <xsl:if test="lib">
                         <p>
                         <p>
-                            <div class="log-linker-output-title">Lib output [<xsl:value-of select="lib/@timestamp"/>]:</div>
+                            <div class="log-linker-output-title">Lib [<xsl:value-of select="lib/@timestamp"/>]: <span class="output-{lib/@result}"><xsl:value-of select="lib/@result"/></span></div>
                             <p>
                             <p>
                                 See <a href="{meta:encode_path( concat( $runner_id, '-',  lib/node() )  ) }.html">
                                 See <a href="{meta:encode_path( concat( $runner_id, '-',  lib/node() )  ) }.html">
                                 <xsl:copy-of select="lib/node()"/>
                                 <xsl:copy-of select="lib/node()"/>
@@ -337,7 +337,7 @@ http://www.boost.org/LICENSE_1_0.txt)
                         
                         
                     <xsl:if test="run">
                     <xsl:if test="run">
                         <p>
                         <p>
-                            <div class="log-run-output-title">Run output [<xsl:value-of select="run/@timestamp"/>]:</div>
+                            <div class="log-run-output-title">Run [<xsl:value-of select="run/@timestamp"/>]: <span class="output-{run/@result}"><xsl:value-of select="run/@result"/></span></div>
                             <pre>
                             <pre>
                                 <xsl:copy-of select="run/node()"/>
                                 <xsl:copy-of select="run/node()"/>
                             </pre>
                             </pre>

+ 3 - 3
tools/regression/xsl_reports/xsl/v2/summary_page.xsl

@@ -147,11 +147,11 @@ http://www.boost.org/LICENSE_1_0.txt)
             </xsl:call-template>
             </xsl:call-template>
 
 
             <div class="statistics">
             <div class="statistics">
-            Unusable: <xsl:value-of select="count( $test_case_logs[ meta:test_case_status( . ) = 'unusable' ] )"/>
+            Unusable: <xsl:value-of select="count( $test_case_logs[ meta:test_case_status( $explicit_markup, . ) = 'unusable' ] )"/>
             &#160;|&#160;
             &#160;|&#160;
-            Regressions: <xsl:value-of select="count( $test_case_logs[ meta:test_case_status( . ) = 'fail-unexpected' ] )"/>
+            Regressions: <xsl:value-of select="count( $test_case_logs[ meta:test_case_status( $explicit_markup, . ) = 'fail-unexpected' ] )"/>
             &#160;|&#160;
             &#160;|&#160;
-            New failures: <xsl:value-of select="count( $test_case_logs[ meta:test_case_status( . ) = 'fail-unexpected-new' ] )"/>
+            New failures: <xsl:value-of select="count( $test_case_logs[ meta:test_case_status( $explicit_markup, . ) = 'fail-unexpected-new' ] )"/>
             </div>
             </div>
             
             
             <!-- summary table -->
             <!-- summary table -->

粤ICP备19079148号