Anonymous avatar Anonymous committed d919bd6

Merged revisions 1675-1736 via svnmerge from
http://scons.tigris.org/svn/scons/branches/core

........
r1689 | stevenknight | 2006-11-06 20:56:29 -0600 (Mon, 06 Nov 2006) | 1 line

0.96.D483 - Merge changes for 0.96.93 packaging from the subsidiary branch.
........
r1690 | stevenknight | 2006-11-06 20:59:30 -0600 (Mon, 06 Nov 2006) | 1 line

0.96.D484 - Update HOWTO for releases. Fix name type in src/CHANGES.txt.
........
r1691 | stevenknight | 2006-11-08 13:55:36 -0600 (Wed, 08 Nov 2006) | 1 line

0.96.D485 - Fix MergeFlags() handling of None values. (John Pye)
........
r1692 | stevenknight | 2006-11-08 17:15:05 -0600 (Wed, 08 Nov 2006) | 1 line

0.96.D486 - Directly execute commands on Windows when possible. (Jay Kint)
........
r1693 | stevenknight | 2006-11-08 18:54:49 -0600 (Wed, 08 Nov 2006) | 1 line

0.96.D487 - Remove the semi-colon from the list of characters that determine when we use cmd
........
r1694 | stevenknight | 2006-11-09 01:34:06 -0600 (Thu, 09 Nov 2006) | 1 line

0.96.D488 - Pick up latex/bibtex 'Rerun to get citations correct' messages. (Dmitry Mikhin)
........
r1695 | stevenknight | 2006-11-11 08:36:33 -0600 (Sat, 11 Nov 2006) | 1 line

0.96.D489 - Back out the direct-execution-on-Windows change until we solve a corner case.
........
r1696 | stevenknight | 2006-11-15 10:33:10 -0600 (Wed, 15 Nov 2006) | 1 line

0.96.D490 - Fix the sconsign script when the .sconsign.dblite file is specified with its suf
........
r1697 | stevenknight | 2006-11-18 10:45:50 -0600 (Sat, 18 Nov 2006) | 4 lines

Complete move of test/sconsign/script.py to underneath test/sconsign/script/.
(This got left out of the previous checkin due to an error in the
script that resubmits Aegis changes to Subversion.)
........
r1698 | stevenknight | 2006-11-18 11:05:26 -0600 (Sat, 18 Nov 2006) | 1 line

0.96.D491 - Allow an Options converter to take the construction environment as a parameter.
........
r1699 | stevenknight | 2006-11-30 15:34:37 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D492 - Reverse the order in which we try the arguments Options converters, first a sing
........
r1700 | stevenknight | 2006-11-30 16:03:09 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D493 - Speed up rel_path() by avoiding recomputation of intermediate directory relative
........
r1701 | stevenknight | 2006-11-30 16:14:16 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D494 - More efficient get_suffix(): compute it once when we set the name.
........
r1702 | stevenknight | 2006-11-30 16:22:55 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D495 - Fix missing XML end tags.
........
r1703 | stevenknight | 2006-11-30 17:15:25 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D496 - Turn Memoizer into a simple counter for --debug=memoizer, not something that doe
........
r1704 | stevenknight | 2006-11-30 20:30:50 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D497 - Add the scons-time script, with doc and tests.
........
r1705 | stevenknight | 2006-11-30 23:28:20 -0600 (Thu, 30 Nov 2006) | 1 line

0.96.D498 - Update the copyright years string.
........
r1706 | stevenknight | 2006-12-01 11:54:22 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D499 - Fix _do_Lookup => _doLookup value-caching misspellings. (Ben Leslie)
........
r1707 | stevenknight | 2006-12-01 12:03:46 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D500 - Fix copyright test against debian build. (Walter Franzini)
........
r1708 | stevenknight | 2006-12-01 14:23:29 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D501 - Add #include lines for test portability. (Gary Oberbrunner)
........
r1709 | stevenknight | 2006-12-01 14:51:12 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D502 - Fix tests under Python versions with no profiler (pstats module).
........
r1710 | stevenknight | 2006-12-01 20:04:49 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D503 - Remove unnecessary os.path.normpath() calls. (Gary Oberbrunner)
........
r1711 | stevenknight | 2006-12-01 20:34:31 -0600 (Fri, 01 Dec 2006) | 1 line

0.96.D504 - Accomodate arbitray white space after a SWIG %module keyword. (Anonymous)
........
r1712 | stevenknight | 2006-12-05 14:49:54 -0600 (Tue, 05 Dec 2006) | 1 line

0.96.D506 - Cache substitutions of of Builder source suffixes. Use a new PathList module, and a refactor Node.FS.Rfindalldirs() method, to cache calculations of values like CPPPATH.
........
r1713 | stevenknight | 2006-12-05 18:43:36 -0600 (Tue, 05 Dec 2006) | 1 line

0.96.D507 - Use cached stat() values in diskchecks.
........
r1714 | stevenknight | 2006-12-05 21:11:24 -0600 (Tue, 05 Dec 2006) | 1 line

0.96.D508 - Fix Memoizer hit counts for methods memoizing simple values. Clean up the code for memoizing return values in a dictionary. Fix comments.
........
r1715 | stevenknight | 2006-12-06 07:23:18 -0600 (Wed, 06 Dec 2006) | 1 line

0.96.D369 - More efficient Node.FS.Dir.current() check. Fix some Windows test portability issues.
........
r1716 | stevenknight | 2006-12-06 12:24:32 -0600 (Wed, 06 Dec 2006) | 2 lines

Undo previous checkin (distributed incorrect Aegis change number).
........
r1717 | stevenknight | 2006-12-06 12:34:53 -0600 (Wed, 06 Dec 2006) | 1 line

0.96.D505 - Update ae-{cvs,svn}-ci for newer versions of aetar, and to not truncate descriptions.
........
r1718 | stevenknight | 2006-12-07 23:01:41 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D509 - Only look for mslink on Windows systems. (Sohail Somani)
........
r1719 | stevenknight | 2006-12-07 23:18:33 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D510 - Have the D compiler Tool use the same logic for shared libraries, too. (Paolo Invernizzi)
........
r1720 | stevenknight | 2006-12-07 23:29:47 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D511 - Generalize a JobTests.py test so it doesn't assume a specific order in which the operating system executes the threads.
........
r1721 | stevenknight | 2006-12-07 23:39:37 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D512 - Back out the Tool/dmd.py change; it breaks shared library linking for other lanuages beside D in the construction environment.
........
r1722 | stevenknight | 2006-12-07 23:47:11 -0600 (Thu, 07 Dec 2006) | 1 line

0.96.D513 - Test fixes: Windows portability, handle changes to Python 2.5 messages.
........
r1723 | stevenknight | 2006-12-08 00:00:13 -0600 (Fri, 08 Dec 2006) | 1 line

0.96.D514 - Change how the 'as' Tool is imported to accomodate the Python 2.6 'as' keyword.
........
r1724 | stevenknight | 2006-12-08 11:19:27 -0600 (Fri, 08 Dec 2006) | 1 line

0.96.D515 - Cache both Node.FS.find_file() and Node.FS.Dri.srcdir_find_file().
........
r1725 | stevenknight | 2006-12-08 17:27:35 -0600 (Fri, 08 Dec 2006) | 1 line

0.96.D516 - Better error when we try to fetch contents from an Entry that doesn't exist. (Tom Parker)
........
r1726 | stevenknight | 2006-12-08 23:28:55 -0600 (Fri, 08 Dec 2006) | 1 line

0.96.D517 - Make sure we pick up the scons-local directory regardless of where we chdir internally.
........
r1727 | stevenknight | 2006-12-11 16:25:53 -0600 (Mon, 11 Dec 2006) | 1 line

0.96.D518 - Cache results of Executor.get_unignored_sources() and Executor.process_sources(). Eliminate some map() and disambiguate() calls when scanning for implicit dependencies.
........
r1728 | stevenknight | 2006-12-12 14:32:22 -0600 (Tue, 12 Dec 2006) | 1 line

0.96.D519 - Fix SideEffect() when -j is used.
........
r1729 | stevenknight | 2006-12-12 16:58:15 -0600 (Tue, 12 Dec 2006) | 1 line

0.96.D520 - Add a srcdir keyword to Builder calls.
........
r1730 | stevenknight | 2006-12-12 21:40:59 -0600 (Tue, 12 Dec 2006) | 1 line

0.96.D521 - TeX/LaTeX updates, including handling files in subdirectories. (Joel B. Mohler, Rob Managan, Dmitry Mikhin)
........
r1731 | stevenknight | 2006-12-14 15:01:02 -0600 (Thu, 14 Dec 2006) | 1 line

0.96.D522 - Propogate TypeErrors during variable substitution for display to the user.
........
r1732 | stevenknight | 2006-12-14 20:01:49 -0600 (Thu, 14 Dec 2006) | 1 line

0.96.D523 - Fix the os.path.join() calls in EnvironmentTests.py.
........
r1733 | stevenknight | 2006-12-15 07:48:22 -0600 (Fri, 15 Dec 2006) | 1 line

0.96.D524 - Fix source directories as dependencies of an Alias (0.96.93 problem found by LilyPond).
........
r1735 | stevenknight | 2006-12-15 12:43:45 -0600 (Fri, 15 Dec 2006) | 1 line

0.96.D525 - Allow printing Debug.caller() output (or other end-of-run debugging info) when using -h.
........
r1736 | stevenknight | 2006-12-15 16:30:08 -0600 (Fri, 15 Dec 2006) | 1 line

0.96.D526 - Add an option to debug IndexError and NameError exceptions during variable substitution.
........

Comments (0)

Files changed (181)

HOWTO/release.txt

 
 Things to do to release a new X.Y version of SCons:
 
-	Prepare the describe-the-release section for the announcements
+    Prepare the describe-the-release section for the announcements
 
-		summarize changes from src/CHANGES.txt
+        summarize changes from src/CHANGES.txt
 
-		template is below, search for "describe-the-release"
+        template is below, search for "describe-the-release"
 
-		send this out for review while you get the rest of the
-		release ready!
+        send this out for review while you get the rest of the
+        release ready!
 
-	Build and test candidate packages
+    Build and test candidate packages
 
-		test on Linux
+        test on Linux
 
-		test on Windows NT
+        test on Windows NT
 
-			1) tar zxf scons-src-{version}.tar.gz
-			   cd scons-src-{version}
-			   python runtest.py -a
+            1) tar zxf scons-src-{version}.tar.gz
+               cd scons-src-{version}
+               python runtest.py -a
 
-			2) tar zxf scons-{version}.tar.gz
-			   cd scons-{version}
-			   python setup.py install
-			   cd scons-src-{version}
-			   python runtest.py -a -X -x C:\Python20\scons.bat
+            2) tar zxf scons-{version}.tar.gz
+               cd scons-{version}
+               python setup.py install
+               cd scons-src-{version}
+               python runtest.py -a -X -x C:\Python20\scons.bat
 
-			3) scons-{verson}.win32.exe
-			   cd scons-src-{version}
-			   python runtest.py -a -X -x C:\Python20\scons.bat
+            3) scons-{verson}.win32.exe
+               cd scons-src-{version}
+               python runtest.py -a -X -x C:\Python20\scons.bat
 
-			4) mkdir temporary_directory
-			   cd temporary_directory
-			   tar zxf scons-local-{version}.tar.gz
-			   cd scons-src-{version}
-			   python runtest.py -a -x C:\temporary_directory\scons.py
+            4) mkdir temporary_directory
+               cd temporary_directory
+               tar zxf scons-local-{version}.tar.gz
+               cd scons-src-{version}
+               python runtest.py -a -x C:\temporary_directory\scons.py
 
-                Checkin any changes necessary to make everything work
+        Check in any changes necessary to make everything work
 
-	END THE CURRENT DEVELOPMENT BRANCH
+    END THE CURRENT DEVELOPMENT BRANCH
 
-		ae_p scons.0
+        ae_p scons.0
 
-		aede {96}
+        aede {96}
 
-		aerpass {96}
+        aerpass {96}
 
-		aeib {96}
+        aeib {96}
 
-		aed
+        aed
 
-		aeb
+        aeb
 
-		aet
+        aet
 
-		aet -reg
+        aet -reg
 
-		aeipass
+        aeipass
 
-	START THE NEW BRANCH FOR RELEASE
+    START THE NEW BRANCH FOR RELEASE
 
-		aenbr -p scons.0 {97}
+        aenbr -p scons.0 {97}
 
-		aenc -p scons.0.{97}
+        aenc -p scons.0.{97}
 
-                        Call it something like,
-                        "Initialize the new branch for release."
-                        Cause = internal_enhancement.
-                        Exempt it from all tests (*_exempt = true).
+            Call it something like,
+            "Initialize the new branch for release."
+            Cause = internal_enhancement.
+            Exempt it from all tests (*_exempt = true).
 
-		ae_p scons.0.{97}
+        ae_p scons.0.{97}
 
-		aedb 100
+        aedb 100
 
-		aecd
+        aecd
 
-		# Change the hard-coded package version numbers
-		# in the following files.
-		aecp README
-		vi README
+        # Change the hard-coded package version numbers
+        # in the following files.
+        aecp README
+        vi README
 
-                aecp SConstruct
-                vi SConstruct
+        aecp SConstruct
+        vi SConstruct
 
-                aecp rpm/scons.spec.in
-                vi rpm/scons.spec.in
+        aecp rpm/scons.spec.in
+        vi rpm/scons.spec.in
 
-                aecp QMTest/TestSCons.py
-                vi QMTest/TestSCons.py
+        aecp QMTest/TestSCons.py
+        vi QMTest/TestSCons.py
 
-                # Read through and update the README files if necessary
-		[optional] aecp README
-		[optional] vi README
+        # Read through and update the README files if necessary
+        [optional] aecp README
+        [optional] vi README
 
-		[optional] aecp src/README.txt
-		[optional] vi src/README.txt
+        [optional] aecp src/README.txt
+        [optional] vi src/README.txt
 
-                # Prepare src/CHANGES.txt
-		aecp src/CHANGES.txt
-		vi src/CHANGES.txt
+        # Prepare src/CHANGES.txt
+        aecp src/CHANGES.txt
+        vi src/CHANGES.txt
 
-		        date -R the latest release
+            date -R the latest release
 
-		        should be current if this has been updated
-                        as each change went in.
+            should be current if this has been updated
+            as each change went in.
 
-	        # Prepare src/RELEASE.txt
-                aecp src/RELEASE.txt
-                vi src/RELEASE.txt
+        # Prepare src/RELEASE.txt
+        aecp src/RELEASE.txt
+        vi src/RELEASE.txt
 
-		        date -R the latest release
+            date -R the latest release
 
-		        Read through and edit appropriately.
+            Read through and edit appropriately.
 
-		        Can probably keep most of the existing text
+            Can probably keep most of the existing text
 
-		        Add any new known problems
+            Add any new known problems
 
-	        # Prepare debian/changelog
-                aecp debian/changelog
-                vi debian/changelog
+        # Prepare debian/changelog
+        aecp debian/changelog
+        vi debian/changelog
 
-		        date -R the latest release
+            date -R the latest release
 
-                # Now build and prepare the release itself.
-                aeb
+        # Now build and prepare the release itself.
+        aeb
 
-		aed
+        aed
 
-		aet -reg
+        aet -reg
 
-		aede
+        aede
 
-		etc.
+        etc.
 
 
 
-	Read through the FAQ for any updates
+    Read through the FAQ for any updates
 
 
 
-	Upload the packages to the SourceForge incoming FTP:
+    Upload the packages to the SourceForge incoming FTP:
 
-		ftp upload.sourceforge.net
-		anonymous
-		<your email>
-		cd incoming
-		bin
-		put scons-0.{97}-1.noarch.rpm
-		put scons-0.{97}-1.src.rpm
-		put scons-0.{97}.tar.gz
-		put scons-0.{97}.win32.exe
-		put scons-0.{97}.zip
-		put scons-local-0.{97}.tar.gz
-		put scons-local-0.{97}.zip
-		put scons-src-0.{97}.tar.gz
-		put scons-src-0.{97}.zip
-		put scons_0.{97}-1_all.deb
+        ftp upload.sourceforge.net
+        anonymous
+        <your email>
+        cd incoming
+        bin
+        put scons-0.{97}-1.noarch.rpm
+        put scons-0.{97}-1.src.rpm
+        put scons-0.{97}.tar.gz
+        put scons-0.{97}.win32.exe
+        put scons-0.{97}.zip
+        put scons-local-0.{97}.tar.gz
+        put scons-local-0.{97}.zip
+        put scons-src-0.{97}.tar.gz
+        put scons-src-0.{97}.zip
+        put scons_0.{97}-1_all.deb
 
-	Create the new release at the SourceForge project page:
+    Create the new release at the SourceForge project page:
 
-		Go to the File Release page
+        Pull down the "Admin" menu and select "File Releases"
 
-		Package Name:  scons
+        Package Name:  scons
 
-		=> Add Release
+        => Add Release
 
-		New release name:  0.{97}
+        New release name:  0.{97}
 
-		Cut-and-paste or upload the RELEASE.txt file.
+        Upload the RELEASE.txt file.
 
-		Cut-and-paste or upload the CHANGES.txt file.
+        Upload the CHANGES.txt file.
 
-		(If you cut-and-paste, check the "Preserve my
-		pre-formatted text." box!)
+        Check the "Preserve my pre-formatted text." box  (IMPORTANT!)
 
-		Click "Submit/Refresh"  (IMPORTANT!)
+        Click "Submit/Refresh"  (IMPORTANT!)
 
-		Check the SCons files you uploaded
+        Check the SCons files you uploaded
 
-		Click "Add Files and/or Refresh View"
+        Click "Add Files and/or Refresh View"
 
-		Edit the file info:
+        Edit the file info:
 
-			scons-0.{97}-1.noarch.rpm	Any	.rpm
-			scons-0.{97}-1.src.rpm		Any	Source .rpm
-			scons-0.{97}.tar.gz		Any	.gz
-			scons-0.{97}.win32.exe		i386	.exe (32-bit Windows)
-			scons-0.{97}.zip		Any	.zip
-			scons_0.{97}-1_all.deb		Any	.deb
+            scons-0.{97}-1.noarch.rpm           Any     .rpm
+            scons-0.{97}-1.src.rpm              Any     Source .rpm
+            scons-0.{97}.tar.gz                 Any     .gz
+            scons-0.{97}.win32.exe              i386    .exe (32-bit Windows)
+            scons-0.{97}.zip                    Any     .zip
+            scons_0.{97}-1_all.deb              Any     .deb
 
-                Click "Update/Refresh" for each file; this must be done
-                one at a time.
+        Click "Update/Refresh" for each file; this must be done
+        one at a time.
 
-		Check "I'm sure." and click "Send Notice" in the Email
-		Release Notice section.
+        Check "I'm sure." and click "Send Notice" in the Email
+        Release Notice section.
 
 
-		Go to the File Release page
+        Pull down the "Admin" menu and select "File Releases"
 
-		Package Name:  scons-local
+        Package Name:  scons-local
 
-		=> Add Release
+        => Add Release
 
-		New release name:  0.{97}
+        New release name:  0.{97}
 
-		Cut-and-paste or upload the RELEASE.txt file.
+        Upload the RELEASE.txt file.
 
-		Cut-and-paste or upload the CHANGES.txt file.
+        Upload the CHANGES.txt file.
 
-		(If you cut-and-paste, check the "Preserve my
-		pre-formatted text." box!)
+        Check the "Preserve my pre-formatted text." box  (IMPORTANT!)
 
-		Click "Submit/Refresh"  (IMPORTANT!)
+        Click "Submit/Refresh"  (IMPORTANT!)
 
-		Check the SCons files you uploaded
+        Check the SCons files you uploaded
 
-		Click "Add Files and/or Refresh View"
+        Click "Add Files and/or Refresh View"
 
-		Edit the file info:
+        Edit the file info:
 
-			scons-local-0.{97}.tar.gz	Any	.gz
-			scons-local-0.{97}.zip   	Any	.zip
+            scons-local-0.{97}.tar.gz        Any        .gz
+            scons-local-0.{97}.zip           Any        .zip
 
-                Click "Update/Refresh" for each file; this must be done
-                one at a time.
+        Click "Update/Refresh" for each file; this must be done
+        one at a time.
 
-		Check "I'm sure." and click "Send Notice" in the Email
-		Release Notice section.
+        Check "I'm sure." and click "Send Notice" in the Email
+        Release Notice section.
 
 
-		Go to the File Release page
+        Pull down the "Admin" menu and select "File Releases"
 
-		Package Name:  scons-src
+        Package Name:  scons-src
 
-		=> Add Release
+        => Add Release
 
-		New release name:  0.{97}
+        New release name:  0.{97}
 
-		Cut-and-paste or upload the RELEASE.txt file.
+        Upload the RELEASE.txt file.
 
-		Cut-and-paste or upload the CHANGES.txt file.
+        Upload the CHANGES.txt file.
 
-		(If you cut-and-paste, check the "Preserve my
-		pre-formatted text." box!)
+        Check the "Preserve my pre-formatted text." box  (IMPORTANT!)
 
-		Click "Submit/Refresh"  (IMPORTANT!)
+        Click "Submit/Refresh"  (IMPORTANT!)
 
-		Check the SCons files you uploaded
+        Check the SCons files you uploaded
 
-		Click "Add Files and/or Refresh View"
+        Click "Add Files and/or Refresh View"
 
-		Edit the file info:
+        Edit the file info:
 
-			scons-src-0.{97}.tar.gz		Any	.gz
-			scons-src-0.{97}.zip   		Any	.zip
+            scons-src-0.{97}.tar.gz                Any        .gz
+            scons-src-0.{97}.zip                   Any        .zip
 
-                Click "Update/Refresh" for each file; this must be done
-                one at a time.
+        Click "Update/Refresh" for each file; this must be done
+        one at a time.
 
-		Check "I'm sure." and click "Send Notice" in the Email
-		Release Notice section.
+        Check "I'm sure." and click "Send Notice" in the Email
+        Release Notice section.
 
 
-	Hide release 0.{95} at the SourceForge download page:
+    Hide release 0.{95} at the SourceForge download page:
 
-		Go to the Admin page
+        Pull down the "Admin" menu and select "File Releases"
 
-		=> Edit/Add File Releases
+        Package Name:  scons
 
-		Package Name:  scons
+        => Edit Releases
 
-		=> Edit Releases
+        Release Name: 0.{95}
 
-		Release Name: 0.{95}
+        => Edit This Release
 
-		=> Edit This Release
+        Status: => Hidden
 
-		Status: => Hidden
+        Click Submit/Refresh
 
-		Click Submit/Refresh
 
+        Pull down the "Admin" menu and select "File Releases"
 
-		Go to the Admin page
+        Package Name:  scons-local
 
-		=> Edit/Add File Releases
+        => Edit Releases
 
-		Package Name:  scons-local
+        Release Name: 0.{95}
 
-		=> Edit Releases
+        => Edit This Release
 
-		Release Name: 0.{95}
+        Status: => Hidden
 
-		=> Edit This Release
+        Click Submit/Refresh
 
-		Status: => Hidden
 
-		Click Submit/Refresh
+        Pull down the "Admin" menu and select "File Releases"
 
+        Package Name:  scons-src
 
-		Go to the Admin page
+        => Edit Releases
 
-		=> Edit/Add File Releases
+        Release Name: 0.{95}
 
-		Package Name:  scons-src
+        => Edit This Release
 
-		=> Edit Releases
+        Status: => Hidden
 
-		Release Name: 0.{95}
+        Click Submit/Refresh
 
-		=> Edit This Release
 
-		Status: => Hidden
 
-		Click Submit/Refresh
+    Add a new release for 0.{97} in the Issue Tracker at tigris.org:
 
+        Click "Issue Tracker" on the left-hand nav bar
 
+        Click "Configuration options"
 
-	In the Bugs Tracker, add a Group for the new release 0.{97}
+        Click "Add/edit components"
 
+        Under "scons"
+        To the right of "Add ..."
+        Click "Version"
 
+        At the bottom of the list click "Add"
 
-	Test downloading from the SourceForge project page
+        Fill in the "Version:" box with 0.{97}
 
-                You may need to wait a good bit; they seem to update
-                this on half-hour cycles.
+        Check "Add this version to *all* components."
 
+        Click the "Add" button
 
 
-	Update the web site:
 
-		template:  new version number
+    Update the scons.org web site:
 
-                src/doc.py:  new version number
+        svn co http://scons.tigris.org/svn/scons/scons.org
 
-                src/download.py:  new version number
+        cd scons.org
 
-		src/index.py:  announcement on the home page
+            CHANGES.txt:    copy new version from built source tree
 
-		src/scons-doc.tar.gz:  update
+            download.php:   new version number
 
-		src/CHANGES.txt:  update
+            versions.php:   add new version number do $docversions[],
+                            shift index numbers :-(
 
-	Test downloading from the web site download page
+            index.php:      announcement on the home page
+                            remove out-of-date announcements
 
+            news-raw.xhtml: add announcement to list (dup from home page)
 
+            RELEASE.txt:    copy new version from built source tree
 
-	Add news item to the SourceForge project page
+        mkdir doc/0.{97}
 
+        (cd doc/0.{97} && tar zxf scons-doc-0.{97}.tar.gz)
 
+        svn add doc/0.{97}
 
-	Announce to the following mailing lists (template below):
+        svn commit
 
-		scons-announce@lists.sourceforge.net
-		scons-users@lists.sourceforge.net
-		scons-devel@lists.sourceforge.net
+        ssh -l scons manam.pair.com
 
-			[right away]
+            cd public_html
 
-		python-announce@python.org
+            mkdir new
 
-			[right away, it's moderated and will take
-			some time to get through]
+            svn co http://scons.tigris.org/svn/scons/scons.org new
 
-		linux-announce@news.ornl.gov
+            mv production previous && mv new production
 
-			[right away, it's moderated and will take
-			some time to get through]
+        [point your browser to http://www.scons.org/]
 
-		[optional] cons-discuss@gnu.org
 
-			[only if it's a really big announcement,
-			I said we wouldn't bug this list]
+    Update the tigris.org web site:
 
-		python-list@python.org
+        svn co http://scons.tigris.org/svn/scons/trunk
 
-                        [wait until business hours so the announcement
-			hits mailboxes while U.S. workers are active]
+        cd trunk
 
-        Notify Gentoo Linux of the update
+            www/project_highlights.html
 
-                For now, we will do this by entering a bug report, and
-                attaching the files in build/gentoo to the report.  Go
-                to:
+            www/roadmap.html
 
-                        http://bugs.gentoo.org/
+        svn commit
 
-                This requires an account (based on your email address)
-                and a certain amount of Bugzilla-based navigation,
-                but nothing that's too difficult.
 
-                This is just my best stab at a process that will work
-                for Gentoo.  This process may change if the Gentoo
-                developers come back and want something submitted in
-                some other form.
 
-	Notify www.cmtoday.com/contribute.html
 
-                [This guy wants an announcement no more frequently than
-                once a month, so save it for a future release if it's
-                been too soon since the previous one.]
+    Test downloading from the SourceForge project page
 
-	Notify freshmeat.net
+        You may need to wait a good bit; they seem to update
+        this on half-hour cycles.
 
-                [Wait until the morning so the announcement hits the
-                main freshmeat.net page while people in the U.S. are
-                awake and working]
 
+    Test downloading from the web site download page
 
 
-	Checkin another change to prepare for development on this branch.
 
-		# Prep the following files to track the changes
-		# made during the next development cycle
-		aecp src/CHANGES.txt src/RELEASE.txt
-		vi src/CHANGES.txt src/RELEASE.txt
+    Add news item to the SourceForge project page
 
-		# Optionally, update release numbers in the following:
-		[optional] aecp HOWTO/change.txt
-		[optional] vi HOWTO/change.txt
 
-		[optional] aecp HOWTO/release.txt
-		[optional] vi HOWTO/release.txt
+
+    Announce to the following mailing lists (template below):
+
+        scons-announce@lists.sourceforge.net
+        scons-users@lists.sourceforge.net
+        scons-devel@lists.sourceforge.net
+
+            [right away]
+
+        python-announce@python.org
+
+            [right away, it's moderated and will take
+            some time to get through]
+
+        linux-announce@news.ornl.gov
+
+            [right away, it's moderated and will take
+            some time to get through]
+
+        [optional] cons-discuss@gnu.org
+
+            [only if it's a really big announcement,
+            I said we wouldn't bug this list]
+
+        python-list@python.org
+
+            [wait until business hours so the announcement
+            hits mailboxes while U.S. workers are active]
+
+    Notify Gentoo Linux of the update
+
+        For now, we will do this by entering a bug report, and
+        attaching the files in build/gentoo to the report.  Go
+        to:
+
+            http://bugs.gentoo.org/
+
+        This requires an account (based on your email address)
+        and a certain amount of Bugzilla-based navigation,
+        but nothing that's too difficult.
+
+        This is just my best stab at a process that will work
+        for Gentoo.  This process may change if the Gentoo
+        developers come back and want something submitted in
+        some other form.
+
+    Notify www.cmtoday.com/contribute.html
+
+        [This guy wants an announcement no more frequently than
+        once a month, so save it for a future release if it's
+        been too soon since the previous one.]
+
+    Notify freshmeat.net
+
+        [Wait until the morning so the announcement hits the
+        main freshmeat.net page while people in the U.S. are
+        awake and working]
+
+
+
+    Checkin another change to prepare for development on this branch.
+
+        # Prep the following files to track the changes
+        # made during the next development cycle
+        aecp src/CHANGES.txt src/RELEASE.txt
+        vi src/CHANGES.txt src/RELEASE.txt
+
+        # Optionally, update release numbers in the following:
+        [optional] aecp HOWTO/change.txt
+        [optional] vi HOWTO/change.txt
+
+        [optional] aecp HOWTO/release.txt
+        [optional] vi HOWTO/release.txt
 
 
 
 Special thanks to XXX, XXX, and XXX for their contributions to this
 release.
 
-	--SK
+        --SK
 =======================
 Template scons-users + scons-announce announcement:
 
 Version 0.95 of SCons has been released and is available for download
 from the SCons web site:
 
-	http://www.scons.org/
+        http://www.scons.org/
 
 Or through the download link at the SCons project page at SourceForge:
 
-	http://sourceforge.net/projects/scons/
+        http://sourceforge.net/projects/scons/
 
 RPM and Debian packages and a Win32 installer are all available, in
 addition to the traditional .tar.gz and .zip files.
 
 On behalf of the SCons team,
 
-	--SK
+        --SK
 =======================
 Template python-announce, linux-announce and python-list announcement:
 
 Version 0.95 of SCons has been released and is available for download
 from the SCons web site:
 
-	http://www.scons.org/
+        http://www.scons.org/
 
 Or through the download link at the SCons project page at SourceForge:
 
-	http://sourceforge.net/projects/scons/
+        http://sourceforge.net/projects/scons/
 
 RPM and Debian packages and a Win32 installer are all available, in
 addition to the traditional .tar.gz and .zip files.
 An scons-users mailing list is available for those interested in getting
 started using SCons.  You can subscribe at:
 
-	http://lists.sourceforge.net/lists/listinfo/scons-users
+        http://lists.sourceforge.net/lists/listinfo/scons-users
 
 Alternatively, we invite you to subscribe to the low-volume
 scons-announce mailing list to receive notification when new versions of
 SCons become available:
 
-	http://lists.sourceforge.net/lists/listinfo/scons-announce
+        http://lists.sourceforge.net/lists/listinfo/scons-announce
 
 
 ACKNOWLEDGEMENTS
 
 On behalf of the SCons team,
 
-	--SK
+        --SK

HOWTO/subrelease.txt

 
 Things to do to release a new X.Y.Z version of SCons:
 
-	START THE NEW SUB-BRANCH FOR SUBRELEASE
+    START THE NEW SUB-BRANCH FOR SUBRELEASE
 
-		aenbr -p scons.0{94} {1}
+        aenbr -p scons.0.{94} {1}
 
-		aenc -p scons.0.{94}.{1}
+        aenc -p scons.0.{94}.{1}
 
-                        Call it something like,
-                        "Prepare a new sub-release for XYZ."
-                        Cause = internal_enhancement.
-                        Exempt it from all tests (*_exempt = true).
+            Call it something like,
+            "Prepare a new sub-release for XYZ."
+            Cause = internal_enhancement.
+            Exempt it from all tests (*_exempt = true).
 
-		ae_p scons.0.{94}.{1}
+        ae_p scons.0.{94}.{1}
 
-		aedb 100
+        aedb 100
 
-		aecd
+        aecd
 
-		# Change the hard-coded package version numbers
-		# in the following files.
-		aecp README
-		vi README
+        # Change the hard-coded package version numbers
+        # in the following files.
+        aecp README
+        vi README
 
-                aecp SConstruct
-                vi SConstruct
+        aecp SConstruct
+        vi SConstruct
 
-                aecp rpm/scons.spec.in
-                vi rpm/scons.spec.in
+        aecp rpm/scons.spec.in
+        vi rpm/scons.spec.in
 
-                aecp src/setup.py
-                vi src/setup.py
+        aecp src/setup.py
+        vi src/setup.py
 
-                aecp QMTest/TestSCons.py
-                vi QMTest/TestSCons.py
+        aecp QMTest/TestSCons.py
+        vi QMTest/TestSCons.py
 
-                # Read through and update the README files if necessary
-		[optional] aecp README
-		[optional] vi README
+        # Read through and update the README files if necessary
+        [optional] aecp README
+        [optional] vi README
 
-		[optional] aecp src/README.txt
-		[optional] vi src/README.txt
+        [optional] aecp src/README.txt
+        [optional] vi src/README.txt
 
-                # Prepare src/CHANGES.txt
-		aecp src/CHANGES.txt
-		vi src/CHANGES.txt
+        # Prepare src/CHANGES.txt
+        aecp src/CHANGES.txt
+        vi src/CHANGES.txt
 
-                        change the release line to reflect
-                        the new subrelease
+            change the release line to reflect
+            the new subrelease
 
-		        date -R the new subrelease
+            date -R the new subrelease
 
-                        add an explanatory not after the subrelease line:
+            add an explanatory not after the subrelease line:
 
-                                NOTE:  This is a pre-release of 0.{95}
-                                for testing purposes.  When 0.{95} is
-                                released, all these changes will show
-                                up as 0.95 changes.
+                    NOTE:  This is a pre-release of 0.{95}
+                    for testing purposes.  When 0.{95} is
+                    released, all these changes will show
+                    up as 0.95 changes.
 
-	        # Prepare src/RELEASE.txt
-                aecp src/RELEASE.txt
-                vi src/RELEASE.txt
+        # Prepare src/RELEASE.txt
+        aecp src/RELEASE.txt
+        vi src/RELEASE.txt
 
-		        date -R the release only if necessary
+            date -R the release only if necessary
 
-		        Read through and edit appropriately.
+            Read through and edit appropriately.
 
-		        Can probably keep most of the existing text
+            Can probably keep most of the existing text
 
-		        Add any new known problems
+            Add any new known problems
 
-	        # Prepare debian/changelog
-                aecp debian/changelog
-                vi debian/changelog
+        # Prepare debian/changelog
+        aecp debian/changelog
+        vi debian/changelog
 
-                        add the new subrelease
+            add the new subrelease
 
-		        date -R the new subrelease
+            date -R the new subrelease
 
-                # Now build and prepare the release itself.
-                aeb
+        # Now build and prepare the release itself.
+        aeb
 
-		aet -reg
+        aet -reg
 
-		aed
+        aed
 
-		aede
+        aede
 
-		etc.
+        etc.
 
 
 
-	Make the relevant packages available for by-hand pickup directly
-	off the web site:
+    Make the relevant packages available for by-hand pickup directly
+    off the web site:
 
-		scp scons-0.{94}.{1}.tar.gz stevenknight@scons.sourceforge.net:/home/groups/s/sc/scons/htdocs
-		scp scons-0.{94}.{1}.zip stevenknight@scons.sourceforge.net:/home/groups/s/sc/scons/htdocs
+        scp scons-0.{94}.{1}.tar.gz stevenknight@scons.sourceforge.net:/home/groups/s/sc/scons/htdocs
+        scp scons-0.{94}.{1}.zip stevenknight@scons.sourceforge.net:/home/groups/s/sc/scons/htdocs
 
 
-	Test downloading from the web site.
+    Test downloading from the web site.
 
 
 
-	Announce to dev@scons.tigris.org.
+    Announce to dev@scons.tigris.org.

QMTest/SConscript

     'TestCommon.py',
     'TestRuntest.py',
     'TestSCons.py',
+    'TestSConsign.py',
+    'TestSCons_time.py',
     'unittest.py',
 ]
 

QMTest/TestCmd.py

 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 
 __author__ = "Steven Knight <knight at baldmt dot com>"
-__revision__ = "TestCmd.py 0.22.D001 2006/02/26 15:45:18 knight"
-__version__ = "0.22"
+__revision__ = "TestCmd.py 0.23.D001 2006/11/30 13:57:29 knight"
+__version__ = "0.23"
 
 import os
 import os.path
 import types
 import UserList
 
-__all__ = [ 'fail_test', 'no_result', 'pass_test',
-            'match_exact', 'match_re', 'match_re_dotall',
-            'python_executable', 'TestCmd' ]
+__all__ = [
+    'diff_re',
+    'fail_test',
+    'no_result',
+    'pass_test',
+    'match_exact',
+    'match_re',
+    'match_re_dotall',
+    'python_executable',
+    'TestCmd'
+]
 
 def is_List(e):
     return type(e) is types.ListType \
     if re.compile("^" + res + "$", re.DOTALL).match(lines):
         return 1
 
+def diff_re(a, b, fromfile='', tofile='',
+                fromfiledate='', tofiledate='', n=3, lineterm='\n'):
+    """
+    A simple "diff" of two sets of lines when the expected lines
+    are regular expressions.  This is a really dumb thing that
+    just compares each line in turn, so it doesn't look for
+    chunks of matching lines and the like--but at least it lets
+    you know exactly which line first didn't compare correctl...
+    """
+    result = []
+    diff = len(a) - len(b)
+    if diff < 0:
+        a = a + ['']*(-diff)
+    elif diff > 0:
+        b = b + ['']*diff
+    i = 0
+    for aline, bline in zip(a, b):
+        if not re.compile("^" + aline + "$").search(bline):
+            result.append("%sc%s" % (i+1, i+1))
+            result.append('< ' + repr(a[i]))
+            result.append('---')
+            result.append('> ' + repr(b[i]))
+        i = i+1
+    return result
+
 if os.name == 'java':
 
     python_executable = os.path.join(sys.prefix, 'jython')

QMTest/TestCommon.py

 # SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
 
 __author__ = "Steven Knight <knight at baldmt dot com>"
-__revision__ = "TestCommon.py 0.22.D001 2006/02/26 15:45:18 knight"
-__version__ = "0.22"
+__revision__ = "TestCommon.py 0.23.D001 2006/11/30 13:57:29 knight"
+__version__ = "0.23"
 
 import os
 import os.path

QMTest/TestSCons.py

 # to what we expect.  (If we derived the version number from the same
 # data driving the build we might miss errors if the logic breaks.)
 
-SConsVersion = '0.96.92'
+SConsVersion = '0.96.93'
 
 __all__.extend([ 'TestSCons',
                  'python',
             i = i + 1
         return "Actual matched the expected output???"
 
+    def python_file_line(self, file, line):
+        """
+        Returns a Python error line for output comparisons.
+
+        The exec of the traceback line gives us the correct format for
+        this version of Python.  Before 2.5, this yielded:
+
+            File "<string>", line 1, ?
+
+        Python 2.5 changed this to:
+
+            File "<string>", line 1, <module>
+
+        We stick the requested file name and line number in the right
+        places, abstracting out the version difference.
+        """
+        exec 'import traceback; x = traceback.format_stack()[-1]'
+        x = string.lstrip(x)
+        x = string.replace(x, '<string>', file)
+        x = string.replace(x, 'line 1,', 'line %s,' % line)
+        return x
+
     def java_ENV(self):
         """
         Return a default external environment that uses a local Java SDK

QMTest/TestSCons_time.py

+"""
+TestSCons_time.py:  a testing framework for the scons-test.py script
+
+A TestSCons_time environment object is created via the usual invocation:
+
+    test = TestSCons_time()
+
+TestSCons_time is a subclass of TestCommon, which is in turn is a subclass
+of TestCmd), and hence has available all of the methods and attributes
+from those classes, as well as any overridden or additional methods or
+attributes defined in this subclass.
+"""
+
+# Copyright (c) 2001, 2002, 2003, 2004 The SCons Foundation
+
+__revision__ = "QMTest/TestSCons_time.py 0.96.C629 2006/11/19 06:39:17 knight"
+
+import os
+import os.path
+import string
+import sys
+
+from TestCommon import *
+from TestCommon import __all__
+
+__all__.extend([ 'TestSCons',
+                 'python',
+                 '_exe',
+                 '_obj',
+                 '_shobj',
+                 'lib_',
+                 '_lib',
+                 'dll_',
+                 '_dll'
+               ])
+
+python = python_executable
+_python_ = '"' + python_executable + '"'
+
+SConstruct = """\
+import os
+print "SConstruct file directory:", os.getcwd()
+"""
+
+scons_py = """\
+#!/usr/bin/env python
+import os
+import sys
+def write_args(fp, args):
+    fp.write(args[0] + '\\n')
+    for arg in args[1:]:
+        fp.write('    ' + arg + '\\n')
+write_args(sys.stdout, sys.argv)
+for arg in sys.argv[1:]:
+    if arg[:10] == '--profile=':
+        profile = open(arg[10:], 'wb')
+        profile.write('--profile\\n')
+        write_args(profile, sys.argv)
+        break
+sys.stdout.write('SCONS_LIB_DIR = ' + os.environ['SCONS_LIB_DIR'] + '\\n')
+execfile('SConstruct')
+"""
+
+aegis_py = """\
+#!/usr/bin/env python
+import os
+import sys
+script_dir = 'src/script'
+if not os.path.exists(script_dir):
+    os.makedirs(script_dir)
+open(script_dir + '/scons.py', 'w').write(
+r'''%s''')
+""" % scons_py
+
+
+svn_py = """\
+#!/usr/bin/env python
+import os
+import sys
+dir = sys.argv[-1]
+script_dir = dir + '/src/script'
+os.makedirs(script_dir)
+open(script_dir + '/scons.py', 'w').write(
+r'''%s''')
+""" % scons_py
+
+
+logfile_contents = """\
+Memory before reading SConscript files:  100%(index)s
+Memory after reading SConscript files:  200%(index)s
+Memory before building targets:  300%(index)s
+Memory after building targets:  400%(index)s
+Object counts:
+       pre-   post-    pre-   post-   
+       read    read   build   build   Class
+       101%(index)s    102%(index)s    103%(index)s    104%(index)s   Action.CommandAction
+       201%(index)s    202%(index)s    203%(index)s    204%(index)s   Action.CommandGeneratorAction
+       301%(index)s    302%(index)s    303%(index)s    304%(index)s   Action.FunctionAction
+       401%(index)s    402%(index)s    403%(index)s    404%(index)s   Action.LazyAction
+       501%(index)s    502%(index)s    503%(index)s    504%(index)s   Action.ListAction
+       601%(index)s    602%(index)s    603%(index)s    604%(index)s   Builder.BuilderBase
+       701%(index)s    702%(index)s    703%(index)s    704%(index)s   Builder.CompositeBuilder
+       801%(index)s    802%(index)s    803%(index)s    804%(index)s   Builder.ListBuilder
+       901%(index)s    902%(index)s    903%(index)s    904%(index)s   Builder.MultiStepBuilder
+      1001%(index)s   1002%(index)s   1003%(index)s   1004%(index)s   Builder.OverrideWarner
+      1101%(index)s   1102%(index)s   1103%(index)s   1104%(index)s   Environment.Base
+      1201%(index)s   1202%(index)s   1203%(index)s   1204%(index)s   Environment.EnvironmentClone
+      1301%(index)s   1302%(index)s   1303%(index)s   1304%(index)s   Environment.OverrideEnvironment
+      1401%(index)s   1402%(index)s   1403%(index)s   1404%(index)s   Executor.Executor
+      1501%(index)s   1502%(index)s   1503%(index)s   1504%(index)s   Node.FS
+      1601%(index)s   1602%(index)s   1603%(index)s   1604%(index)s   Node.FS.Base
+      1701%(index)s   1702%(index)s   1703%(index)s   1704%(index)s   Node.FS.Dir
+      1801%(index)s   1802%(index)s   1803%(index)s   1804%(index)s   Node.FS.File
+      1901%(index)s   1902%(index)s   1904%(index)s   1904%(index)s   Node.FS.RootDir
+      2001%(index)s   2002%(index)s   2003%(index)s   2004%(index)s   Node.Node
+Total build time: 11.123456 seconds
+Total SConscript file execution time: 22.234567 seconds
+Total SCons execution time: 33.345678 seconds
+Total command execution time: 44.456789 seconds
+"""
+
+
+profile_py = """\
+%(body)s
+
+import profile
+
+try: dispatch = profile.Profile.dispatch
+except AttributeError: pass
+else: dispatch['c_exception'] = profile.Profile.trace_dispatch_return
+
+prof = profile.Profile()
+prof.runcall(%(call)s)
+prof.dump_stats(r'%(profile_name)s')
+"""
+
+
+class TestSCons_time(TestCommon):
+    """Class for testing the scons-time script.
+
+    This provides a common place for initializing scons-time tests,
+    eliminating the need to begin every test with the same repeated
+    initializations.
+    """
+
+    def __init__(self, **kw):
+        """Initialize an SCons_time testing object.
+
+        If they're not overridden by keyword arguments, this
+        initializes the object with the following default values:
+
+                program = 'scons-time'
+                interpreter = ['python', '-tt']
+                match = match_exact
+                workdir = ''
+
+        The workdir value means that, by default, a temporary workspace
+        directory is created for a TestSCons_time environment.
+        In addition, this method changes directory (chdir) to the
+        workspace directory, so an explicit "chdir = '.'" on all of the
+        run() method calls is not necessary.
+        """
+
+        self.orig_cwd = os.getcwd()
+        try:
+            script_dir = os.environ['SCONS_SCRIPT_DIR']
+        except KeyError:
+            pass
+        else:
+            os.chdir(script_dir)
+        if not kw.has_key('program'):
+            p = os.environ.get('SCONS_TIME')
+            if not p:
+                p = 'scons-time'
+                if not os.path.exists(p):
+                    p = 'scons-time.py'
+            kw['program'] = p
+
+        if not kw.has_key('interpreter'):
+            kw['interpreter'] = [python, '-tt']
+
+        if not kw.has_key('match'):
+            kw['match'] = match_exact
+
+        if not kw.has_key('workdir'):
+            kw['workdir'] = ''
+
+        apply(TestCommon.__init__, [self], kw)
+
+        try:
+            eval('[x for x in [1, 2]]')
+        except SyntaxError:
+            version = string.split(sys.version)[0]
+            msg = 'scons-time does not work on Python version %s\n' % version
+            self.skip_test(msg)
+
+    def archive_split(self, path):
+        if path[-7:] == '.tar.gz':
+            return path[:-7], path[-7:]
+        else:
+            return os.path.splitext(path)
+
+    def must_contain_all_lines(self, name, content, expected, exists=None):
+        missing_lines = []
+
+        if exists is None:
+            exists = lambda e, c: string.find(c, e) != -1
+
+        for e in expected:
+            if not exists(e, content):
+                missing_lines.append(e)
+
+        if missing_lines:
+            sys.stdout.write('%s is missing expected string(s):\n' % name)
+            for m in missing_lines:
+                sys.stdout.write('    ' + repr(m) + '\n')
+            sys.stdout.write('%s content:\n' % name)
+            sys.stdout.write(content)
+            self.fail_test()
+
+    def fake_logfile(self, logfile_name, index=0):
+        self.write(self.workpath(logfile_name), logfile_contents % locals())
+
+    def profile_data(self, profile_name, python_name, call, body):
+        profile_name = self.workpath(profile_name)
+        python_name = self.workpath(python_name)
+        d = {
+            'profile_name'  : profile_name,
+            'python_name'   : python_name,
+            'call'          : call,
+            'body'          : body,
+        }
+        self.write(python_name, profile_py % d)
+        self.run(program = python_name, interpreter = sys.executable)
+
+    def skip_test(self, message="Skipping test.\n"):
+        """Skips a test.
+
+        Proper test-skipping behavior is dependent on whether we're being
+        executed as part of development of a change under Aegis.
+
+        Technically, skipping a test is a NO RESULT, but Aegis will
+        treat that as a test failure and prevent the change from going
+        to the next step.  We don't want to force anyone using Aegis
+        to have to install absolutely every tool used by the tests,
+        so we actually report to Aegis that a skipped test has PASSED
+        so that the workflow isn't held up.
+        """
+        if message:
+            sys.stdout.write(message)
+            sys.stdout.flush()
+        devdir = os.popen("aesub '$dd' 2>/dev/null", "r").read()[:-1]
+        intdir = os.popen("aesub '$intd' 2>/dev/null", "r").read()[:-1]
+        if devdir and self._cwd[:len(devdir)] == devdir or \
+           intdir and self._cwd[:len(intdir)] == intdir:
+            # We're under the development directory for this change,
+            # so this is an Aegis invocation; pass the test (exit 0).
+            self.pass_test()
+        else:
+            # skip=1 means skip this function when showing where this
+            # result came from.  They only care about the line where the
+            # script called test.skip_test(), not the line number where
+            # we call test.no_result().
+            self.no_result(skip=1)
+
+    def write_fake_aegis_py(self, name):
+        name = self.workpath(name)
+        self.write(name, aegis_py)
+        os.chmod(name, 0755)
+        return name
+
+    def write_fake_scons_py(self):
+        self.subdir('src', ['src', 'script'])
+        self.write('src/script/scons.py', scons_py)
+
+    def write_fake_svn_py(self, name):
+        name = self.workpath(name)
+        self.write(name, svn_py)
+        os.chmod(name, 0755)
+        return name
+
+    def write_sample_directory(self, archive, dir, files):
+        dir = self.workpath(dir)
+        for name, content in files:
+            path = os.path.join(dir, name)
+            d, f = os.path.split(path)
+            if not os.path.isdir(d):
+                os.makedirs(d)
+            open(path, 'wb').write(content)
+        return dir
+
+    def write_sample_tarfile(self, archive, dir, files):
+        import shutil
+        try:
+            import tarfile
+
+        except ImportError:
+
+            self.skip_test('no tarfile module\n')
+
+        else:
+
+            base, suffix = self.archive_split(archive)
+
+            mode = {
+                '.tar'      : 'w',
+                '.tar.gz'   : 'w:gz',
+                '.tgz'      : 'w:gz',
+            }
+
+            tar = tarfile.open(archive, mode[suffix])
+            for name, content in files:
+                path = os.path.join(dir, name)
+                open(path, 'wb').write(content)
+                tarinfo = tar.gettarinfo(path, path)
+                tarinfo.uid = 111
+                tarinfo.gid = 111
+                tarinfo.uname = 'fake_user'
+                tarinfo.gname = 'fake_group'
+                tar.addfile(tarinfo, open(path, 'rb'))
+            tar.close()
+            shutil.rmtree(dir)
+            return self.workpath(archive)
+
+    def write_sample_zipfile(self, archive, dir, files):
+        import shutil
+        try:
+            import zipfile
+        except ImportError:
+
+            sys.stderr.write('no zipfile module\n')
+            self.no_result()
+
+        else:
+
+            zip = zipfile.ZipFile(archive, 'w')
+            for name, content in files:
+                path = os.path.join(dir, name)
+                open(path, 'wb').write(content)
+                zip.write(path)
+            zip.close()
+            shutil.rmtree(dir)
+            return self.workpath(archive)
+
+    sample_project_files = [
+        ('SConstruct',  SConstruct),
+    ]
+
+    def write_sample_project(self, archive, dir=None):
+        base, suffix = self.archive_split(archive)
+
+        write_sample = {
+            '.tar'      : self.write_sample_tarfile,
+            '.tar.gz'   : self.write_sample_tarfile,
+            '.tgz'      : self.write_sample_tarfile,
+            '.zip'      : self.write_sample_zipfile,
+        }.get(suffix, self.write_sample_directory)
+
+        if not dir:
+            dir = base
+
+        os.mkdir(dir)
+        path = write_sample(archive, dir, self.sample_project_files)
+
+        return path

QMTest/TestSConsign.py

+# __COPYRIGHT__
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+__doc__ = """
+TestSConsign.py:  a testing framework for the "sconsign" script 
+tool.
+
+A TestSConsign environment object is created via the usual invocation:
+
+    test = TestSConsign()
+
+TestSconsign is a subclass of TestSCons, which is a subclass of
+TestCommon, which is in turn is a subclass of TestCmd), and hence
+has available all of the methods and attributes from those classes,
+as well as any overridden or additional methods or attributes defined
+in this subclass.
+"""
+
+import os
+import os.path
+import string
+import sys
+
+from TestSCons import *
+from TestSCons import __all__
+
+__all__.extend([ 'TestSConsign', ])
+
+class TestSConsign(TestSCons):
+    """Class for testing the sconsign.py script.
+
+    This provides a common place for initializing sconsign tests,
+    eliminating the need to begin every test with the same repeated
+    initializations.
+
+    This adds additional methods for running the sconsign script
+    without changing the basic ability of the run() method to run
+    "scons" itself, since we need to run scons to generate the
+    .sconsign files that we want the sconsign script to read.
+    """
+    def __init__(self, *args, **kw):
+        try:
+            script_dir = os.environ['SCONS_SCRIPT_DIR']
+        except KeyError:
+            pass
+        else:
+            os.chdir(script_dir)
+        self.script_dir = os.getcwd()
+
+        apply(TestSCons.__init__, (self,)+args, kw)
+
+        self.my_kw = {
+            'interpreter' : python,     # imported from TestSCons
+        }
+
+        if os.path.exists(self.script_path('sconsign.py')):
+            sconsign = 'sconsign.py'
+        elif os.path.exists(self.script_path('sconsign')):
+            sconsign = 'sconsign'
+        else:
+            print "Can find neither 'sconsign.py' nor 'sconsign' scripts."
+            self.no_result()
+        self.set_sconsign(sconsign)
+
+    def script_path(self, script):
+        return os.path.join(self.script_dir, script)
+
+    def set_sconsign(self, sconsign):
+        self.my_kw['program'] = sconsign
+
+    def run_sconsign(self, *args, **kw):
+        kw.update(self.my_kw)
+        return apply(self.run, args, kw)
     --  (Optional.)  Install from a pre-packaged SCons package that
         does not require distutils:
 
-            Red Hat Linux       scons-0.96.92.noarch.rpm
+            Red Hat Linux       scons-0.96.93.noarch.rpm
 
-            Debian GNU/Linux    scons_0.96.92_all.deb
+            Debian GNU/Linux    scons_0.96.93_all.deb
                                 (or use apt-get)
 
-            Windows             scons-0.96.92.win32.exe
+            Windows             scons-0.96.93.win32.exe
 
     --  (Recommended.)  Download the latest distutils package from the
         following URL:
 
 By default, the above commands will do the following:
 
-    --  Install the version-numbered "scons-0.96.92" and "sconsign-0.96.92"
+    --  Install the version-numbered "scons-0.96.93" and "sconsign-0.96.93"
         scripts in the default system script directory (/usr/bin or
         C:\Python*\Scripts, for example).  This can be disabled by
         specifying the "--no-version-script" option on the command
         if you want to install and experiment with a new version before
         making it the default on your system.  On UNIX or Linux systems,
         you can have the "scons" and "sconsign" scripts be hard links or
-        symbolic links to the "scons-0.96.92" and "sconsign-0.96.92" scripts
+        symbolic links to the "scons-0.96.93" and "sconsign-0.96.93" scripts
         by specifying the "--hardlink-scons" or "--symlink-scons"
         options on the command line.
 
-    --  Install "scons-0.96.92.bat" and "scons.bat" wrapper scripts in the
+    --  Install "scons-0.96.93.bat" and "scons.bat" wrapper scripts in the
         Python prefix directory on Windows (C:\Python*, for example).
         This can be disabled by specifying the "--no-install-bat" option
         on the command line.  On UNIX or Linux systems, the
-        "--install-bat" option may be specified to have "scons-0.96.92.bat"
+        "--install-bat" option may be specified to have "scons-0.96.93.bat"
         and "scons.bat" files installed in the default system script
         directory, which is useful if you want to install SCons in a
         shared file system directory that can be used to execute SCons
 
     --  Install the SCons build engine (a Python module) in an
         appropriate version-numbered SCons library directory
-        (/usr/lib/scons-0.96.92 or C:\Python*\scons-0.96.92, for example).
+        (/usr/lib/scons-0.96.93 or C:\Python*\scons-0.96.93, for example).
         See below for more options related to installing the build
         engine library.
 
 BUILDING PACKAGES
 =================
 
-We use SCons (version 0.96 or later) to build its own packages.  If you
+We use SCons (version 0.96.93 later) to build its own packages.  If you
 already have an appropriate version of SCons installed on your system,
 you can build everything by simply running it:
 
         $ scons
 
-If you don't have SCons version 0.96 or later already installed on your
+If you don't have SCons version 0.96.93 later already installed on your
 system, you can build this version of SCons with itself with a little more
 typing.  On UNIX or Linux (using sh or a derivative like bash or ksh):
 
 Depending on the utilities installed on your system, any or all of the
 following packages will be built:
 
-        build/dist/scons-0.96.92-1.noarch.rpm
-        build/dist/scons-0.96.92-1.src.rpm
-        build/dist/scons-0.96.92.linux-i686.tar.gz
-        build/dist/scons-0.96.92.tar.gz
-        build/dist/scons-0.96.92.win32.exe
-        build/dist/scons-0.96.92.zip
-        build/dist/scons-doc-0.96.92.tar.gz
-        build/dist/scons-local-0.96.92.tar.gz
-        build/dist/scons-local-0.96.92.zip
-        build/dist/scons-src-0.96.92.tar.gz
-        build/dist/scons-src-0.96.92.zip
-        build/dist/scons_0.96.92-1_all.deb
+        build/dist/scons-0.96.93-1.noarch.rpm
+        build/dist/scons-0.96.93-1.src.rpm
+        build/dist/scons-0.96.93.linux-i686.tar.gz
+        build/dist/scons-0.96.93.tar.gz
+        build/dist/scons-0.96.93.win32.exe
+        build/dist/scons-0.96.93.zip
+        build/dist/scons-doc-0.96.93.tar.gz
+        build/dist/scons-local-0.96.93.tar.gz
+        build/dist/scons-local-0.96.93.zip
+        build/dist/scons-src-0.96.93.tar.gz
+        build/dist/scons-src-0.96.93.zip
+        build/dist/scons_0.96.93-1_all.deb
 
 The SConstruct file is supposed to be smart enough to avoid trying to
 build packages for which you don't have the proper utilities installed.
 # See the README file for an overview of how SCons is built and tested.
 #
 
-copyright_years = '2001, 2002, 2003, 2004'
+# When this gets changed, you also need to change test/option-v.py
+# so it looks for the right string.
+copyright_years = '2001, 2002, 2003, 2004, 2005, 2006'
 
 #
 # __COPYRIGHT__
 import time
 
 project = 'scons'
-default_version = '0.96.92'
+default_version = '0.96.93'
 copyright = "Copyright (c) %s The SCons Foundation" % copyright_years
 
 Default('.')
                             'LICENSE.txt'       : '../LICENSE.txt',
                             'scons'             : 'scons.py',
                             'sconsign'          : 'sconsign.py',
+                            'scons-time'        : 'scons-time.py',
                            },
 
         'buildermap'    : {},
         'extra_rpm_files' : [
                             'scons-' + version,
                             'sconsign-' + version,
+                            'scons-time-' + version,
                           ],
 
         'explicit_deps' : {
                             'os_spawnv_fix.diff',
                             'scons.1',
                             'sconsign.1',
+                            'scons-time.1',
                             'script/scons.bat',
                             'setup.cfg',
                             'setup.py',
         'filemap'       : {
                             'scons.1' : '../build/doc/man/scons.1',
                             'sconsign.1' : '../build/doc/man/sconsign.1',
+                            'scons-time.1' : '../build/doc/man/scons-time.1',
                           },
 
         'buildermap'    : {
                             'scons.1' : env.SOElim,
                             'sconsign.1' : env.SOElim,
+                            'scons-time.1' : env.SOElim,
                           },
 
         'subpkgs'       : [ python_scons, scons_script ],
 # and so will not be readily compilable.
 #
 # gunzip < $baseline/export/${project}.tar.gz | tardy -rp ${project} | tar xf -
-aetar -send -o - | tar xzf -
+aetar -send -comp-alg=gzip -o - | tar xzf -
 
 #
 # If any new directories have been created we will need to add them
     xargs --max-args=1 |
     while read dir
     do
-        if [ ! -d $dir/CVS ]
+        if [ ! -d "$dir/CVS" ]
         then
-	    Command cvs add $dir
+	    Command cvs add "$dir"
         fi
     done
 fi
 done
 
 #
+# Extract the brief description.  We'd like to do this using aesub
+# or something, like so:
+#
+#      message=`aesub '${version} - ${change description}'`
+#
+# but the expansion of ${change description} has a lame hard-coded max of
+# 80 characters, so we have to do this by hand.  (This has the slight
+# benefit of preserving backslashes in front of any double-quotes in
+# the text; that will have to be handled if we go back to using aesub.)
+#
+description=`aegis -ca -l | sed -n 's/brief_description = "\(.*\)";$/\1/p'`
+version=`aesub '${version}'`
+message="$version - $description"
+
+#
 # Now commit all the changes.
 #
-message=`aesub '${version} - ${change description}'`
 Command cvs -q commit -m \"$message\"
 
 #
 # and so will not be readily compilable.
 #
 # gunzip < $baseline/export/${project}.tar.gz | tardy -rp ${project} | tar xf -
-aetar -send -o - | tar xzf -
+aetar -send -comp-alg=gzip -o - | tar xzf -
 
 #
 # If any new directories have been created we will need to add them
     xargs --max-args=1 |
     while read dir
     do
-        if [ ! -d $dir/.svn ]
+        if [ ! -d "$dir/.svn" ]
         then
-            Command svn add -N $dir
+            Command svn add -N "$dir"
         fi
     done
 fi
 done
 
 #
+# Extract the brief description.  We'd like to do this using aesub
+# or something, like so:
+#
+#      message=`aesub '${version} - ${change description}'`
+#
+# but the expansion of ${change description} has a lame hard-coded max of
+# 80 characters, so we have to do this by hand.  (This has the slight
+# benefit of preserving backslashes in front of any double-quotes in
+# the text; that will have to be handled if we go back to using aesub.)
+#
+description=`aegis -ca -l | sed -n 's/brief_description = "\(.*\)";$/\1/p'`
+version=`aesub '${version}'`
+message="$version - $description"
+
+#
 # Now commit all the changes.
 #
-message=`aesub '${version} - ${change description}'`
 Command svn commit -m \"$message\"
 
 #
-scons (0.96-92) unstable; urgency=low
+scons (0.96-93) unstable; urgency=low
 
   * Pre-release of eighth beta release.
 
- -- Steven Knight <knight@baldmt.com>  Mon, 10 Apr 2006 21:08:22 -0400
+ -- Steven Knight <knight@baldmt.com>  Mon, 06 Nov 2006 00:44:11 -0600
 
 
 scons (0.96-1) unstable; urgency=low
 #
 # Man page(s), in good ol' troff format.
 #
-man_page_list = ['scons.1', 'sconsign.1']
+man_page_list = ['scons.1', 'sconsign.1', 'scons-time.1']
 
 for m in man_page_list:
     orig_env.SCons_revision(os.path.join(build, 'man', m),

doc/man/scons-time.1

+.\" __COPYRIGHT__
+.\"
+.\" Permission is hereby granted, free of charge, to any person obtaining
+.\" a copy of this software and associated documentation files (the
+.\" "Software"), to deal in the Software without restriction, including
+.\" without limitation the rights to use, copy, modify, merge, publish,
+.\" distribute, sublicense, and/or sell copies of the Software, and to
+.\" permit persons to whom the Software is furnished to do so, subject to
+.\" the following conditions:
+.\"
+.\" The above copyright notice and this permission notice shall be included
+.\" in all copies or substantial portions of the Software.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+.\" KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+.\" WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+.\" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+.\" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+.\" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+.\" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+.\"
+.\" doc/man/scons-time.1 0.96.C629 2006/11/18 11:50:43 knight
+.\"
+.\" ES - Example Start - indents and turns off line fill
+.de ES
+.RS
+.nf
+..
+.\" EE - Example End - ends indent and turns line fill back on
+.de EE
+.RE
+.fi
+..
+'\"==========================================================================
+.de SF
+.B scons-time func
+[\fB-h\fR]
+[\fB--chdir=\fIDIR\fR]
+[\fB-f \fIFILE\fR]
+[\fB--fmt=\fIFORMAT\fR]
+[\fB--func=\fINAME\fR]
+[\fB-p \fISTRING\fR]
+[\fB-t \fINUMBER\fR]
+[\fB--title= TITLE\fR]
+[\fIARGUMENTS\fR]
+..
+'\"--------------------------------------------------------------------------
+.de SY
+.B scons-time mem
+[\fB-h\fR]
+[\fB--chdir=\fIDIR\fR]
+[\fB-f \fIFILE\fR]
+[\fB--fmt=\fIFORMAT\fR]
+[\fB-p \fISTRING\fR]
+[\fB--stage=\fISTAGE\fR]
+[\fB-t \fINUMBER\fR]
+[\fB--title=\fITITLE\fR]
+[\fIARGUMENTS\fR]
+..
+'\"--------------------------------------------------------------------------
+.de SO
+.B scons-time obj
+[\fB-h\fR]
+[\fB--chdir=\fIDIR\fR]
+[\fB-f \fIFILE\fR]
+[\fB--fmt=\fIFORMAT\fR]
+[\fB-p \fISTRING\fR]
+[\fB--stage=\fISTAGE\fR]
+[\fB-t \fINUMBER\fR]
+[\fB--title=\fITITLE\fR]
+[\fIARGUMENTS\fR]
+..
+'\"--------------------------------------------------------------------------
+.de SR
+.B scons-time run
+[\fB-hnqv\fR]
+[\fB--aegis=\fIPROJECT\fR]
+[\fB-f \fIFILE\fR]
+[\fB--number=\fINUMBER\fR]
+[\fB--outdir=\fIOUTDIR\fR]
+[\fB-p \fISTRING\fR]
+[\fB--python=\fIPYTHON\fR]
+[\fB-s \fIDIR\fR]
+[\fB--scons=\fISCONS\fR]
+[\fB--svn=\fIURL\fR]
+[\fIARGUMENTS\fR]
+..
+'\"--------------------------------------------------------------------------
+.de ST
+.B scons-time time
+[\fB-h\fR]
+[\fB--chdir=\fIDIR\fR]
+[\fB-f \fIFILE\fR]
+[\fB--fmt=\fIFORMAT\fR]
+[\fB-p \fISTRING\fR]
+[\fB-t \fINUMBER\fR]
+[\fB--title=\fITITLE\fR]
+[\fB--which=\fIWHICH\fR]
+[\fIARGUMENTS\fR]
+..
+.TH SCONS-TIME 1 "November 2006"
+.SH NAME
+scons-time \- generate and display SCons timing information
+'\"==========================================================================
+.SH SYNOPSIS
+.B scons-time
+.IR subcommand
+[
+.IR options ...
+]
+[
+.IR arguments ...
+]
+'\"--------------------------------------------------------------------------
+.SS "Generating Timing Information"
+.SR
+'\"--------------------------------------------------------------------------
+.SS "Extracting Function Timings"
+.SF
+'\"--------------------------------------------------------------------------
+.SS "Extracting Memory Statistics"
+.SY
+'\"--------------------------------------------------------------------------
+.SS "Extracting Object Counts"
+.SO
+'\"--------------------------------------------------------------------------
+.SS "Extracting Execution Times"
+.ST
+'\"--------------------------------------------------------------------------
+.SS "Help Text"
+.B scons-time help
+.I SUBCOMMAND
+[...]
+'\"==========================================================================
+.SH DESCRIPTION
+The 
+.B scons-time
+command runs an SCons configuration
+through a standard set of profiled timings
+and can extract and graph information from the
+resulting profiles and log files of those timings.
+The action to be performed by the
+.B scons-time
+script is specified
+by a subcommand, the first argument on the command line.
+See the
+.B SUBCOMMANDS
+section below for information about the operation
+of specific subcommands.
+.P
+The basic way to use
+.B scons-time
+is to run the
+.B scons-time run
+subcommand
+(possibly multiple times)
+to generate profile and log file output,