Version 0.1:

    - initial release

Version 0.2:

    - bug fixes
	(1) Core file handling deals with core.<pid> files
	(2) Overwrite with version (-o -v) works correctly
	(3) Versioned runs do not clean files for non-versioned runs
	(4) Order of selection fixed for "base versions"
    - updated UserGuide.html with information about TextTest test suite
      for itself, and a few new features introduced shortly before version 0.1

Version 1.0:

    - LSF development (lsf.py)
	Now plugs nicely into LSF's parallel functionality using the LSF_PROCESSES
	environment variable. Also exit correctly if lsf submission fails, and provide
	LSF_RESOURCE variable.
    - Batch mode development (batch.py)
	Can now "collect" several batch runs with use_collection:true to avoid multiple
	emails being sent.
    - Performance development (performance.py)
	Will now examine what's happening on the other processor of multi-processor
	machines and print a little message. This has been found to affect the performance
	due to competition for the memory bus.
    - "extra versions" development (texttest.py)
	Ability to say that a version is a default part of the application's test suite
	via the "extra_version" option
    - predictive specification development (predict.py)
	Now you can specify text that must be present using internal_compulsory_text,
	as well as text that may not be.
    - removed version inference functionality
	It was error prone. Better to infer the environment setup from the version
	than vice versa.
    - bug fixes
	(1) Handling of paths containing the "-" character
	(2) Handling of spaces in command line comma-separated lists
	(3) Removed infinite loop when "null characters" present in testsuite file
	(4) Improved error messages when no applications or no tests are found
	(5) Prevent internal environment variables from "leaking" outside where they are set
	(6) Some bug fixes for aggregated versions (-v a.b etc.)
	(7) Improved error handling when incorrect scripts given to -s option

Version 2.0:

    - Default configuration development (default.py)
	Added generic test suite filter
    - generic collation added (default.py/unixConfig.py)
	Should be very easy to add own files for comparison by creating CollateFile objects
	in configurations
    - GUI added! (texttestgui.py)
	For anyone with PyGTK installed this should make life a lot easier. It is essentially
	for monitoring the tests (rather than starting them) and is enabled with the new -g option.
    - major refactoring
	To accommodate the GUI, tests are now regarded as having various states: this makes them
	easier to observe and also removes a lot of global data.

Version 2.1:

    - Major GUI development (texttestgui.py)
	Monitoring of tests as they run, configurable plugin tools for file viewing, extendable plugin
	tools and a lot more besides...
    - Self test suite improved greatly (gtkscript.py)
	GUI can now be self-tested via the above script engine. Most functionality now self-tested.
    - Write directory behaviour changed
	Does not write to the current directory any more or require write permission to the tests. All
	temporary files are written to a separate tree. Of course, still need write permission to save
	the tests!
    - generic collation now in config file (default.py)
	Now collates all files from the config list "collate_file:source->target" instead of needing
	Python code
    - generic memory measurement added (default.py)
	Relies on applications reporting on their own memory usage in their log file
    - performance measurement available on UNIX (unixConfig.py)
	Doesn't require LSF any more, but works in the same way
    - run-dependent text collection improved greatly (comparetest.py)
	Can now filter out sections between markers and remove particular words from lines
    - bug fixes (it's been a while so I don't remember them all...)

Version 3.0:

    - Compatibility changes in config file format. If you are upgrading from TextTest 2.x, read the
	MigrationNotes file for details (otherwise just read the documentation). You will need to change
	your config files!
    - All config file entries now default sensibly (texttest.py)
	The only compulsory one (that will cause error if not present) is "binary" now.
	Unrecognised entries will produce warnings now too.
    - Static GUI added (texttestgui.py)
	This allows use of TextTest without messing with lots of command line options. Run with -gx option
	and experiment. It also provides a convenient means for adding new tests.
    - Improved record/replay layer (usecase.py/gtkusecase.py)
	Can now record use cases for non-GUI scenarios as well, and also record signals received by the
	process. This allows for testing for correct behaviour when the application receives signals.
    - Removed waiting behaviour from text interface (texttest.py)
	It works more like the GUI, constantly monitoring and reporting on tests as they finish, rather than
	proceeding in a particular order. This generally means things are reported sooner.
    - -grep filter added (default.py)
	Can now select tests by looking for text in their logfiles
    - sub-process management introduced
	Any processes started by TextTest (tkdiff, emacs etc.) are terminated when TextTest is terminated.
    - Integration with Xvfb (unixConfig.py)
	Useful if testing a GUI, by setting the list entry virtual_display_machine can prevent the GUI popping
	up.
    - Can specify unsaveable_version in config file (texttest.py)
	This means that certain versions can be marked as never wanting separate results saved for them. This
	saves a certain amount of time.
    - .texttest personal configuration file introduced (texttest.py)
	Config entries can be provided globally for individuals now.
    - Can now filter unordered text, as well as just run-dependent text (comparetest.py)
	The unordered_text entry works much like the run_dependent_text entry, except that matching lines
	are stored, sorted and produced in a section at the end.
    - various bug fixes and many more self-tests, including a suite for the LSF module.

Version 3.1:

    - Plug-in for bugzilla command line interface (bugzilla.py)
	Makes use of bugcli program to allow linking test failures to known bugs in bugzilla, thus
	saving time and being clearer when problems not immediately fixed.
    - Record/replay layer heading for independence (usecase.py/gtkusecase.py)
	Shortly available on sourceforge as PyUseCase a separate product! Already used in other programs
	than TextTest.
    - Record/replay layer enhancements (usecase.py/gtkusecase.py)
	Support for use-case script name changes and shortcut recording (see documentation), as well
	as automatic insertion of shortcuts
    - Can now wipe config file lists (texttest.py)
	Can be useful in overriding versions, use the syntax "base_version:{CLEAR LIST}"
    - Can force long tests on performance machines when using LSF (performance.py/lsf.py)
	Generally very long tests are there to test performance... "force_on_performance_machines"
    - Can change GUI defaults in config file (texttestgui.py)
	By changing text to lower case and inserting underscores:
	[gui_entry_overrides]
	follow_file_rather_than_view_it:0
    - Improving interface between static and dynamic GUI (texttestgui.py)
	Static GUI now displays errors on failed dynamic runs
	Separated temporary directories for the two
	Where tests have same name, reduced instances of more tests than requested being started.
    - Refresh abilities in static GUI (texttestgui.py)
	Will now handle some live updates, e.g. options file and re-ordering in testsuite file.
    - Various bug fixes
	A couple to do with the "Save All" button, clean up of extra write directories and some
	inconsistency fixed with the "slowdown job" feature of the LSF module.

Version 3.1.1:

    - PyUseCase now released separately (usecase.py/gtkusecase.py)
	But still packaged with TextTest along with ndict, ndiff and log4py
    - Magical 'checkout prepend' removed (texttest.py)
	Instead of this TextTest exports the environment variable TEXTTEST_CHECKOUT, and also allows configurations to export
	other application environment variables. This may require migration.
    - Login shell made configurable (unixConfig.py)
	Previously Bourne Shell (/bin/sh) was hardcoded. Now configurations can set their own: useful if all your setup
	is in C-shell starter scripts.
    - Added "quick start" guide for those too lazy to read the full documentation, see quickstart.txt in this directory.

Version 3.2:

    - Replaced dynamic GUI "performance" column with "details" column (texttestgui.py)
	This gives a better indication of roughly what happened in a test without having to click on each one individually.
	Also new config file entry "failure_severity" dictionary, which enables telling the GUI that certain files are less
	important and when they differ only the details column will go red, not the whole test.
    - Details column also present per file (texttestgui.py)
	Where several files differ this can be useful, e.g. to see performance percentages
    - GUI widgets improved (texttestgui.py)
	Now get radio buttons for some options and configurable drop-down lists for all text boxes
    - Improved GUI definition file concept (texttestgui.py,texttest.py)
	New config file entry "definition_file_stems" added so that custom files can be declared as definition files.
	Added diagnostic definitions as definition files.
    - Generic diagnostics plugin provided (texttest.py)
	Can now configure what is output via diagnostic configuration files placed anywhere in the test subtree, and also
	provide ability to turn on optional extra diagnostics for failure finding. Supports log4py and log4cpp, at least,
	as well as global "trace-level" style logging.
    - Can now save individual files in GUI (texttestgui.py)
	When several files change and only some of the changes are correct. Works via drop-down box in "Saving" tab.
    - Support slow motion replays for GUI tests (texttestgui.py)
	Where the target app is a GUI, it's fun to run the tests with the GUI popping up and a delay between, assuming
	the use-case recorder supports this (PyUseCase does). Enable via switch in GUI and "slow_motion_replay_speed" config
	file entry.
    - GUI settings generally preserved between tests now (texttestgui.py)
	Useful if similar actions want performing on several tests
    - GUI refreshing improved when files change external to tests (texttestgui.py)
	For example a cvs update of the tests while the GUI is running, or a file shared between tests being updated via
	a save of another test : the GUI will notice and recalculate differences when tests are selected.
    - Batch report summary includes brief details (batch.py)
	In fact, the same info that appears in the new GUI 'details' column.
    - Ordering improved in batch reports (batch.py)
	Most useful information now nearest the top
    - Dump state info when in batch mode (batch.py)
	This means that anything can be reconnected to and reported as in the batch report
    - Batch report message subjects made briefer (batch.py)
	For the sake of those with limiting line-length news readers...
    - Reconnection performance improved (default.py)
	Does not regenerate file filters by default, special option for this now
    - Added filter script comparetest.RemoveObsoleteVersions (comparetest.py)
	Useful for pruning away obsolete version files (identical to base) if these have accumulated
    - Improved handling of unrunnable tests, especially when machines fail (comparetest.py)
	No results does not mean 'green' in GUI any more...
    - Performance test machines in LSF now based on bsub -m, not bsub -R (lsf.py)
	This makes things more flexible as host groups can be used, and less error prone in combining with other ways of
	specifying LSF resources.
    - LSF information now collected via a separate daemon thread (lsf.py)
	This improves response time to LSF changes and also puts less of a load on the LSF server, as all tests can be
	updated via one LSF call rather than one per test. Also more reliable as uses unique job IDs to identify them.
    - Framework handles temporary files being removed externally (texttest.py)
	giving error messages rather than crashing
    - --help improved when no apps found (texttest.py)
	Will now say something intelligible, anyway.
    - lots of more minor bugfixes

Version 3.3:
    - LSF module now faster and more reliable (lsf.py)
	TextTest submits itself remotely to run as a slave and report back. This stops the master process spending a long
	time comparing lots of files, and prevents NFS update race conditions causing trouble.
    - Reconnection improvements (default.py)
	Now reads the same objects as the normal remote operation, so will more reliably show the same things
    - Machine names collected more reliably (unixConfig.py)
	Should now report machine names in most cases on UNIX
    - JUseCase integration (texttest.py)
	Can now test Swing GUIs also if JUseCase used.
    - log4j integration (texttest.py)
	Via a similar mechanism to the support for log4cpp and log4py
    - Environment variables referencing each other should work better (texttest.py)
	There were some problems when variables at general levels of the test tree referenced variables
	set at specific levels.
    - 'extra_versions' config file setting now a list (texttest.py)
	This allows for several apps to be grouped easily, for API testing.
    - Can now use 'save single file' option with the 'Save All' button (texttestgui.py)
	This combination crashed before...
    - Can now use 'link_test_path' feature in config file together with 'recompute file filters on reconnection' option.
	This combination also didn't work before.
    - Minor bug fixes as follows:
    - Viewing filtered files after saving now shows the new file (comparetest.py)
    - Versions and 'permanent' diagnostics now work together (comparetest.py)
    - Fixed crash monitoring background processes (texttestgui.py)
    - Fixed bug with creating a test suite before creating any tests (texttestgui.py)
    - Saving copies files rather than removing them (comparetest.py)

Version 3.4:
    - Integration with Sun Grid Engine (sge.py)
	SGE is similar to LSF but is free and open source. The features of the LSF plugin are now also available
	in SGE. Several of these have been renamed to be more generic, see the migration notes.
    - Improved difference reporting in GUI (comparetest.py)
	A textual representation of the differences appears under the Text Info tab now. For simple differences,
	this saves firing up graphical difference tools on small files.
    - Can now specify performance machines in a queue system via resources rather than hosts or host groups (queuesystem.py)
	This is done by the new config file setting "performance_test_resource". Indeed it is the only way in SGE.
    - Introduced line wrapping for long output lines (comparetest.py)
	This is useful for example in batch mode where newsgroups reject TextTest reports due to
	long lines. Config file setting called 'max_width_text_difference' defaulting to 900.
    - Unfolding tests in the tree view in GUI now unfolds all (texttestgui.py)
	This is deemed to be more useful as it reverses the folding procedure
    - Date of run now printed in window title (texttestgui.py)
	Helps to distinguish between different runs
    - Minor bugs as follows:
    - Leading and trailing spaces now work in run_dependent_text (comparetest.py)
    - Numeric comparison requirements now work for LSF (lsf.py)
    - Viewing files after saving them now always shows the correct one (guiplugins.py)
    - Composite versions now work correctly when one of them has extra_version set (texttest.py)
    - Signal recording now disabled for queue system slave processes (lsf.py,sge.py)
    - Temporary directories no longer contain colons, this causes problems for the Java classpath (texttest.py)

Version 3.5:
    - Support for Windows XP introduced (default.py)
	All features supported on UNIX are available in some form on Windows where appropriate. This has
	meant the demise of the 'unixConfig' configuration, which is now inferred by using the default
	configuration on UNIX.
    - Performance-related functionality overhauled and generalised (performance.py)
	Can now extract any system-performance related number from available log files. See
	migration notes for details.
    - Can now copy tests from static GUI (texttestgui.py)
	New tests are often slight tweaks of existing ones, this speeds things up.
    - Wildcard characters now allowed in config entries for grouping similar-format files (default.py)
	The file stems in the [run_dependent_text], [unordered_text], [failure_severity] and
	[collate_file] sections can all contain '*' to avoid repetition where many similar
	files are produced.
    - Version handling in static GUI greatly improved (guiplugins.py)
	All tests are shown, even if not present in default version, can now select based
	on version and sensible defaults for version-related fields.
    - Changed batch mode collection behaviour (batch.py)
	Files for collection now written to temporary directories, and if mail cannot be sent
	better diagnosis is present.
    - Catalogue file functionality overhauled (default.py)
	Only reports changes now rather than all files present, which was a bit volatile.
    - Can now mark tests as 'known bug' without needing to link them to bugzilla (knownbugs.py)
	A simple description is often enough and not everybody has bugzilla...
    - Minor bugfixes as follows
    - 'Save All' in dynamic GUI now ignores tests marked as 'known bug' (texttestgui.py)
    - Static GUI informs the user better when collecting standard files after recording a usecase file. (texttestgui.py)
    - Error conditions when creating tests in static GUI handled much better (texttestgui.py)
    - Viewing new files now works correctly from text interface (respond.py)
    - Error message now given when incompatibile test/version combinations started from GUI (texttest.py)
    - Filtering words beyond the end of lines now works better (comparetest.py)
    - -keeptmp option also keeps UNIX core files now (unixonly.py)
    - Removed unnecessary check for refresh on test creation (texttestgui.py)
    - log4py version upgraded to 1.3.1 to get fixes for Windows (log4py.py)
    - Disabled search of directory structure under test directory, which can waste lots of time (comparetest.py)

Version 3.5.1
    - Bugfixes for Windows XP from 3.5:
	Recording usecases now works properly
	Self-tests stabilised a bit
	"Baretail" introduced as default for 'follow_program' (see readme file)
    - SGE plugin speeded up considerably (sge.py)
	Removed calls to qacct which were extremely time-consuming.
    - Simplified test filter logic to do only one pass through tests (texttest.py)
	The main consequence is that exact matches on test names no longer eliminate sub-text matches.
	Regular expressions can be used to achieve exact matches.
    - Added summary line to 'Text Info' window in dynamic GUI (texttestgui.py)
	This lists the execution host and state of the test
    - Can now filter multiple words from a line in run_dependent_text (comparetest.py)
	Using the syntax some_line{WORD 4+} will remove word 4 onwards from the matched line
    - Performance extraction from log files now parses the format hh:mm:ss (default.py)
    - Minor bugfixes as follows:
	Reconnect with -reconnfull option and -b option cleaned previous tmp dirs (default.py)
	Reconnect with -reconnfull option sometimes reconnected to itself (default.py)
	GUIs from the system under test sometimes got sent to the real display if tests run together
	with a non-GUI application (unixonly.py)

Version 3.5.2
    - More bugfixes for Windows XP (plugins.py)
	Finding child processes no longer crashes occasionally
	No longer have to have administrator rights in order to run the static GUI (!)
	Doesn't consume CPU while monitoring processes any more
    - Self-tests enhanced to no longer mock out external processes (guiplugins.py)
	Enhanced experience viewing them, less corners that can't be tested, and less
	suspectible to platform specific tool problems being missed by the tests
	(like the xterm one on Windows fixed in 3.5.1.)
    - Usability bugfixes based around newbie usage at XP2005 and Europython (texttestgui.py)
	No longer stack traces if you start the static GUI with no or invalid apps
	Sensible error message if you try to run an application as if it were a test
    - SGE plugin fixes (sge.py)
	Takes account of SGE's file rotation scheme for finding exit status of jobs
	Lengthened the sleep between polls to check job status, makes it less prone to busy-wait under load

Version 3.5.3
    - Added ability to specify directory for finding test list files in (testmodel.py)
	Now use the "test_list_files_directory" config file setting to configure this.
    - Increased maximum allowed size of stack trace print out (predict.py)
	It's now 50000 characters after complaints that 10000 wasn't enough...
    - Static GUI now writes the output of each dynamic run to a different file (guiplugins.py)
	This prevents confusion and allows simultaneous dynamic runs on Windows
    - Banned test names from containing spaces (guiplugins.py)
	This was previously allowed but produced tests that could not be run due to quoting problems.
    - Minor bug fixes:
	Removed most of the deprecation warnings produced by the GUI in GTK 2.6.8 (texttestgui.py)
	Fixed crash on double clicking the "Comparison Files" lines in the dynamic GUI (texttestgui.py)

Version 3.6
===========
Major Enhancements:
    - New webpage generation for batch reporting (testoverview.py)
	Gives possibility to see long-term trends in the tests, as well as a convenient way to navigate static results
    - Run dependent text syntax extended (comparetest.py)
	Can now both replace matched text and match on TextTest's own temporary paths
    - Enhanced comparison to report missing files properly (comparetest.py)
	Instead of generating fake files only when collating, actually report missing files as missing now.
    - Test data handling for UNIX improved (default.py)
	For programs that can potentially edit large amounts of test data, a new config
	entry "partial_copy_test_path" is provided. This means that you can copy just the
	parts of the data structure that are going to change and link the rest, instead of
	copying all of it.
GUI Enhancements:
    - GUI now collapses test suites automatically when every test succeeds (texttestgui.py)
	This can be configured via the config file entry "auto_collapse_successful"
    - Can now remove tests via the static GUI (texttestgui.py)
    - GUI displays how many tests are currently selected (texttestgui.py)
    - When tests are selected via the select dialogue, GUI will scroll to the first one (texttestgui.py)
    - Can now save a selection of tests (texttestgui.py)
	instead of saving one by one or saving all
    - Keyboard shortcuts added for most GUI actions (texttestgui.py)
    - Can save selections of tests to file from the GUI (texttestgui.py)
	Both the actual tests selected or the criteria used to select them.
	Useful for defining subsets of tests, for example for nightjobs.
    - Static GUI title now more informative (texttestgui.py)
    - Specific GTK resource file for texttest now provided (texttestgui.py)
	Now read .texttest_gtk as well as .gtkrc-2.0 so that look and feel can be configured separately from other GTK apps.
    - Test suites now rendered in bold (texttestgui.py)
	Seems to make it easier to read the test view
Framework Enhancements:
    - ndiff.py removed as default comparator on Windows (comparetest.py)
	diff is now default everywhere as it is provided with tkdiff anyway. ndiff was shown to be very slow for larger files.
    - Behaviour of Test Suites Containing field (-ts flag) changed (default.py)
	It now searches on the whole path of the testsuite, eliminating some unexpected behaviour
    - test filter files can contain filtering operations (default.py)
	The files used by the -f option are no longer restricted to long lists of tests.
	Application/version specific ones can also be created.
    - catalogue functionality now reports file/directory edits (default.py)
	Previously it only reported file creation and deletion.
    - "checkout_location" config file entry is now a list (testmodel.py)
	This makes it easier to share a testsuite between users who check out the system and those who don't
    - More syntax supported by mechanism for requesting tests based on execution time (default.py)
	The '-r' flag will now accept syntax of the form hh:mm as well as ranges such as "<=10:00"
    - TEXTTEST_HOME variable is always set internally (testmodel.py)
	This means it can be referred to in environment and config settings, even if not set from the command line
Grid Engine (LSF/SGE) enhancements:
    - Major refactoring of queuesystem module (queuesystem.py)
	Slaves now communicate with the master process via sockets rather than relying
	on master polling the queuesystem. Makes it much easier to add new grid engines
	besides SGE/LSF, and less prone to the vagaries of these products.
    - Tests that hit LSF/SGE queue limits handled in a better way (queuesystem.py)
	They are reported as 'killed' and partial results are collected
    - No longer hang forever if the grid engine refuses to delete jobs (queuesystem.py)
	We abandon if the job isn't deleted the 600th time we check...
Bug Fixes:
    - Fixed race condition starting tests on Windows (plugins.py)
	If test completed before TextTest found the process info, hangs occasionally resulted
    - Fixed excessively long command lines starting dynamic GUI on Windows (texttestgui.py)
	Starting very large numbers of tests at once could lead to exceeding maximum command lengths
    - Static GUI no longer picks up files with extra text appended to the name (testmodel.py)
	The classic symptom of this was emacs backup files being read.
    - Fixed crash doing Save All with a single file (texttestgui.py)
	It crashed if some test had the single file as the only difference
    - Errors produced when recording GUI tests are now shown in a nice dialogue box (guiplugins.py)
    - Collating multiple files fixed for multiple locally run tests (default.py)
    - Fixed bug where reconnection could trigger recalculation of results even when recalculation not requested
    - Fixed bug in reconnection with recalculation (default.py)
	It failed when the teststate files were not present at all
    - Batch runs no longer fail if removing previous runs not possible (batch.py)
    - Bug fixed with the known bugs feature (knownbugs.py)
	Differences in one file could trigger known bugs on another
    - Fixed crash when a known bug coincides with the test being killed in the grid
	engine (queuesystem.py,knownbugs.py)

Version 3.7
===========
Major Enhancements:
    - GUI layout revamped after various usability complaints (texttestgui.py)
	This is described in more detail in the migration notes.
    - Recording tab enhanced (guiplugins.py)
	Various improvements for flexibility and stability. See migration notes for details.
    - Directory caching introduced in core framework (testmodel.py)
	This means TextTest is nicer to file servers and tends to start up somewhat quicker on large test suites
    - New mechanism for prioritising version files against each other (testmodel.py)
	By using the config file entry "version_priority" can now get round the old undefined behaviour
	of deciding whether to use .a or .b files if version a.b is run.
    - Redundant config file syntax introduced (testmodel.py)
	If a dictionary entry only wants to change the default key, it is OK to pretend it is a simple entry
GUI Enhancements:
    - All development moved to PyGTK 2.4.13 (texttestgui.py)
	Previous used PyGTK 2.2.4 which was old. ComboBox deprecation warnings should be gone now.
    - Progress Bar added to dynamic GUI (texttestgui.py)
	So you can see at a glance how many tests are completed if they don't fit on one screen
    - Selection dialogue enhancements (guiplugins.py)
	It now allows multi-stage selection, by allowing you to extend and refine existing selections
    - Can now configure whether TextTest kills all started processes on terminating (texttestgui.py)
	It will still do this by default but you can tell it to ask you first via the new config file entry "query_kill_processes".
    - Status bar added at the buttom of the GUI (texttestgui.py)
	This informs you what TextTest is doing if it takes a little while
    - "Use checkout" dialogue displays default value and reads command line -c options (guiplugins.py)
	Should be more obvious what is being tested
    - Can now view and edit personal configuration files ".texttest" and ".texttest_gtk" from GUI
	This is present in the application view in static GUI
    - Can now configure file viewers per file type
	Essentially "view_program" is now a dictionary with keys as the file stems
    - Copying tests now also copies log definition files and data files (guiplugins.py)
    - Static GUI now refreshes test views when tests are run (texttestgui.py)
	New files can always be saved by the dynamic GUI and should be shown automatically
    - Remove button now has an "Are you sure?" dialog (guiplugins.py)
	Hopefully less people will remove their tests by mistake...
    - Can now run static GUI in the background (guiplugins.py)
	Removed stdin links to the started dynamic GUIs
    - Can now configure the window size from .texttest (texttestgui.py)
	Using the new config file entry "window_size"
    - "Quit" button is no longer the default widget (texttestgui.py)
	This tended to cause unwanted exits if the GUI took a while to start up
    - Set-up failure in one of several apps in the dynamic GUI now displays better (texttestgui.py)
	New "set-up failed" category for this instead of just remaining white
    - Various cosmetic changes (texttestgui.py)
	For example scrollbars are only displayed if they are necessary, and it's now possible to adjust the size
	of the panes
Framework Enhancements:
    - Now possible to collate files using a plugin script instead of just copying them (default.py)
	New config file entry "collate_script" makes this easy to do.
    - Virtual display (Xvfb) handling much more sophisticated (unixonly.py)
	It is now properly tested, and handles a few more cases: machines being down, only local connections being accepted,
	VNC connection errors, failure to kill unusable servers etc.
    - No longer assumes console is the default interface (default.py)
	There is a config file setting "default_interface" which defaults to the static GUI.
    - Can now generically ignore some parts of test data structures (testmodel.py)
	The "test_data_ignore" config setting allows this. Side-effect is that catalogue files are sorted alphabetically.
    - Added external "search path" for test data (testmodel.py)
	Besides finding test data via environment variables or directly from the test tree, can now specify extra
	locations to act as default via "test_data_searchpath" config file setting
    - Overwrite option (-o) has reverted to its version 3.5.3 behaviour (respond.py)
	It now saves the full version specified again. In version 3.6 this was changed to try to fix the version problem
	in the recording dialogue, but that is now fixed properly - see elsewhere.
    - Empty test suites handled much better (testmodel.py)
	Correctly identify when testsuite files contain only nonsense, don't display empty suites except in static GUI
    - TEXTTEST_CHECKOUT setting set much earlier (testmodel.py)
	This means it can be referenced by most other config file settings and all environment files
    - Allow automatic sorting of test suites (testmodel.py)
	There is a config file setting "auto_sort_test_suites" now. If this is set the order in testsuite
	files is ignored and everything is displayed alphabetically.
    - Core file collection enhanced for UNIX (default.py)
	Uses the new collate_script entry above and is now a separate script interpretcore.py. Handles many
	more platforms and core formats correctly.
    - Java application fixes (testmodel.py)
	If a Java class is being tested, don't test if the file exists. Also infer java as interpreter where possible.
    - Filter for TextTest's own temporary paths "{INTERNAL writedir}" now delimited by quotes as well as spaces (comparetest.py)
	It tended to match too much if the path was quoted
    - batch.ArchiveRepository script picks up deleted tests (batch.py)
	It now operates on found files, not on the tests that exist today
Grid Engine (LSF/SGE) enhancements:
    - Can now set priorities for SGE jobs (sge.py)
	Typical usage is to ensure that they can be submitted in some sort of execution-time order: fastest first
    - Job names in SGE/LSF easier to read (queuesystem.py)
	They don't include the user name and time any more and the test name comes first
    - Save dialogue correctly provides average performance radio button (guiplugins.py)
	It didn't do this before if performance was enabled via "performance_test_resource"
    - "Ignore catalogue when isolating data" option now works with queuesystem module (queuesystem.py)
    - Will now work correctly if master and slave processes run with different locales (testmodel.py)
	Ensure a common temporary directory and hence that running processes can be viewed
    - SGE lists owners of other jobs correctly in performance file (sge.py)
	Previously it claimed everything was owned by the owner of the first job
    - Explicit shell login ("login_shell" config file setting) moved to queuesystem configuration (queuesystem.py)
	It was also present in local mode but seemed mainly useful for grid engines.
	It occasionally caused environment settings to be overridden.
Bug Fixes:
    - Fixed problems on Windows when pslist doesn't work properly (texttestgui.py)
	Seems to occasionally decide that something else is using its file.
    - Missing filter files (-f option) no longer cause all tests to be selected (default.py)
	Instead of printing a warning we now consider this an error and select no tests
    - "partial_copy_test_path" isolation now preserves local symbolic links (default.py)
	Previously it replaced them with links to the master data
    - Quote user input when generating dynamic GUI command lines (guiplugins.py)
	You never know what illegal command-line characters the user might write.
    - Webpage generation now displays differences in HTML/XML files correctly (testoverview.py)
	Use <PRE> to stop it interpreting this as tags in the page
    - Diagnostic files always have correct version identifiers displayed in GUI (texttestgui.py)
    - Fixed GUI-testing bug: don't set up for record unless record requested or a usecase already exists (texttestgui.py)
    - Fixed crash in execution-time based selection (-r option) when blank hours/minutes/seconds provided (default.py)
    - Fixed annoying stack trace popups when dynamic GUI quit while tests were still being set up (engine.py)
    - Fixed crash selecting all tests immediately after a test removal (texttestgui.py)
    - Adding a test no longer causes manually collapsed test suites to re-expand (guiplugins.py)
    - If tests only exist in an "extra_version", don't warn about non-existent tests on the main version (engine.py)
    - Collating multiple files with "." characters in the name doesn't get confused any more (default.py)
    - Ctrl-C from console interface no longer causes test dialog to be repeated (respond.py)

Version 3.7.1
=============
Framework enhancements:
    - Plugin scripts (-s option) will no longer be rejected by the framework if no tests are found (engine.py)
	- sometimes they only act on the application anyway.
    - A couple of config file defaults changed:
	"view_program" now defaults to "emacs" rather than "xemacs" on UNIX, as it is slightly more universally available
	"slow_motion_replay_speed" defaults to 3 instead of 0 (this was more or less a bug)
LSF/SGE enhancements:
    - Unrunnable tests will always report the machine they run on (engine.py)
	Previously some "hard" failures could cause the machine not to be reported
    - performance_test_resource entry now works when machine names in SGE are 'short' (sge.py)
	Previously it only worked if the full domain name was in SGE.
    - If tests report as running but then get terminated hard (e.g. SIGKILL), report them as "killed" (queuesystem.py)
	Previously reported confusingly as "abandoned" - but there was nothing to abandon
    - Finding information in older accounting files in SGE now works (sge.py)
	There has been code lying around to do this for some time but it's never worked until now...
Bug Fixes:
    - Fixed crash on removing tests after starting static GUI from scratch (texttestgui.py,testmodel.py)
	Showed up if the GUI was started with only a config file available.
    - Removing last test from a test suite now removes it from the GUI display also (texttestgui.py)
    - Test completion time on progress bar is now always correct (texttestgui.py)
	It tended to update itself to the current time when clicking around...
    - Collation of files to names containing "." characters is now forbidden (default.py)
	It violates TextTest's naming conventions and hence causes trouble
    - 'Text Info' and 'Viewing' tabs now always appear in the same order (guiplugins.py)
	Viewing tests that were pending in SGE/LSF could cause them to switch before.
    - No longer show spurious files in the static GUI if full temporary path contains "." characters (testmodel.py)
    - External viewers can be started even if the path to the file contains spaces (guiplugins.py)
    - If the script for interpreting core files on UNIX fails, it no longer causes a TextTest crash (predict.py)
    - Fixed crash when an extra_version is rejected for a batch run via batch_version (engine.py)
    - Test data identified by environment variables can now be used as keys in "test_data_searchpath" (default.py)
    - Disable interactive dialogue in console interface after ^C has been pressed (respond.py)
Test Fixes:
    - A certain amount of work done stablising the self-tests and reducing the probability of occasional failures,
      particularly the tests for SGE/LSF.

Version 3.8
===========
System requirements:
    - To run GUI, now need at least Python 2.3 and PyGTK 2.4. Support dropped for Python 2.2 and PyGTK 2.2.
	Console interface still supported with Python 2.2.
Major Enhancements:
    - GUI layout revamped for usability and standardisation (texttestgui.py)
	Looks more like a "normal" GUI now. This is described in more detail in the migration notes.
    - Test selection mechanism added to dynamic GUI (texttestgui.py)
	Can now both select and hide groups of tests that are in similar states. Can also save the selections made.
    - "Known bugs" functionality overhauled and integrated with "Internal errors" (knownbugs.py)
	See migration notes for more details. Many more things are now possible.
    - New "traffic interception mechanism" introduced (traffic.py)
	Can record and replay the results (stdout/stderr/exit status) of command-line programs.
	Can also intercept network textual traffic and replay it, allowing client/server tests
	without the whole system present.
General GUI Enhancements:
    - Tests are now selected with single-click instead of double-click (texttestgui.py)
	Cannot now have different "viewed test" and "selected test" causing confusion.
    - Test tree header now shows total number of tests and total visible as well as total selected (texttestgui.py)
    - Status bar is now more informative and accurate (texttestgui.py)
	Even has a Firefox "throbber" to show you when something is happening
    - Buttons/tool items are greyed out and tabs hidden in contexts where they don't make sense (texttestgui.py)
    - Tooltips widely introduced (texttestgui.py)
	Especially for elements that are hard to understand
    - Text in error/message dialog boxes is now copyable (texttestgui.py)
    - Can now hide and show menubar/toolbar/status bar/shortcut bar via a "View" menu (texttestgui.py)
	Also standardised the config file settings for these into a single "hide_gui_element".
    - Configurable keyboard accelerators now added (texttestgui.py)
	Use the "gui_accelerators" section to change or add more.
    - Text boxes in tabs are now the same width as each other (texttestgui.py)
    - Layout configuration enhanced (texttestgui.py)
	New entries in [window_size] section of config file allow maximising window and configuring pane separator
	positions.
Static GUI Enhancements:
    - Test tree is now tests and suites only, and each only appears once (texttestgui.py)
	Previously had "application" lines, and several versions would mean showing the same test several times.
	Can now access config files via a separate "Config" tab.
    - When adding or copying tests, can now select positions other than the end of the suite (guiplugins.py)
    - Tests can now be moved to other suites or renamed in place (guiplugins.py)
    - Removing tests now operates on all selected tests, so can remove several at once (texttestgui.py)
    - Can now create standard TextTest files via the static GUI (guiplugins.py)
	New tab replaces and generalises old "New Diagnostics" button
    - Now uses Text Info tab to display test description (texttestgui.py)
    - Can now "report known bugs" directly from the GUI ("Bugs" tab) (guiplugins.py)
    - "Reconnecting" to previous results separated from "running" in the static GUI (texttestgui.py)
	Now has its own tab and button, making it easier to use and configure separate from running.
    - Can now configure to start with all subsuites collapsed (texttestgui.py)
	New config file entry "static_collapse_suites". Good for users who work on a small part of a large suite.
    - Can check a box in selection tab to also select in subsuites that are collapsed (texttestgui.py)
Dynamic GUI Enhancements:
    - "Save single file" drop-down list replaced with selecting multiple files in file view (texttestgui.py)
	Means that more than one, but not all, files can be saved when saving tests in the dynamic GUI.
    - Improved how running tests are viewed (texttestgui.py)
	Rather than dynamic info updating running info when test is selected, request it explicitly via new
	"Update Info" button.
    - Unicode handling improved in Text Info tab (texttestgui.py)
	Should now be able to display non-ASCII characters written by tests OK
    - Cannot select test suites or file view header lines any more (texttestgui.py)
	Nothing useful happened anyway.
    - Can now configure the order in which files get displayed in the Text Info tab (texttestgui.py)
	New config entry "failure_display_priority", see online docs.
Framework Enhancements:
    - Checkout mechanism enhanced (default.py)
	Can now infer them from batch sessions and identify checkouts using other than the last path element.
	See online docs (e.g. link to -c option) for details.
    - Can now share information between different applications' config files (testmodel.py)
	New config option "import_config_module"
    - Can now associated batch sessions with filter files (batch.py)
	This makes it much easier to define a subselection of test suites for batch runs, if things like timelimit
	cannot be used
    - "batch_version" mechanism for not running versions in batch mode now disabled by default (batch.py)
	New setting "batch_use_version_filtering". All versions are allowed unless this is set.
    - Reconnecting to previous results now works with any directory (default.py)
	Previously assumed another user's of the standard format only.
    - Reconnecting to previous results now automatically recomputes if a saved state file can't be found (default.py)
	Should save some effort in restarting with the recompute file filters flag.
    - File collation automatically ignores files that have not been changed by the test (default.py)
	This to avoid irrelevant data in the test baseline.
    - Can now configure a max file size to allow file comparison (comparetest.py)
	"text_diff_program_max_file_size" config file entry. Very large files can take forever to compare with diff.
    - Temporary directory name format simplified (default.py)
	No longer contains the user name, which should be irrelevant.
    - Allow faking of Python modules and Java classes as well as command line programs (testmodel.py)
	Now set PYTHONPATH and CLASSPATH to include the test directory.
    - Behaviour of "performance_test_minimum" setting changed (performance.py)
	Performance differences now triggered if either stored or generated performance is above the minimum
	Previously it had to be both.
Grid Engine (LSF/SGE) enhancements:
    - When grid engine jobs are abandoned by TextTest, it now says what the job ID was (queuesystem.py)
Bug Fixes:
    - Reset button is better at radio buttons now (texttestgui.py)
	Previously tended to not reset them in some circumstances
    - Selecting by version in the static GUI now works better (guiplugins.py)
	Problems before when trying to select an "extra_version".
    - Don't use the last selection criteria when running tests from static GUI (guiplugins.py)
	This tended to cause the wrong tests to be run sometimes
    - Large test selections can now be run on Windows XP (guiplugins.py)
	Previously all tests were written to command line and Windows has a max command line length.
	Now use a temporary file instead.
    - Directory for saving selections is now created on demand if it doesn't exist (guiplugins.py)
	By default the "filter_files" subdirectory of the application directory
    - Reconnecting to a test that was killed no longer causes test to complete twice (default.py)
	...which led to some strange GUI effects, like the progress bar exceeding its maximum
    - Reconnecting to previous results now ignores checkout, even if invalid (default.py)
	After all, it doesn't get used.
    - Multi-OS test suites will now work even if they "live" on Windows(!) (comparefile.py)
	"home_operating_system" worked fine if it was "posix" but not if it was anything else...
    - When dynamic GUI run with several apps, if some can't be run they aren't displayed any more (texttestgui.py)
	Previously got lots of rows that just stayed white
    - When batch mode run with several apps, if some can't be run they get left out of the reports (batch.py)
	Previously got a report saying 0 tests ran.
    - GUI doesn't start with the focus on the Quit button any more, making accidental quitting harder (texttestgui.py)
    - "Extend" option in Select Tests tab works even if no common test suite with previously selected tests (guiplugins.py)
    - Can now view file names with spaces in also in diff/tkdiff (guiplugins.py)
    - If there is no file permission to remove a test, give error dialogue rather than looping (guiplugins.py)
    - Status message for recording use-cases end up in the status bar rather than the Text Info window. (texttestgui.py)
    - Saving partial results now updates the Text Info tab properly (texttestgui.py)
    - "gui_entry_override" setting now works for radio buttons in groups larger than 2 (texttestgui.py)
    - Fixed problem where one application having an invalid filter_files directory caused others not to run (default.py)
    - No longer reject test names if the name exists in a subsuite: only check the local suite (guiplugins.py)
    - Dialogs are now transient for the main window and cannot be hidden by it (texttestgui.py)
    - Stack trace no longer given if a version is repeated on the command line (testmodel.py)
    - Stack trace no longer given if a lone dash is given on the command line (testmodel.py)
    - Stack trace fixed when a test's relative path to TEXTTEST_HOME also exists in TEXTTEST_HOME (testmodel.py)
    - Stack trace no longer given when trying to view a data file which has a TextTest standard name (texttestgui.py)
    - If parts of the test suite are externally removed, selecting tests will not stacktrace any more (guiplugins.py)
    - When running batch mode and GUI simultaneously with multiple apps, fixed default save version(!) (batch.py)

Version 3.9
===========
System requirements:
    - TextTest now requires at least Python 2.4 (all interfaces).
	This is because process management is vastly improved there.
    - TextTest GUI now requires at least PyGTK 2.6 also.
	This is mostly because PyGTK 2.4 had some stability problems around the tree view filtering.
    - No longer requires special process management tools (pstools and handle) on Windows XP.
	But pskill (only) still needed on Windows 2000.
Major Enhancements:
    - CVS integration (cvs.py)
	For those source-controlling their tests with CVS, you can now get log, diff and status information from the GUI.
	Use "interactive_action_module:cvs" somewhere in your configuration to enable.
    - Filter-file handling greatly improved (guidialogs.py)
	Now makes use of standard file-choosers to find and save them
    - log4x configuration files now have the standard name logging.<app>
	See migration notes for more details
General GUI Enhancements:
    - Status bar now says when an external viewer has been started (texttestgui.py)
	Should help prevent viewers being started repeatedly when system is slow
    - Now possible to personally configure all the menus and toolbars via XML (texttestgui.py)
	Can also configure this for derived configurations.
    - Now use a fixed-width font (Courier) in the Text Info window (texttestgui.py)
	Textual differences often look better when vertically aligned
Static GUI Enhancements:
    - Rename Test now present in popup menu (guiplugins.py)
	Was previously possible only via a weird form of copying the test. Also allows editing the description.
    - "Remove" button can now remove individual files if they are selected (guiplugins.py)
	Also present in popup menus.
    - Better functionality for sorting tests (texttestgui.py)
	This can now be done persistently via the Edit menu, or temporarily by clicking the column header
	(As well as automatically as in 3.8 via the "auto_sort_test_suites" config file control)
    - Sorting the tests will now put all tests before all suites (guiplugins.py)
	Previously interspersed them alphabetically which got messy when suites contained both tests and other suites.
    - New File tab now supports version identifiers (guiplugins.py)
	Easy to create version-specific files from the GUI now
    - Text Info tab now shows expected performance and memory usage, if available (texttestgui.py)
	In 3.8 we starting using this to show the test description
    - Help menu and About tab added (guidialogs.py)
	You can now see at a glance what versions you're using and read migration notes from the GUI
    - Default colours changed (texttestgui.py)
	The pale green and purple were not well liked. The static GUI is now grey throughout.
	But you can of course configure it via "test_colours" and "file_colours" in the config file.
    - Reconnect action is now present in menus/toolbars (guiplugins.py)
	Don't need to go the Reconnect tab now if the defaults are correct
    - Confirmation dialog when removing tests now makes it clear that you're about to remove files in the file system (guiplugins.py)
    - Now get a warning if you try to run more than one GUI test with slow motion replay enabled (guiplugins.py)
Dynamic GUI Enhancements:
    - Viewing tab replaced by popup menu in file view (guiplugins.py)
	See migration notes. Right clicking the file now gives you a menu of viewers to choose from.
    - If only one test is run, it is now auto-selected (texttestgui.py)
	Seemed to save a bit of time as one test is often run repeatedly when debugging.
    - Can now save crashed or killed tests if you really want to (comparetest.py)
	Get a warning instead of not being allowed to. Can be useful to save at least some files.
    - Recomputation can now handle change of version to compare against (texttestgui.py)
	Previously didn't react if a new versioned file appeared when previously comparing with the master version...
Framework Enhancements:
    - Personal configuration file names changed and Windows has a sensible default location (plugins.py)
	See migration notes. Now a directory as it can house quite a few different things.
    - Can now handle files that should be missing only in a version: auto-generate a marker file (comparefile.py)
	See migration notes. Previously difficulties if the master version had a file that derived versions didn't
    - A version of the virtual server functionality introduced on Windows (default.py)
	Tested GUIs are now hidden by default. Note however that their dialogs aren't :)
	Not great but better than nothing. Will hopefully figure out a better way in the future.
    - Virtual server functionality doesn't rely on "rsh" any more (unixonly.py)
	Means that "virtual_display_machine:localhost" should work fine even if no permission for rsh.
    - Don't test virtual server more often than necessary now when running multiple apps (unixonly.py)
	For GUI testing on UNIX: previously checked for every app and every version
    - Virtual server's display number is now configurable (unixonly.py)
	Now use the config entry "virtual_display_number". Previously hardcoded to 42.
    - Command-line/client-server traffic replay enhanced (traffic.py)
	Can now handle repeated inexact matches with the recorded traffic.
	Previously could only handle matches that were either repeated or inexact.
    - Tightened up version requirements for Python and PyGTK (texttest.py/texttestgui.py)
	Could previously just stacktrace if your versions were too old. Now get error messages.
    - Filter files / saved selections now separated with linebreaks to make them easier to compare (default.py)
    - default.ReplaceText script can now handle regular expressions in the text to replace (default.py)
    - .rb files now automatically recognised as Ruby (plugins.py)
Batch Report Enhancements:
    - -name option added that can identify batch runs other than by date (batch.py)
	Useful for testing actual releases where the release number is more important than the date of the run.
    - Plain text report now groups tests per line in the same way as the HTML report (batch.py)
	Previously wrote them all on one line which was hard to read and could cause newsgroups to bounce the mail
    - HTML tables in the pages are now generated with more standard HTML which is easier to parse (testoverview.py)
	Useful for scripts that want to extract basic information from the test results
Grid Engine (LSF/SGE) enhancements:
    - If submission to LSF or SGE fails, now display the full command provided to aid in debugging (queuesystem.py)
	Generally it's because wrong resources or queues have crept in somewhere
Old functionality removed (see migration notes):
    - Temporary diagnostic mode (comparetest.py/testmodel.py)
	Just seemed to complicate things unnecessarily.
    - Automatic performance measurement on Windows (default.py)
	Never worked very well and unclear if anyone's ever used it.
    - Record Standard Input functionality (default.py)
	Unclear if anybody's ever used this. I certainly haven't.
    - Shell syntax in QUEUE_SYSTEM_RESOURCE (queuesystem.py)
	Previously this was passed to the shell and tolerated - though did not require - quoting. Shell no longer used.
Installation and self-test changes:
    - No longer need to install TextTest explicitly - see migration notes
	It will run from anywhere. The install.py script is reduced and is now purely for locally configuring the self-tests.
    - Self-tests reorganised and the legacy "diplomacy judge" program removed as default target application
	This makes them faster and simpler.
    - Virtual display tests use traffic mechanism and are now deterministic
Bug Fixes:
    - Viewing a file after saving a test displays the correct file again (comparefile.py)
	This bug was reintroduced in TextTest 3.7 after being fixed in 3.3, due to incorrect test reorganisation...
    - If a test configured for performance takes 0 seconds, now show "infinitely faster" (performance.py)
	Previously didn't react to avoid dividing by zero
    - Removing a test which is only in an extra_version now works correctly (guiplugins.py)
	Previously gave a stacktrace
    - Removing the root test suite isn't possible any more (guiplugins.py)
	Remove now greyed out if the root suite is selected. Didn't work anyway before...
    - Fixed stack-trace on startup on Windows if your user name begins with "g" (!) (log4py.py)
	Now maintaining my own log4py version as it seems to have been abandoned.
    - If all virtual displays seem to be unusable, use the real display (unixonly.py)
	Previously just used the first virtual display anyway.
    - Collection script to group plain text reports together doesn't write files if mail sending fails (batch.py)
	There isn't really any point and it can be confusing to have them around
    - If performance files are externally removed, selecting tests on performance will not stacktrace any more (guiplugins.py)
	Variant of a bug fixed in TextTest 3.8
    - Fixed environment variable "leakage" from root suite when multiple apps run (engine.py)
	When one app was incorrectly set up could sometimes fail to clear its environment
    - Save button now greyed out if only successful or UNRUNNABLE tests selected (guiplugins.py)
    - Status bar now shows the correct number of tests saved if a mixture of failed and succeeded tests were selected (guiplugins.py)
    - Selecting tests via criteria doesn't auto-scroll to the first one now if it's already displayed (texttestgui.py)
    - Known bugs defined on missing text now trigger if the entire file is missing (knownbugs.py)
    - Adding a test with "auto_sort_test_suites" set now correctly sorts the new test (guiplugins.py)
    - Checkout to use for recording is no longer reset upon changing test to record (guiplugins.py)
    - Fixed stack trace when a specified "collate_script" didn't exist (default.py)
    - Console interface no longer stacktraces if an invalid graphical difference tool provided (respond.py)
    - Fixed race-condition/stack trace when viewing non-started tests in dynamic GUI using a grid engine (texttestgui.py)
    - Recomputation of tests that don't have any run-dependent text now works (comparefile.py)
    - Recomputation of crashed tests now doesn't lose the stack trace information (comparetest.py)
    - If recomputation triggers an automatic collapse, fixed following inconsistency... (guiplugins.py)
    - A warning is now produced if you try to add to an existing test for another app when creating a test (guiplugins.py)
    - Fixed weird warnings from dynamic GUI when status messages contained '<' or '>' (texttestgui.py)
    - Fixed stack trace if an "extra_version" is explicitly run along with a base version (engine.py)
    - "Exact/Average" option for saving performance tests no longer disappears if test selected before completion (guiplugins.py)
    - Fixed occasional failures of traffic mechanism due to failing to read from sockets properly (traffic.py)
    - Fixed stack trace when machine names are one letter or shorter (default.py)
    - Fixed stack trace when empty composite versions given (-v .v1..v2 or similar)  (testmodel.py)

Version 3.9.1
=============
Fixes for bugs introduced in 3.9:
    - Fixed "Follow file progress" on UNIX (The "tail -f" window, which just produced an error in 3.9) (guiplugins.py)
    - Fixed handling of Windows path names in "binary" config file setting and options.<app> files (default.py)
Fixes for older bugs:
    - Fixed dynamic GUI bug where deselecting all tests (e.g. by hiding or collapsing) blocked all Text Info updates (texttestgui.py)
	Could lead to a Text Info window which showed "Running" even when the test was complete.
    - Fixed HTML report bug where generating a report on UNIX from a run done on Windows produced "read error" (testoverview.py)
	Windows line-ending trouble again
    - Fixed bug where terminated processes on UNIX got named "CMD" (jobprocess.py)
	Could lead to occasional confusing printouts.

Version 3.10
============
System requirements (see Migration Notes):
    - TextTest GUI now requires at least PyGTK 2.10.
	The most recent major release. Due to serious bugs found in version 2.6.
    - Windows Vista is now supported
Major Enhancements:
    - Big performance improvement in startup for larger suites (testmodel.py)
	The tests are now read in a separate thread so that execution and display can start before all are read.
	Environment files are also only read on demand.
    - Radical rework to improve throughput for grid engines (queuesystem.py)
	Instead of submitting every new test as a new job, introduced socket communication to reuse jobs.
	Improves response time greatly if running a lot of short tests, by eliminating dispatch time.
General GUI Enhancements:
    - TextTest now has its own icons! (texttestgui.py)
	Different for the static and dynamic GUIs.
    - Pressing Enter when in a tab now "presses" the button at the bottom of it, if any (texttestgui.py)
	This is generally what's expected...
    - Selecting multiple tests now wipes the file selection (texttestgui.py)
    - Entry completion now possible (entrycompletion.py)
	Various config file settings...
    - Long status messages now ellipsized to stop them widening the window (texttestgui.py)
    - Removed tooltip showing the pane positions (texttestgui.py)
	It wasn't very useful and on some GTK setups it caused the GUI not to be startable
	Also tended to be shown in weird places on some other GTK setups...
Static GUI Enhancements:
    - Cut/Copy/Paste of tests is now much more like what file managers usually do. (guiplugins.py)
	"Copying" tab is removed, ctrl-X, ctrl-C, ctrl-V behave as expected. See Migration Notes.
    - Imported config files now appear in the Config tab (texttestgui.py)
    - Can now view the file properties from the file view window (guiplugins.py)
Dynamic GUI Enhancements:
    - Can now kill individual tests directly from the GUI (guiplugins.py)
	Could only kill them en masse by terminating testing before, or externally to TextTest
    - Quitting no longer freezes the dynamic GUI (texttestgui.py)
	Informs you about what its doing (killing tests, viewers, removing files etc.)
    - "Double Quit" now properly supported (texttestgui.py)
	Useful for cleaning up when tests refuse to be killed.
    - Can now mark tests when they have been viewed (texttestgui.py)
	Useful when wading through lots of changes, so already examined tests can be hidden.
    - Performance of "Update Info" button greatly improved. (guiplugins.py)
	We filter the original file for the test before running it
    - Window header now displays version and checkout information (texttestgui.py)
    - Now disallow saving versioned files for totally new tests (guiplugins.py)
	Tended to be easy to do if new tests were created in a non-default version.
    - Status tab column separators are now adjustable (texttestgui.py)
    - Status tab no longer displays tests killed at different timestamps in separate categories (testmodel.py)
	This seemed to be a pain as test killing can easily cross a minute-boundary.
Framework Enhancements:
    - Now possible to easily run multiple copies of the same test (default.py)
	Command line option -copy, or "Times to run" box in static GUI
    - Reorganised the temporary directory structure to have one top directory per run (default.py)
	Previously had one directory per application run which could lead to confusion.
	Has a few implications, see Migration Notes.
    - Virtual display mechanism for testing GUIs on UNIX rewritten (unixonly.py)
	Instead of running all tests against a single central display, start one local virtual display per test
	Less conflicts and network traffic that way. See Migration Notes.
    - Environment is now modified only in child processes (testmodel.py)
	Previously TextTest maintained it in its own environment which could lead to a variety of unexpected effects
    - Traffic mechanism now transfers, sets and replays current working directory (traffic.py)
	Recorded as a "cd" command
    - Script comparetest.RemoveObsoleteVersions rewritten as PrintObsoleteVersions (comparetest.py)
	Old one assumed CVS and had a few bugs in it. See Migration Notes.
    - Environment files no longer insist upon an order of elements (testmodel.py)
	OK for variables to refer to definitions below them in the file now
    - "view_program" config setting now expands environment variables from the tests (guiplugins.py)
    - Can now inform TextTest about binary files in the tests so it doesn't try to do tkdiff on them... (default.py)
    - New mechanism for sharing enviroment files between different tested applications (testmodel.py)
	Use "extra_config_directory"
Batch Report Enhancements:
    - Can now have extra_versions that are only used in particular batch sessions (default.py)
	New config file setting "batch_extra_version"
    - Nightjob website can now handle composite extra_versions (testoverview.py)
Grid Engine (LSF/SGE) enhancements:
    - Remote jobs remove the bulk of their own files
	Unless -keepslave is specified, slave jobs will remove all files in succeeded tests, and all data files.
	See Migration Notes.
    - Job bookkeeping improved
	Fixed problems to do with the wrong SGE/LSF job being found when tests are killed hard.
    - TextTest now manages job control signals itself
	Installs default handlers for SIGXCPU, SIGUSR1 and SIGUSR2 to tested programs as these are a fact
	of life with LSF/SGE. No longer get core dumps for SIGXCPU therefore.
    - Now works with a grid engine if TEXTTEST_HOME is a relative path
Installation and self-test changes:
    - Much better coverage of filechooser handling in tests
	Mostly a consequence of improvements in PyUseCase. Removed "magical" setting of paths.
    - Test naming scheme improved so added tests can reliably be found.
    - Tests no longer depend on the contents of ~/.config
	This is an undocumented feature of GTK that seemed capable of causing lots of trouble
	if certain entries were present.
    - UITesting tests no longer try to wipe GTK settings
	This was really there because of our local environment and could cause trouble in others
    - Filtering fixed in queuesystem tests
    - Tests no longer assume a default locale that can handle Swedish characters (!)
    - Self-test installation script now warns you and exits if you're missing any software required for the self-tests.
    - Tests for the self-test installation script should now work anywhere out of the box
Bug Fixes:
    - Movements of the horizontal pane separator are no longer lost when the right window is hidden (texttestgui.py)
	This could previously happen when test selection was cleared and then tests selected again.
    - Interrupting GUI before it has come up now works properly (engine.py)
    - Automatic selection of single tests doesn't force viewing of running test if it's been explicitly hidden (texttestgui.py)
    - Fixed occasional stack trace in interpretcore.py script for getting stack traces out of UNIX core files (interpretcore.py)
    - Made sure the same script doesn't write temporary files in the CWD, leading to occasional clashes (interpretcore.py)
    - Fallback to DBX if GDB doesn't manage to get core file information out (interpretcore.py)
    - Saving tests that have crashed now works properly (knownbugs.py)
	Previously leaked a file that caused trouble next time the test was run
    - CVS plugin : CVS commands on multiple files in dynamic GUI fixed (cvs.py)
    - Fixed bug where lack of performance file could lead to negative performance differences being reported (performance.py)
    - Fixed occasional clash between traffic mechanism and knownbugs mechanism (knownbugs.py)
	Really a side-effect of environment cleanup mentioned above
    - Current working directory now set correctly again when automatic cputime checking is enabled (unixonly.py)
	Vital for finding core files correctly
    - Fixed replay bug in traffic mechanism where repeated input has no associated reply second time around (traffic.py)
    - Fixed stacktrace when doing "view raw differences" on a new file in the dynamic GUI
    - Fixed bug where hidden tests that aren't being viewed becoming visible wipes the files selected in the viewed test (texttestgui.py)
    - Fixed some inconsistencies between different error messages for config file inconsistency (testmodel.py)
    - If a GUI test is recorded with a version but saved without, no longer get given identical versioned files (guiplugins.py)
    - Now get a nice error message rather than silence if saving a test fails due to permission trouble (guiplugins.py)
    - Static GUI now doesn't present empty test suites if a test filter (-t) given on the command line (testmodel.py)
    - Reconnecting now expands ~ correctly before user names (default.py)
    - Traffic mechanism no longer breaks down if TextTest started via a relative path (texttest.py)
    - Fixed bug with removing a test and then re-adding it with the same name (engine.py)
    - Fixed recursive status view if performance_variation_% = 0, variation between 0 and 1% and other diffs present (performance.py)

Version 3.11
============
Major Enhancements:
    - Added "filter" action on the static GUI selection tab (default_gui.py)
	Will use the same options as Select but will hide tests that don't match. In the View menu
	there are also actions to change selections to filterings.
    - Added static GUI refresh action (default_gui.py)
	Will re-read the tests from the files without needing to restart, and also re-read the config file.
    - Tests are grouped on the dynamic GUI status tab by identical diffs (texttestgui.py)
	These appear as "Group <n>" lines. Saves lots of time when many tests change in the same way.
    - Recomputation functionality totally reworked (default_gui.py, comparetest.py)
	Can be applied to multiple tests at once. No longer happens magically but shows a refresh icon
	when suggested. Takes config file changes into account. Works after fast reconnect. Handles
	file deletions. See migration notes.
General GUI Enhancements:
    - Many tabs replaced by dialogs. (guiplugins.py)
	This is more in line with what GUIs usually do. If your tabbed functionality isn't there any more,
	check the popup menus.
    - GUI configuration modules separated from standard configuration modules (guiplugins.py)
	"interactive_action_module" is no longer a list and works like "config_module".
	Naming scheme for layout XML files changed. See migration notes
    - All actions now exist in the menus and can have accelerators. New default accelerators added (guiplugins.py)
	Add Test = <ctrl>N, Remove and Kill = <ctrl>Del, Refresh/Recompute = F5, Record = F9, Enter failure info = <ctrl>I
    - Reworked how GUI handles multiple applications with different features/configurations (guiplugins.py/default_gui.py)
	This should be better separated now.
    - Window will now auto-widen if there isn't enough room for all information (texttestgui.py)
	Should prevent newbie gotchas where the window isn't big enough to show everything.
    - File selection performance in suites improved for large test suites (testmodel.py)
Static GUI Enhancements:
    - Tests that exist in multiple versions now share a test tree line (guiplugins.py)
	Also separate count is kept of "distinct" tests for this reason. See migration notes.
	Selections also record this information.
    - "New File" functionality now works from the File View popup. (default_gui.py)
	This allows more control over where and how files are added.
    - Can now select tests by application (default_gui.py)
    - Can now select tests by textual description (default_gui.py)
    - Can now suppress popups from dynamic GUI standard error (default_gui.py)
	Add a config entry "suppress_stderr_popup" that matches the line
    - Startup speed improved further when performance/memory info is present (testmodel.py)
	This information is only read on demand now.
    - Decoupled virtual display from recording (default_gui.py)
	Can now set "use_case_recorder:none" to get a virtual display but no record functionality
    - Icons changed (default_gui.py)
	"Refresh" action has taken over the refresh icon, so "Select" now has a "Find" icon instead.
    - Can now colour standard, definition and data files differently (texttestgui.py)
	Use static_data, static_standard etc. in [file_colours]
    - "Result file" entries in selection tab now renamed to "test-file" as they work with any file (default.py)
Dynamic GUI Enhancements:
    - Static GUI now tells dynamic GUI how many tests to expect (texttestgui.py)
	This prevents the problem where the progress bar could hop back and forth
    - Colours and default visibility can now be configured via any name appearing in the Status window (texttestgui.py)
	Previously only had a bunch of (hidden) names to go on.
    - Viewing files now deselects them (texttestgui.py)
	Mostly to prevent accidental partial saves. Viewing differences did this before.
    - New tests now allow user to save with a version ID (default_gui.py)
	Default is still not to do so though.
    - Progress number for running tests more accurate (comparetest.py)
	Doesn't include new or missing files. Also printed if progress is 0%.
    - Marked tests are now categorised as "Marked". The default descriptor is "Checked" (default_gui.py)
	Previously this was "Marked by User" and "Marked" respectively. This might lead to migration work.
Framework Enhancements:
    - Can now have application and version endings on data files (testmodel.py)
	Means the log4x plugin reduces to a special case of the data file mechanism. See migration notes.
    - Prioritisation rules changed (testmodel.py)
	Version specific files now get chosen above test-specific files. See migration notes.
    - Unified "extra_config_directory" and "test_data_searchpath", called "extra_search_directory".
	All TextTest's files now use the same mechanism to find files, with the above versioning rules
    - Synonyms introduced into config files to allow name changes without breaking back-compatibility (testmodel.py)
	So "binary" is now called "executable", more sensibly, but "binary" still works.
    - Now provide an environment variable TEXTTEST_SANDBOX to identify the sandbox directory (default.py)
	Use with care. Mainly to handle applications that refuse relative paths or change directory internally.
    - New "-bx" flag for including versions identified with "batch_extra_version" in the GUI (default.py)
	Can be useful for administering which tests should be run
    - New config file setting "default_filter_file" introduced (default.py)
	Allows a version to be defined that is defined by a saved selection of tests.
    - Multiple filter files now select the tests that are present in all of them (default.py)
	There are now lots of ways to select them.
    - Config setting "performance_variation_%" is now a float (performance.py)
	Had to be a whole number previously.
    - Can now configure how performance changes are described (performance.py)
	See docs for "performance_descriptor_decrease" and "performance_descriptor_increase"
    - "knownbugs" files can now be shared between applications (knownbugs.py)
	They can also be stored externally via "extra_search_directory" in config file.
    - versioned "knownbugs" files now combine with non-versioned ones (knownbugs.py)
	Previously the relationship was to overwrite
    - Core file collection improved (interpretcore.py)
	Summary of what binary and core were used is displayed, along with debug info if any
    - Bugzilla plugin no longer depends on perl (bugzilla.py)
	But still requires the cli.cgi script to be present.
	Need to tell it how to find this via the config entry "bug_system_script". See migration notes.
    - Temporary directories now have a PID identifier (default.py)
	Mainly to make it impossible for two runs to write to the same place.
    - New script default.ExportTests for exporting tests to a different suite (default.py)
	See documentation for it.
Batch Report Enhancements:
    - Can now tell it to send mail only when at least one test fails (batch.py)
	Set "batch_mail_on_failure_only" to "true". Thanks to Michael Behrisch for this.
    - HTML report now allows several applications on the same page (testoverview.py)
	Set the config value "historical_report_page_name" to the same thing for them all.
    - Removed "None" suffices to anchors in pages (testoverview.py)
	No visible difference but makes it easier to create other pages that link there
Grid Engine (LSF/SGE) enhancements:
    - "Follow file" in dynamic GUI will run the viewer on the remote machine (default_gui.py)
	This is generally more responsive
    - Can configure "View file" to do likewise, per file-type (default_gui.py)
	Use new config file entry "view_file_on_remote_machine"
    - "Kill" button will always fetch all relevant information when tests die (queuesystem.py)
	Will always get both the slave logs and the grid engine info
    - Introduced retry when slaves fail to communicate with the master process (queuesystem.py)
	Will try five times before giving up, in case of temporary problems.
Old functionality removed and API changes:
    - batch.GenerateHistoricalReport and batch.CollectFiles deprecated (batch.py)
	Use -coll [web|mail] instead.
    - Dynamic GUI 'static' file view for tests that haven't started (texttestgui.py)
	Caused trouble and seemed rather pointless
    - "trace_level_variable" - basic log-level functionality (sandbox.py)
	This seemed rather specific to the application that originally created it and didn't seem
	worth preserving in the general TextTest.
    - Removal of previous write directories with -keeptmp flag (engine.py)
	This was deemed to be a gotcha and a historical hangover
Installation and self-test changes:
    - Test naming scheme further improved so that waiting events won't fail if the test changes name (testmodel.py)
    - Various grid engine tests tightened up so that slower reading of tests couldn't cause different behaviour
Bug Fixes:
    - Fixed cases where status message 'Started X tests' showed the wrong number (texttestgui.py)
    - "New File" on a "Standard File" (output/errors) now creates suffices correctly (default_gui.py)
    - Fixed text box problem where default value could disappear after selecting another one (plugins.py)
    - Paths provided by extra_search_directory no longer get considered in reverse order (testmodel.py)
    - Fixed bug when saving default version for test with multiple versions, version IDs now correct (comparefile.py)
    - Tests from extra_versions now get displayed in the expected order (testmodel.py)
	Previously they could end up in various funny orders.
    - Cutting/copying + Pasting multiple tests now leaves them all selected (default_gui.py)
	Previously only the last one was selected
    - Fixed long-standing race condition that could have a variety of effects (testmodel.py)
	For example an HTML report generation doing nothing, or a grid engine run never terminating
    - Reconnecting to Windows runs from UNIX now works (line ending problems fixed) (reconnect.py)
    - Fixed log structure from static GUI, dynamic runs now put their logs in a strictly increasing sequence (default_gui.py)
    - Empty entry in "performance_logfile_extractor" now disables extraction instead of stacktracing (performance.py)
    - Fix stack limit bug when trying to wrap extremely long lines (comparefile.py)
    - Can no longer mark running tests by selecting them together with completed tests (guiplugins.py)
    - Fixed involved bug with version priorities and base versions (testmodel.py)
    - Fixed bug where the same imported config file could get shown twice (texttestgui.py)
    - Fixed so that -a app.v1 -v v2 is the same as -a app -v v1.v2 or -a app.v1.v2 (engine.py)
    - Fixed static GUI stacktrace when running two applications with the same full name (texttestgui.py)
    - Fixed spurious dialogs about "unique names" that occasionally appeared after renaming (engine.py)
    - Fixed stacktrace when non-existent absolute path provided on command line for filter file (default.py)
    - Fixed stacktrace when test with missing files saved before another version of that test completes (comparetest.py)
Grid Engine bug fixes:
    - Fixed major bug which could lead to hanging when killing tests before all had finished (queuesystem.py)
    - Fixed race condition bug which could lead to hanging
	Triggered if grid capacity was low and reading tests was slower than running them (queuesystem.py)
    - Fixed another race condition where tests could complete before reading them had been processed (queuesystem.py)
    - Absolute paths in link_test_path or copy_test_path no longer cause data deletion when using grid engines (testmodel.py)
    - Trying to run with a grid engine that isn't installed gives an error message rather than stracktrace (queuesystem.py)
    - If invalid resource given for "performance_test_resource", performance collection now disabled (queuesystem.py)

Version 3.11.1
==============

Framework Enhancements:
    - Can now configure how the units of performance are described (sandbox.py)
	See docs for "performance_unit"
    - Command line traffic mechanism can now record and replay changes to files (traffic.py)
	Previously only did standard output, standard error and exit codes
Bug Fixes to 3.11:
    - Fixed bug introduced in 3.11 where dynamic GUI makes a mess of empty test suites if started from the command line (testmodel.py)
    - Fixed crash when a static GUI refresh triggers several test removals in the same suite (testmodel.py)
    - Filtering actions in the View menu no longer freeze the GUI while executing (guiplugins.py)
    - "batch_mail_on_failure_only" and "batch_use_collection" now work together. Thanks to Michael Behrisch again. (batch.py)
    - 3.11's recomputation feature now works with PyGTK < 2.10.4 (texttestgui.py)
	Worked around a bug in PyGTK 2.10.3
Fixes for older bugs:
    - Copying or renaming a test cannot cause it to fail now (testmodel.py)
	We now update all result files that refer to the test path name so they refer to the new one
    - Fixed bug where local DISPLAY sent to remote processes (queuesystem.py)
	Main effect was to prevent slow-motion replay mode for GUI testing working with a grid engine
    - Saving edited files from PyUseCase's process monitoring mechanism now works correctly (comparetest.py)
    - Incorrect time format to execution time filter (-r) now gives error instead of crashing/hanging (plugins.py)

Version 3.12
============
System requirements (see Migration Notes):
    - TextTest GUI now requires at least Python 2.5.1 on Windows.
	Python 2.4 still supported on UNIX only.
	This allowed removing all hacks for killing processes on Windows, so "pskill" is no longer required on Windows 2000.
Major Enhancements:
    - Can now define new applications from the static GUI, and hence start TextTest without creating anything beforehand (testmodel.py)
	Edit / Add application produces this dialog. Also texttest.py --new, or starting with an empty TEXTTEST_HOME.
General GUI Enhancements:
    - Default accelerator for Save Selection is now ctrl-D instead of ctrl-shift-S(default_gui.py)
	This to prevent confusion with Save-As, which is ctrl-alt-s and produces a similar looking dialog
    - View actions no longer greyed out if the relevant viewer isn't present (texttestgui.py)
	...because this doesn't say why they can't be used. Replaced with error message.
    - Now explicitly define certain config file entries as only appropriate for personal preferences (texttestgui.py)
	This is because they need to work when no applications are loaded, and also because defining things
	like colours on the application level is considered harmful...
Static GUI Enhancements:
    - Reconnect interface totally revamped (reconnect.py)
	Now uses a directory chooser in a dialog. See Migration notes for details.
    - Renaming, moving and copying test suites now possible (default_gui.py)
	Previously only test cases could be acted on in these ways.
    - Can now remove test data directories (default_gui.py)
	"Remove" used to be greyed out on directories
    - Recording a use-case when GUI testing will now also record command-line traffic if appropriate (default_gui.py)
	There is a checkbox which can be disabled if necessary, but this is usually what you want
Dynamic GUI Enhancements:
    - New "Run Info" tab in right window
	This gives you detailed information on the TextTest run and the currently selected test run.
    - "follow_program" setting for the dynamic GUI file view no longer magically inserts 'xterm' prefixes on UNIX (default_gui.py)
	What you see is what you get now. See Migration Notes.
    - When a known bug in bugzilla is triggered, a "hyperlink" to that bug in bugzilla appears in the Text Info window. (testoverview.py)
	This will open that bug in your default browser on Windows.
	On Unix, it uses the $BROWSER environment variable for this, and tries to start "firefox" if it isn't defined
    - New "Annotate" feature in Edit menu (default_gui.py)
	This is essentially a post-it note on a run reminding you why it's there and not to kill it lightly.
	Causes the window header to change and a warning to be produced on quitting.
Framework Enhancements:
    - Traffic mechanism is now concurrent (traffic.py)
	Can have more than one external process interacting with it at once
    - Command line traffic mechanism can now handle external programs that get killed (traffic.py)
	Can essentially record and replay UNIX signals sent to them. On Windows, replaying a signal will just terminate
	the process, and record is not supported.
    - Traffic mechanism works much better on Windows (traffic.py)
	Before it usually needed hacking in the application code to make it work properly with non-python programs.
	Now there is a .exe file which Windows likes better.
    - Bugzilla plugin upgraded to Bugzilla 3.x, and no longer needs external software (bugzilla.py)
	Uses the new webservice interface. Bugzilla 2.x plugin is now called bugzillav2. See Migration Notes.
Batch Report Enhancements:
    - When a known bug in bugzilla is triggered, HTML report now provides a link to that bug in bugzilla. (testoverview.py)
Installation and self-test changes:
    - configure_tests.py script removed. Self-tests no longer assume the presence of any external software - removed
	dependency on Java, Xvfb, emacs, notepad, tkdiff, baretail
Bug Fixes:
    - The tooltips are back! These accidentally disappeared in 3.11. They still aren't tested though (texttestgui.py)
    - Copying or renaming a test cannot cause it to fail now on Windows either (testmodel.py)
	The fix on Windows in 3.11.1 caused all tests to fail on Windows when renamed or copied.
    - Recomputing the status of tests with missing files no longer causes a stacktrace (comparetest.py)
    - File selections are no longer lost when the file view is refreshed for some reason (texttestgui.py)
    - "gui_entry_override" now also works for the controls on the Recording tab (default_gui.py)
    - File edits recorded by the traffic mechanism are ignored instead of crashing if the new version isn't there (traffic.py)
    - Refresh no longer writes to standard output if there are bogus entries in the testsuite files (testmodel.py)
	Could occasionally cause hangs in some remote environments.
    - Fixed bug where tests were pasted in the wrong position if there are bogus entries in the testsuite file (testmodel.py)
	Bad references are now auto-commented by TextTest in this case.
    - Fixed traceback when entering ambiguous format "<10,60" to execution time filter (-r on command line) (performance.py)
    - When we create empty test suite files, append rather than overwrite (testmodel.py)
	This prevents us accidentally wiping files in the presence of flaky file servers
    - Fixed bug in config file parsing where {CLEAR LIST} as the first entry in a list was interpreted naturally (testmodel.py)
    - Fixed bug where test suites being removed and re-added via static GUI refresh caused a stack trace (testmodel.py)
    - Fixed bug where recomputation and/or marking tests while others were running occasionally confused the grouping in the status view (texttestgui.py)
    - Selecting multiple rows referring to the same test in the status view no longer screws up the selection count in the dynamic GUI (texttestgui.py)
    - UNIX Virtual display handling doesn't refer to 'localhost' any more in DISPLAY names (unixonly.py)
	More robust to just use a blank machine name, then we remain within the X internal mechanisms
    - Authors now appear with Swedish characters uncorrupted even in non-Swedish locales! (helpdialogs.py)
Grid Engine bug fixes:
    - Fixed race condition bug which could lead to tests with different resource requirements being "forgotten" (queuesystem.py)

Version 3.12.1
==============
Installation and self-test changes:
    - ViewHelp self-test fixed, oversight in 3.12 release
    - 2 reconnect self-tests fixed on Ubuntu that worked on both RHEL and Windows...
    - Self-test coverage work: tests added, dead code removed, no-coverage pragmas added. Coverage now 97.2%
Bug Fixes to 3.12:
    - Reconnecting to several runs simultaneously with extra versions will find all extra versions correctly (reconnect.py)
    - Reconnecting to extra version tests only now works correctly in the static GUI (default_gui.py)
    - Fixed bug where multiple reconnected runs might not be grouped correctly - relates to Ubuntu tests above (reconnect.py)
    - When viewing bugzilla bugs in the browser from the UI, update the status bar correctly (texttestgui.py)
Fixes for older bugs:
    - Fixed problem where recompute needed pressing twice if changing baseline file with run-dependent text (default.py)
    - "catalogue_process_string" setting now works on Windows (sandbox.py)
    - traffic.ModifyTraffic script now works on Windows (traffic.py)
    - Fixed crash when providing filter arguments without options on command line, e.g. "texttest.py -t" (default.py)
    - Error message when PyGTK not found is now more informative (texttestgui.py)

Version 3.13
============
Dynamic GUI Enhancements:
    - "Save As" dialog has a new field "Version to save previous results as"
	Means old default results can be preserved as a version, for example after a branch of the codebase
Framework Enhancements:
    - Can now have application-specific personal configuration files (testmodel.py)
	Files called ~/.texttest/config.<app> will be picked up as well as ~/.texttest/config now.
    - Can now combine filter files with each other and refer to them from each other. (default.py)
	New settings --fintersect, --funion and --finverse. See website documentation of these.
    - Can now disable normalisation of percentage differences for performance (performance.py)
	New config file setting "performance_use_normalised_%". See website docs on this subject.
    - import_config_file now works like import statements in programming languages (testmodel.py)
	It's now exactly equivalent to pasting the contents into the file at that point.
    - Can now provide several checkouts on the command line with -c <checkout1>,<checkout2>
	Internally a version is generated for all except the first one
    - Config file error handling improved (plugins.py)
	Now get a wider range of warnings and don't get the same warning lots of time.
	Looks for missing [end] statements.
    - Self-diagnostics moved to ~/.texttest/log by default (engine.py)
	But still fully configurable. Default log config file now lives with the source under log subdirectory.
	Along with a script to regenerate it if desired.
    - Site-specific configuration files now read from site/etc/config if present (testmodel.py)
    - New command-line option --vanilla which starts TextTest without personal (or site-specific) configuration. (testmodel.py)
    - Traffic mechanism's algorithm for inexact matches with previous commands improved (traffic.py)
	It previously tended to prefer arguments to disappear entirely than to change to something else.
	It also handle's TextTest's sandbox directly now.
    - Can now get stacktraces from running TextTest processes on UNIX (engine.py)
	Send it SIGQUIT. Thread structure simplified also to make this more useful.
    - We now restart Xvfb (virtual server on UNIX) if it crashes before its time (unixonly.py)
	This prevents one Xvfb crash causing multiple test failures.
    - Config file settings "test_list_files_directory" and "testoverview_colours" renamed for consistency (default.py)
	They are now "filter_file_directory" and "historical_report_colours" respectively. The old names still work as aliases.
Historical HTML Batch Report Enhancements:
    - HTML report now organises history into months instead of generating an "All" page (testoverview.py)
	It's much more flexible now and the old behaviour can be restored. See Migration notes and website.
    - Now creates links to "extra versions" from the top of each major version (testoverview.py)
    - Now include date of generation in page title (testoverview.py)
    - HTML table headers are now 13-point font and should be easier to read (testoverview.py)
    - "Last Six Days" page is now called "Last Six Runs" for consistency with named runs (testoverview.py)
Email Batch Report Enhancements:
    - New config file setting "batch_collect_max_age_days"
	This is used to prevent the email report finding old results if the new ones are not present (batch.py)
    - New config file setting "batch_collect_compulsory_version"
	This is used to generate error messages in the email report if results are not found for some version (batch.py)
CVS Browser Enhancements/bug fixes:
    - Now enabled automatically if tests are CVS-controlled, don't need to set interactive_action_module (cvs.py)
    - Never ignores non CVS-controlled files now (cvs.py)
    - Finds versions correctly in dynamic GUI now and can be called on running tests (cvs.py)
    - Category "Unknown" no longer shown as "Unknow" (cvs.py)
    - "tkdiff" no longer hardcoded as graphical difference tool in CVS browser, uses "diff_program" as it should (cvs.py)
    - Error messages improved and standardised (cvs.py)
    - "CVS log" now handles date format produced by CVS 1.12 (cvs.py)
	Previously only tested on CVS 1.11
Grid Engine (LSF/SGE) enhancements:
    - Information about other processes on the machine improved (queuesystem.py)
	Doesn't report itself, picks up processes from other users (SGE) and reports the job ID
Installation and self-test changes:
    - Self-tests (and source code) are now available from Launchpad, if you're changing the code you should get them from there
    - CVS browser tests greatly improved and come with an entire CVS repository. (cvs.py)
Bug Fixes:
    - Reconnecting to runs done with -v v1,v2 is now possible (reconnect.py)
	Though they generate rather longer temporary path names to make this possible
    - Reconnecting explicitly to versioned runs is never rejected (reconnect.py)
	Previously you had to fill in the version in the matching field.
    - Fixed problem where scripts such as the HTML report builder could not be interrupted (engine.py)
	They now respond appropriately to signals.
    - Don't fail to cleanup sandbox if the SUT creates readonly files (plugins.py)
	We change permissions if needed before removing now.
    - When the same dialog is created twice, start with previously hand-entered values in preference to those from gui_entry_override (guiplugins.py)
    - Can now add two applications from the static GUI as part of the same run (texttestgui.py)
    - Can now load selections from multiple version runs into a single-version run, usually static GUI (plugins.py)
    - When a parent category is hidden in the dynamic GUI status view, new children of it will also start hidden (texttestgui.py)
    - Fixed shortcut stacktrace when adding a third application from the static GUI when two already exist (default_gui.py)
    - Saving version b.a will now overwrite <file>.a.b instead of creating <file>.b.a. (comparefile.py)
    - Reconnecting to version a will now pick up a single run with version a.b, as well as multiple ones! (reconnect.py)
    - No longer fail if executable missing when trying to reconnect (default.py)
    - extra_search_directory entries are now searched in the right order when looking for imported config files (testmodel.py)
    - HTML report columns for named batch runs done on the same day will now be sorted sensibly (testoverview.py)
    - Don't crash if config file is a directory or a dead link (engine.py)
    - warning removed if extra_search_directory can't be found: this is after all equivalent to $PATH (testmodel.py)
    - Recomputation always recreates the Text Info window now, even if TextTest didn't believe it was necessary (comparefile.py)
    - Don't crash creating "Save Selection" dialog if no permissions to create filter_files directory (plugins.py)
    - No longer rely on gethostname() returning a simple name (plugins.py)
    - Running virtual server remotely won't generate spurious stacktraces in logs any more (unixonly.py)
    - TextTest won't hang any more if a previous virtual server process leaks its lock file (unixonly.py)
    - Fixed crash with LANG=C, introduced in 3.12 when trying to make Swedish authors come out right! (plugins.py)
Grid Engine bug fixes:
    - Clearer error message when the grid engine (qsub/bsub) cannot be found (queuesystem.py)

Version 3.14
============
General GUI Enhancements:
    - This ChangeLog now visible from the GUI (helpdialogs.py)
	From Help menu/Change Logs
    - Locations chosen in FileChoosers now get remembered (plugins.py)
	So you don't need to keep searching to the same place.
Static GUI Enhancements:
    - "Create File" functionality enhanced. (default_gui.py)
	Will now handle directories correctly, and you can choose your source with a filechooser now.
    - Can now run all the tests in a suite by selecting just that suite (default_gui.py)
	Also works for reconnecting and saving selections.
Framework Enhancements:
    - Can now run tests on a remote machine (UNIX only) (default.py)
	Even works if file system not shared. New config entries "remote_shell_program"
	and "remote_copy_program". See website for details.
    - TextTest now collects exit codes from the system under test by default (default.py)
	Only writes files for non-zero status. Can be disabled via discard_file
    - Can now remove certain elements from versioned config files (plugins.py)
	New syntax {CLEAR <item>}
    - Can now tell TextTest to merge data directories with each other (sandbox.py)
	Use new config setting "copy_test_path_merge". "copy_test_path" causes directories to be overwritten.
    - Can now filter floating-point differences to within a certain tolerance (rundependent.py/fpdiff.py)
	New config file setting "floating_point_tolerance".
	See documentation on website. Thanks to Michael Behrisch for this.
    - Can now collate result files from a variety of possible source patterns (sandbox.py)
	Essentially collate_file is now a list. May require migration in theory.
    - Decoupled ignoring other errors from reporting bugs as "internal error" (knownbugs.py)
	Now separate check boxes for these things when doing "Enter failure information"
    - Bugs marked as "internal error" get reported in preference to "known bug" (knownbugs.py)
	The former are usually some catastrophic general environment failure
    - Config file setting "performance_use_normalised_%" renamed for generic application (default.py)
	Now called "use_normalised_percentage_change" to reflect possible usage for other purposes. Old name aliased.
    - Traffic mechanism does not assume asynchronous file edits are possible any more (traffic.py)
	Need to explicitly list programs that might do this : key with "asynchronous" in "collect_traffic"
	config file setting, which is now a dictionary.
    - No longer ignores missing traffic and usecase files. (default.py)
	"definition_file_stems" is now a dictionary, where items like these can be keyed "regenerate"
    - Now set up the checkout if we can when running scripts, including website generation (default.py)
	Means repository location can depend on TEXTTEST_CHECKOUT.
    - Picks up "properties" files in a similar way to "environment" files (testmodel.py)
	Used for Java applications. See website for more details.
    - Default location of temporary files changed (engine.py)
	Now writes to ~/.texttest/tmp instead of $TEMP or ~/texttesttmp
Version Control Browser Enhancements/bug fixes:
    - Administration operations update the VCS correctly (version_control.py)
	Rename,Move and Remove will also do so in the VCS for tests under VCS-control
    - Can now add to the VCS via TextTest (version_control.py)
	Separate action on appropriate menu
    - Now supports Bazaar and Mercurial as well as CVS (bzr.py/hg.py/version_control.py)
    - Hiding "unknown" category now works correctly (version_control.py)
Internal changes:
    - TextTest now structured into packages so lots of files have moved around
Bug Fixes:
    - Traffic mechanism does not handle directory removals by removing all files any more (traffic.py)
	Actually stores and replays the directory removal directly.
    - No longer flag runs as missing if batch_collect_compulsory_version overlaps with versions given on command line (batch.py)
    - Python 2.6 shouldn't produce annoying messages about deprecated modules any more.
    - Worked around GTK 2.14 bug in file chooser handling, will no longer hang
    - Race condition removed from virtual server handling on UNIX: shouldn't leak virtual servers any more (startXvfb.py)
    - No longer stacktrace if "interpreter" is an invalid path (default/__init__.py)
    - No longer stacktrace when repositioning tests if no write permissions to the files (default_gui.py)
    - Now shows correct test names in the status bar after a rename (engine.py)
    - Don't crash if copying or moving a suite and its contents (default_gui.py)
    - Now works to run locally from bin directory. Thanks again to Michael Behrisch (texttest.py)
    - "Extra versions" write to sensible batch repository locations when no version given on command line (batch.py)
    - Website generation works for "Extra version" applications even if the parent is blocked or has no data (batch.py)

Version 3.14.1
==============
Bug Fixes to 3.14:
    - Import File now works even when starting without any pre-existing test suites (default_gui.py)
    - New floating point filtering functionality now handles new files correctly (rundependent.py)
    - Strange and unnecessary frame removed from Save Selection dialog (guiplugins.py)
Fixes for older bugs:
    - Fixed problem where reconnection to multiple runs failed to pick up composite versions (reconnect.py)
    - Fixed grid engine problem where tests were sent to jobs that had already been killed (queuesystem/__init__.py)

Version 3.15
============
General GUI Enhancements:
    - Default search now works! (testtree.py)
	Can select tests just by typing with the test tree highlighted
    - Version dialog shows version of PyGObject and GLib also (helpdialogs.py)
    - Quick Start guide now available from help menu, also credits and license (helpdialogs.py)
    - Link on the About splash screen can now be clicked to take you to the website (helpdialogs.py)
Static GUI Enhancements:
    - New "Replace Text in Files" action
	Graphical version of default.ReplaceText script
    - Selection of test suites now reported in test tree header (testtree.py)
	Reports number of suites selected instead of 0 tests
    - Adding a test now adds it to all selected suites (adminactions.py)
	More consistent with behaviour of Rename, Copy etc.
    - Can now use UNIX-style file expansion wildcards (globs) in the "Test-file to search" box in the Selection tab. (default_gui.py)
	Allows looking for text in multiple files simultaneously. Also affects -grepfile on the command line.
    - On creating a new application, can specify at creation time that it is a GUI (default_gui.py)
	Saves on fiddling and restarting the GUI.
    - Default value for "query_kill_processes" changed (default/__init__.py)
	Ask before terminating dynamic GUIs when static GUI is terminated.
    - Performance values displayed in more readable format (textinfo.py)
	Previously in seconds only
    - Tooltips added to the selection tab to aid clarity.
Dynamic GUI Enhancements:
    - Can now rerun tests directly from the dynamic GUI (runningactions.py)
	Saves on saving a selection back to the static GUI, loading it and then rerunning.
    - Selecting files in the file view now also filters the Text Info display below (texttestgui.py)
	So that it only previews what is currently selected.
    - Saved tests are now listed separately in the status view (statusviews.py)
	Makes it easier to track which tests have been saved and which worked by themselves
    - Saved tests make this clear in the Text Info space, recording the time at which they were saved (comparetest.py)
    - "Save As" dialog allows multiple versions for "Version to save previous results as" (changetestresults.py)
	Use comma-separated list which can provide multiple backups of the same file.
    - Can now view original files (filtered and not) from the file view popup menu (fileviewers.py)
    - Can now view files with content-filtering but not order-filtering present (fileviewers.py)
	Useful when "unordered_text" is defined
    - "Annotate" is now called "Set Run Name" and works from the command line / static GUI (housekeeping.py)
	Uses the pre-existing option -name which previously only affected batch mode
    - New base_version "recusecase" for when recording GUI tests
	Works much like the exisiting "rectraffic", i.e. a way to have different configuration only in this case
    - Test tree tooltips now work more reliably and use the builtin support in PyGTK 2.12 (testtree.py)
	They are removed in PyGTK 2.10, was not deemed important enough to keep them there
    - Run Info uses "=" for environment variables, reckoned easier to read (textinfo.py)
Framework Enhancements:
    - Can now use "options" files in test suites (default/__init__.py)
	They get combined like "environment" files. See "Test Suite Guide" on the website for more details.
	This also applies to versioned files so if you have versioned options file you will need to read the Migration notes.
    - Reconnect now picks up all "extra versions" that were originally run (reconnect.py)
	Mainly useful if batch_extra_version was originally supplied
    - New variable TEXTTEST_SANDBOX_ROOT provided
	Refers to the top level of the sandbox structure, can be used for temporary storage shared between tests.
    - New variable TEXTTEST_PATH provided (engine.py)
	Like TEXTTEST_HOME, but allows loading tests from multiple locations into the same process
    - New config setting "performance_ignore_improvements" (performance.py)
	As the name suggests, allows performance testing to only flag when performance degrades.
    - New config setting "save_filtered_file_stems"
	Allows the filtered version of files to be saved instead of the raw output.
    - Floating point filtering now supports relative tolerance (fpdiff.py)
	New config file setting "relative_float_tolerance". Thanks to Michael Behrisch for this.
    - Config setting "suppress_stderr_popup" renamed to "suppress_stderr_text" and used more widely
	Old name still works as an alias. Will now look at stderr from collate scripts and grid engine slaves too.
    - Can now have variable "executable"
	Set a relative path and provide it also in one of the "*_test_path" config settings.
    - Logging more flexible now (default.py)
	Dynamic GUI does not write anything by default. Batch mode writes time stamps by default.
	Debug logging file now called "logging.debug" rather than "log4py.conf". See migration notes
    - Personal toolbar/GTK configuration now lives in "etc" subdirectory (plugins.py)
	Mostly to keep things consistent with "log" locations
    - Generalised --vanilla option (testmodel.py)
	Now have --vanilla site and --vanilla personal
    - New "default_texttest_tmp" config file entry (default/__init__.py)
	Useful for setting a site-wide default, e.g. if a separate disk is used for this purpose
    - Overwrite mode (-o) now displays differences for what it overwrites
Historical HTML Batch Report Enhancements:
    - Separate summary rows are now displayed for each extra version (testoverview.py)
    - With extra versions, the first one also gets given a header row now (testoverview.py)
    - Category ordering is now deterministic, with succeeded tests displayed first (testoverview.py)
Grid Engine (LSF/SGE) enhancements:
    - New config file option "queue_system_min_test_count" (queuesystem/__init__.py)
	Can make sure small numbers of tests get run locally by default, while large numbers use the grid.
    - Slave job handling is now multithreaded (masterprocess.py)
	Hopefully a bit faster and less sensitive to network trouble
    - Errors produced by remote jobs now get reported on master process stderr (masterprocess.py)
	And hence in popups in the static GUI where appropriate.
    - Tests from different applications now interleaved when submitting (masterprocess.py)
	Means one application is less likely to take over all available resources
Self-test/Internal changes:
    - Everything now done via PyUseCase 2.0's new auto-logging. Most custom logging removed from TextTest.
    - Popup menus are now called and shown in the tests.
    - New application event fixes indeterminism problems around tests that kill external viewers.
    - Major GUI code refactoring to create packages as appropriate
    - Lots of work on coverage: tests added, dead code removed, no-coverage pragmas added. Coverage from self-tests now 98.6%
Bug Fixes:
    - Invisible (filtered out) tests will not be run now when a test suite is selected (texttestgui.py)
    - "Create/Import" functionality in static GUI works correctly for directories which previously existed (adminactions.py)
    - Static GUI no longer refuses to start if the "default checkout" can't be found (default/__init__.py)
    - All plugins scripts now reject unknown arguments in a consistent way (plugins.py)
    - Status of tests now synchronised across the GUI, should be harder to get a test green/red somewhere and still yellow
	somewhere else.
    - Observer exceptions no longer fatal (plugins.py)
	Many observers can be in configuration code and shouldn't be allowed to bring down other applications.
    - Pasting a test where there already exists a file of that name now handled gracefully (adminactions.py)
    - Fixed stacktrace removing a suite containing duplicated subsuites (testmodel.py)
    - Traffic mechanism no longer stacktraces if server under test resets its connection (traffic.py)
    - "Show File Properties" in the dynamic GUI no longer shows everything twice for new files (fileviewers.py)
    - Running tests remotely (without grid engine) can now handle illegal shell syntax in test names and environment variables (default.py)
    - Running tests remotely (without grid engine) now gets correct values for TEXTTEST_SANDBOX
    - Running tests remotely (without grid engine) now works in conjunction with automatic performance measurement (default.py)
    - Killing remote tests started with SSH now works (default/__init__.py)
	SSH doesn't forward signals unfortunately...
    - Auto-replay the correct test when recording if static GUI test selection changes in the meantime (adminactions.py)
    - Refining a selection containing test suites now works properly (selectandfilter.py)
	Previously lost all test suites
    - Now produce a warning for duplicated sections in "knownbugs" files (knownbugs/__init__.py)
	Silently ignored previously
    - Generated links (in GUI and in batch reports) now work for "https://" bug system locations (textinfo.py/testoverview.py)
	Previously shown only in plain text: assumed "http://"
    - Drop-down list for bug systems when entering failure information only includes bug systems defined in "bug_system_location"
	Previously showed all known bug systems
    - No longer allow default locations across bug systems
	Was never intentional but might require migration. See migration notes.
    - Importing files now preserves permissions correctly (adminactions.py)
    - Crashed virtual servers are now restarted after each test, preventing multiple tests failing for the same crash (virtualdisplay.py)
    - Grouping of tests in the dynamic GUI is disabled if their diffs are longer than the maximum to display (statusviews.py)
	Could lead to false grouping and hence incorrect saves
    - Credits dialog no longer mangled in locales which aren't Latin-1 compatible (helpdialogs.py)
    - Added error messages for locale encoding problems (guiutils.py)
    - Errors when collating now get shown in the GUI (sandbox.py)
    - "collate_file" is now done before "discard_file" (sandbox.py)
	Means you can "rename" files by collating them to a new name and then discarding the original one.
    - "collate_script" scripts can now be in your PATH also on Windows (sandbox.py)
	Previously PATH only worked on POSIX platforms.
    - Fixed occasional confusion in the dynamic GUI when tests are both "collapsed" and "hidden" (testtree.py)
    - It now works to save versioned missing file markers for "traffic" files (traffic.py)
Grid Engine (LSF/SGE) Bug Fixes:
    - Don't reuse slave jobs that get killed after the test completes (masterprocess.py)
    - Don't send tests for re-use whose submission has been cancelled (queuesystem/masterprocess.py)
    - Reduced keepalive timeout to 5 minutes, 2 hours is rather a long time in a test context (masterprocess.py)
    - Don't fall over if SUT leaves child processes running from the slave (slavejobs.py)

Version 3.16
============
Static GUI Enhancements:
    - Can now rename files from the drop-down list in the file view (adminactions.py)
    - "Refresh" replaces "Remove Tests" in the default toolbar, mostly for aesthetic reasons (default_gui-static.xml)
	Toolbar contents can be configured/put back, see "personalising the UI" on the website
    - "Add Application" dialog now has a drop-down list of all possible GUI-testing options (adminactions.py)
	Allows you to get started testing a UI before understanding the config file
    - Error handling on initial "Add Application" dialog improved (adminactions.py)
	Reject illegal characters in suffix and subdirectory names
    - GUI-testing "UI map" files now visible from the Config tab (filetrees.py)
Framework Enhancements:
    - Now integrates with Atlassian's Jira bugtracking system as well as Bugzilla (jira.py)
	Works in broadly the same way as the bugzilla integration. See website for details.
    - "collate_file" functionality for multiple files rewritten (sandbox.py)
	Patterns of the form "data*:data*.dump" should behave more intuitively, but may not be completely back-compatible.
	Read the migration notes and the website for details.
    - "run_dependent_text" enhanced for filtering away sections of text (rundependent.py)
	Can now control whether start and end lines are filtered via e.g. "{[->]}" syntax
    - Versioned config files can be now be placed in "extra_search_directory" locations (testmodel.py)
	Previously only imported files could be found there.
    - "suppress_stderr_text" now supports the same syntax as "run_dependent_text" (default/__init__.py)
	Allows e.g. multiline filtering
    - "text_diff_program_max_file_size" setting now renamed to "max_file_size" and is now a dictionary (comparefile.py)
	Keys are names of programs. Also get a warning dialog if you try to open a too-large file from the GUI.
    - Now sets "USECASE_HOME" for testing GUIs with e.g. PyUseCase to "pyusecase_files" (default/__init__.py)
	Previously allowed SUT's usecase files to get mixed up with TextTest's own.
    - default.CountTest script now reports a grand total at the end (default/__init__.py)
Batch Report Enhancements:
    - Now automatically generates a "dashboard" page containing links to all reports and current status (batch/__init__.py)
	Comes for free with "-coll", can also be done alone via -s batch.GenerateSummaryPage. See website.
    - Can now create separate report tables containing (e.g.) performance or memory information. (testoverview.py)
	Use -coll web.performance: see website for details.
    - If several versions are present on the same page, a "grand total" is shown.
    - Rows or tables containing only "N/A" will no longer be shown (testoverview.py)
    - If source files are empty, it points this out and suggests the disk may be full (testoverview.py)
    - Cells now have tooltips indicating which test and date they are, to avoid scrolling large tables (testoverview.py)
    - For the email report, SMTP authentication is now possible (batch/__init__.py)
	 New config file settings "smtp_server_username" and "smtp_server_password"
Grid Engine (LSF/SGE) enhancements:
    - Grid Engine command line now appears in the "Run Info" tab of the dynamic GUI. (textinfo.py)
Self-test/Internal changes:
    - PyUseCase instrumentation removed, use PyUseCase 3.0 which doesn't need this.
	Uses UI map files (under etc) instead, and command-line PyUseCase.
    - Now automatically pick up a local PyUseCase repository called "pyusecase" (texttest.py)
Bug Fixes:
    - Accelerators for "Cut Test", "Copy Test" and "Paste Test" are disabled when a text widget is focussed (adminactions.py)
	Means you can use Ctrl+X, Ctrl+V, Ctrl+C for text manipulation in TextTest windows.
    - Newly created applications now work without restarting if version control is enabled (controller.py)
    - Worked around a Mercurial bug renaming files with symbolic links in the name (hg.py)
    - "copy_test_path:$ENV_VAR" will now do nothing if ENV_VAR is empty (sandbox.py)
	Previously set it to $TEXTTEST_SANDBOX/. which could cause problems.
    - If a "collate_script" produces an empty file from non-empty input, don't write an empty file (sandbox.py)
    - An "extra_version" will now read its GUI-testing config and not just assume it's the same as the parent (guiplugins.py)
    - "save_filtered_file_stems" now supports file name expansions (comparefile.py)
    - Scripts like default.CountTest won't send spurious mail if run with the batch flag ("-b") (default/__init__.py)
    - Don't stacktrace if an environment variable in "copy_test_path" doesn't exist (sandbox.py)
    - Don't stacktrace if a "collate_script" doesn't exist (sandbox.py)
    - Don't stacktrace if the argument to "-cp" (or Times to Run) is invalid (default/__init__.py)
    - Don't stacktrace if a relative interpreter program isn't found (default/__init__.py)
    - Don't stacktrace if the same application name provided twice "-a app,app" on the command line (testmodel.py)

Version 3.16.1
==============
Bug Fixes to 3.16:
    - Sorted out radio button naming, which was strange in quite a few cases (guiplugins.py)
    - No longer ignore "vanilla" flag when finding UI map files (pyusecase_interface.py)
Fixes for older bugs:
    - Don't stacktrace if dynamic GUI window is closed with tests running (controller.py)
    - Slow-motion replay check box is shown after importing a new GUI-application for test (runningactions.py)
    - Recording tab no longer shown after importing a non-GUI application for test (guiplugins.py)
    - "Record Use-case" stays greyed out if the application under test isn't a GUI (guiplugins.py)
    - Fixed bug where repeating non-exact matches for traffic replay didn't produce them in the correct order (traffic.py)
    - Fixed performance issue with many doomed attempts to import non-existent GUI configuration modules (guiplugins.py)
    - copy_test_path_merge will now also merge subdirectories as it should (sandbox.py)

Version 3.17
============
Installation and self-test changes:
    - Deprecation warnings for GTK 2.18 fixed (guiplugins.py)
	Also workaround introduced in self-tests for GTK bug, so self-tests should be all green on GTK 2.18 now.
Static GUI Enhancements:
    - "Test paths containing" replaces "Test suites containing" box in Selection tab (default/__init__.py)
	Generalised to allow any substring or regexp of the relative path to the test.
	Also handles spaces as in the names on the webpage. See migration notes.
    - New options in application creation dialog (adminactions.py)
	For testing Tkinter with PyUseCase 3.2 and for testing Java classes
    - Added "Run" and "Record" to context menu (default_gui-static.xml)
    - Drop-down entries for "Test-files to search" are now sorted in sections (selectandfilter.py)
	Can configure via "gui_entry_options" also
    - All tabs now have a "Reset" button that will reset just that tab (guiplugins.py)
    - "Enter failure information" dialog rejigged, grouping related items together and adding tooltips (adminactions.py)
    - "Show All" now scrolls to the first selected test, if any
Dynamic GUI Enhancements:
    - Selection tab added
	Can do all of the selecting from the static GUI in the dynamic GUI also. (selectandfilter.py)
	Can also choose between the new and old results from the tests. Note accelerator for "select" changed.
    - Default colour scheme changed (guiutils.py)
	Now more subtle shades of green, yellow and red
    - New status "Initial filter" and "Final filter" (rundependent.py)
	Allows status view to distinguish between tests that are running and tests that are being filtered.
    - Status tab categories are now sorted alphabetically (statusviews.py)
    - "Root suite" is no longer always shown in the test tree (testtree.py)
	If it would otherwise be hidden, it's now hidden.
    - Performances improvements to "saving" operation. (testtree.py)
	Saving hundreds of tests should be noticeably faster now.
    - Tab selection no longer reset to "Test" if "Run Info" is being viewed (actionholders.py)
	Makes it easier to browse run info for several tests.
Framework Enhancements:
    - TextTest now sets exit codes when tests fail (engine.py)
	Useful for integration with continuous integration tools. Exit code 1 for any failure.
    - Traffic-interception mechanism can now intercept Python modules
	New config file setting "collect_traffic_py_module". See website.
    - Can now set a timeout after which tests will automatically be killed. (default/__init__.py)
	See "kill_timeout" documentation on the website. Thanks to Michael Behrisch
    - New flag "--ignorefilters" for disabling filtering for a test run (default/__init__.py)
	Allows full examination of run-dependent text filters
    - Options files now ignore comments and blank lines like other files (testmodel.py)
    - Can now unset environment variables via environment files. (testmodel.py)
	Use MY_ENV_VAR:{CLEAR} syntax
    - $TEXTTEST_ROOT variable added (sandbox.py)
	Basically to avoid referring to TEXTTEST_HOME in config files
    - "definition_file_stems" now supports UNIX-style file expansions (testmodel.py)
	As do many other file-related entries
    - "Known bugs" now provide full diff in Text Info and in HTML reports (comparetest.py)
	Additional to "bug" output
    - Traffic mechanism can now be run in a single thread (traffic.py)
	Set "collect_traffic_use_threads:false". Can be important for talking to some external systems, e.g. via COM.
    - Can now provide extra arguments to virtual display server (Xvfb on UNIX) (virtualdisplay.py)
	New config setting "virtual_display_extra_args"
Batch Report Enhancements:
    - Now includes overview graphs at the top of each page (resultgraphs.py)
	Can also be generated standalone via "-s batch.GenerateGraphs"
    - Can now produce batch report in "Junit format" (junitreport.py)
	Useful for integration with Ant, Hudson etc. New config file setting "batch_junit_format". See website. Thanks to Emily Bache.
    - Test descriptions now appear as tooltips over the test names in the first column (testoverview.py)
    - Fixed formatting problem when several tests had the same "known bug" from Bugzilla/Jira (testoverview.py)
    - Category ordering (coloured tables) now constant in summary page (batch/__init__.py)
    - Known bugs have their own colour in the pages, defaulting to orange (testoverview.py)
    - Added information on how to start TextTest on the relevant tests (testoverview.py)
Grid Engine (LSF/SGE) enhancements:
    - TextTest Slave Command now appears in Run Info, as well as SGE submission information (masterprocess.py)
    - Reconnection can now operate via the grid engine (queuesystem/__init__.py)
	Via -reconnfull grid, or via the third radio button in the static GUI reconnect dialog.
    - Job IDs now provided when jobs are cancelled (masterprocess.py)
Bug Fixes:
    - When searching with -grep ("test-files containing"), don't blindly include all versions of tests that match (testmodel.py)
    - Worked around a Mercurial symbolic link bug: if the test path has a symbolic link, dereference it first (hg.py)
    - Don't stacktrace on rename/move if VCS control directories are present but the VCS isn't installed (vcs_independent.py)
    - Values in radio buttons in dialogs now remembered correctly for next dialog usage (guiplugins.py)
    - Value of "Search-file to use" in Enter Failure Information dialog now remembered correctly (adminactions.py)
    - Don't bail out on absolute paths with arguments for "interpreter" (default/__init__.py)
    - Recomputing a test that has been saved now works properly (comparefile.py)
    - Load File Selection greyed out when there are no tests (selectandfilter.py)
    - Command-line traffic record mechanism now finds .exe files on Windows (traffic.py)
    - Missing file markers now created correctly for composite versions (comparefile.py)
    - emacs backup files (ending in ~) now ignored when creating applications (engine.py)
    - Fixed HTML batch report bug where older months got wrongly regenerated if some version was include but last active then (testoverview.py)
    - Fixed default save version with obscure combination of composite versions, base versions and unsaveable versions (comparefile.py)
    - Selecting files no longer enables recording when both GUI and non-GUI tests loaded simultaneously (guiplugins.py)
    - Error dialogs can no longer get arbirarily big, if there is too much info we just refer to a file now (runningactions.py)
    - Jira plugins can now handle unicode characters in bug text (jira.py)
    - Reconnecting to corrupted or empty test files now ignores and recalculates anything it can't parse (reconnect.py)
    - Traffic files recorded on Windows can now be used on Linux without bad line-ending effects (traffic.py)
    - Remove default behaviour to save static GUI selections in temporary locations (selectandfilter.py)
	Very inconvenient with newer GTK which then won't let you remove the directories.
    - -b and -keeptmp options now work together. Thanks to Matt Baker. (default/__init__.py)


Version 3.18
============
Static GUI Enhancements:
    - Can now update from version control directly from the UI (vcs_independent.py)
	Triggers a refresh automatically
Framework Enhancements:
    - Traffic interception server now runs in a separate process (traffic_server.py)
	This means it works better intercepting modules that prefer to be in the main thread (e.g. COM)
	or for GUI-related stuff that might clash with GTK.
    - Python interception is now much more general and reliable (traffic_server.py)
	The version in 3.17 worked on basic cases but hadn't been widely tested
	Online docs for it greatly expanded also.
    - Python interception can now be applied to individual attributes/functions as well as entire modules (traffic_server.py)
	New config file setting "collect_traffic_py_attributes". See online docs for details.
    - Can now pass arguments to the "interpreter" program via "interpreter_options" files (testmodel.py)
	Work much like "options" files otherwise.
    - Can now disable previously defined bug reporting (knownbugs/__init__.py)
	Keep the trigger information but remove the lines corresponding to the report itself.
    - When a test is killed on Windows, the entire process tree is removed by default (jobprocess.py)
	New config file setting "kill_command" also, see docs. Thanks to Michael Behrisch.
Batch Report Enhancements:
    - Uncompleted tests (unrunnable/killed/cancelled) have their own dark-red colour now (testoverview.py)
    - Summary page can now produce pie charts instead of HTML tables (summarypages.py)
	Use the new setting "historical_report_piechart_summary"
Bug Fixes:
    - Personal configuration settings such as window_size are now read when starting from scratch with --new (guiutils.py)
    - Multiple line options files now work again: these worked in 3.16 but not 3.17 (testmodel.py)
    - No longer get stack traces when using Selection tab in the dynamic GUI while running tests via grid engines. (default/__init__.py)
    - Tests with shell characters in the name now work better using grid engines (masterprocess.py)
    - Tests with ":" in the name also work better using grid engines (though still fail with collect_traffic) (masterprocess.py)
    - Better error message trying to save if the temporary file has been removed in the meantime (comparefile.py)
    - Loads of Python module interception bugs and limitations fixed (traffic_server.py)
    - Collected emails ignore old excluded runs when deciding what date to put in the subject line (batch/__init__.py)
    - No longer write to stderr on TEXTTEST_EXCEPTION which just results in double error reporting (testmodel.py)
    - Rerun now disabled when reconnecting, it was misleading as it re-reconnected (runningactions.py)
    - import_config_file now finds files in subsequent entries along TEXTTEST_PATH, instead of just the first (testmodel.py)
    - Naming for changes in memory consumption now consistent between using grid engines and not doing so. (queuesystem/__init__.py)
    - Tkinter testing always enables interception of tkMessageBox by default without which it doesn't work so well (adminactions.py)
    - Eliminated race condition when reading config file settings from different threads (plugins.py)
    - Completed workaround from 3.17 for symbolic link bug in Mercurial: found a related case (hg.py)
    - Link to homepage on credits dialog now works with newest PyGTK versions (2.16) (helpdialogs.py)

Version 3.19
============
General GUI Enhancements:
    - "App names containing" field will only be shown if more than one app name is present (selectandfilter.py)
    - "Execution time" field will only be shown if performance testing is enabled (selectandfilter.py)
    - Status bar now includes the full path to the test when actions on single tests are performed (guiplugins.py)
    - When performance testing is enabled, can now select the n fastest or slowest tests (performance.py)
	New spin buttons appear on the Selection tab as appropriate.
    - Some startup optimizations: GUI should come up sooner on large suites now (controller.py)
Static GUI Enhancements:
    - Description boxes are now much larger and easier to enter multiple lines (guiplugins.py)
	For Add Test and Rename Test.
    - When you select a file, a preview of it appears in the bottom right window (textinfo.py)
	Similar to existing functionality in the dynamic GUI.
    - When a test is copied or cut, its foreground colour changes in the test view (adminactions.py)
	Makes it easier to keep track of what is being done
    - Can now test your run_dependent_text filtering directly without running a test (runningactions.py)
	Can be selected rom the file popup menu
    - "Enter failure information" dialog reorganised (adminactions.py)
	Mostly to group the various trigger criteria and make it easier to create bugs on free_text.
    - Text info field now shows the full path to the test underneath the description (textinfo.py)
    - "Times to run" entry on Running tab is now a spin button, a bit nicer to handle and less error-prone (guiplugins.py)
Dynamic GUI Enhancements:
    - Can now select all tests with the same diff as the currently selected one (statusviews.py)
	New action in file popup menu
    - Missing and New files appear in separate branches in the status view tree (statusviews.py)
    - Run Info tab now shows times at which individual tests started and ended (textinfo.py)
    - Run Info tab now shows full path to the test instead of just the name (textinfo.py)
    - When running tests are viewed, completion percentage is estimated from stored CPU time as well as file sizes (textinfo.py)
    - Now told explicitly which extra versions to load by the static GUI (runningactions.py)
	Saves time on startup, especially when running multiple copies of tests with many extra versions present.
Framework Enhancements:
    - New naming scheme introduced for standard streams (default/__init__.py)
	"stdout", "stderr" and "stdin" replace "output", "errors" and "input". See migration notes.
    - Known bugs can now also search in the test's "brief_text", i.e. the Details column in dynamic GUI (knownbugs/__init__.py)
	"Enter Failure Information" dialog helps make it easy to request this
    - Known bug information is now correctly updated when a test is saved or recomputed (knownbugs/__init__.py)
    - "base_version" and "extra_search_directory" can now nest to arbitrary levels (testmodel.py)
	Previously didn't work for base version's config file to identify these things.
	Now it will go on reading config files identified by the ones its already read until there aren't any more.
    - File difference previews now indicate when they have truncated some long text (plugins.py)
	In either batch mode reports or the dynamic GUI's text window at the bottom right.
    - System warnings reviewed (plugins.py)
	Many that were previously largely invisible when running the GUI will now turn up as GUI popup windows.
	Others will also appear on the console. One example is when a test is referred to but cannot be found.
    - Can now stop test execution after the first test failure (actionrunner.py)
	-stop on the command line, or appropriate check box on Running tab. See docs.
Batch Report Enhancements:
    - Cell text generator rewritten (testoverview.py)
	More closely based on text that appears in the UI. Less prone to being horribly long.
    - batch_result_respository and historical_report_location now expand ~ to home directory (batch/__init__.py)
Grid Engine (LSF/SGE) enhancements:
    - We now poll the grid engine every 15 seconds for job information (masterprocess.py)
	Means that the GUI shows if a test job is suspended or in some other internal grid states
	Also means that crashed jobs (e.g. on bad hardware) are picked up automatically rather than remaining pending.
Bug Fixes:
    - File previews in bottom-right Text Info window no longer get confused by files with "---" separators in them (textinfo.py)
    - If a collate_script hangs, killing the test /terminating TextTest now works smoothely (sandbox.py)
    - Traffic server no longer relies on centrally installed PyUseCase. (traffic_server.py)
    - Python interception now handles module objects being returned (traffic_server.py)
    - Python interception correctly intercepts objects belonging to submodules (traffic_server.py)
    - Python interception handles intercepted objects being passed as keyword arguments (traffic_server.py)
    - Python interception sorts keyword arguments so they are reported deterministically (traffic_server.py)
    - Python interception reports float values to 2dp rather than arbitrary precision (traffic_server.py)
    - slow_motion_replay_speed now allows floating-point values. (default/__init__.py)
    - Recording no longer eliminates unsaveable versions from the default version used (runningactions.py)
    - Don't stacktrace linking to Jira issues if the issue description contains illegal characters (jira.py)
    - Don't stacktrace linking to Jira issues with custom fields defined but no values present (jira.py)
    - Don't stacktrace if the window icon cannot be set for some reason (controller.py)
    - Fixed graph bug where negative test numbers sometimes shown with matplotlib 0.99 (resultgraphs.py)
    - Definition files that get incorrectly regenerated produce a warning now rather than being shown as "New" (comparetest.py)
    - Reconnecting (with reconnfull flag) to a test containing unreadable files now works (reconnect.py)
    - Reconnecting to crashed tests now shows the original stack trace correctly (knownbugs/__init__.py)
    - When test suites are reordered, scroll to show the new position in the tree (testtree.py)
    - Grid engine: pass on -xr flag to grid slaves so that logging proceeds correctly (masterprocess.py)


Version 3.20
============
System requirements (see Migration Notes):
    - TextTest GUI now requires at least Python 2.6 and PyGTK 2.16.
	Should also be compatible with Python 2.7 now
Static GUI Enhancements:
    - Selecting for a version picks up versions where the given one is a base_version (selectandfilter.py)
	Version matching is now the same as that used for other purposes
    - Selecting for a version works correctly when the given one resets "extra_version" (selectandfilter.py)
	Picks up the reset correctly.
    - Now warns you if you load tests of one version and try to run tests of an unrelated one (runningactions.py)
	Previously just tried to silently amalgamate them.
    - Old "Recording" tab is now a dialog (runningactions.py)
	Hopefully less easy to get ignored now
    - Running/Advanced tab better organised (runningactions.py)
	Now has frames and various things get greyed out when not appropriate
    - Traffic interception record checkbutton moved to Basic tab and became a radio button (when enabled) (default/__init__.py)
	Now a third option to record new traffic and replay already recorded traffic simultaneously. See migration notes.
    - File previews in "Text info" now get updated when a file editor is closed (fileviewers.py)
    - Initial dialog GUI settings has an option for wxPython GUIs in PyUseCase 3.4 (adminactions.py)
    - Shortcut bar setting now greyed out if PyUseCase cannot be found (actionholders.py)
Dynamic GUI Enhancements:
    - Rerun now fires up a dialog (runningactions.py)
	This means you can change the run options before rerunning.
    - Recomputing marked tests now works correctly (plugins.py)
	Icons also displayed when appropriate, irrespective of test marking
    - Recomputing running tests on remote file systems now works (sandbox.py)
	Also allows following files remotely on such tests.
Framework Enhancements:
    - Config files may now be created per test instead of just per application (testmodel.py)
	Not all settings will work per test. See website for details.
    - {INTERNAL writedir} in "run_dependent_text" now works on Windows with the default TEXTTEST_TMP (rundependent.py)
	Works by hardcoding the string "Documents and Settings". Still won't work with other paths with spaces.
    - Can now get known bugs to automatically trigger a rerun of the test (default/knownbugs/__init__.py)
	Useful for example when environment failures are periodically present.
    - Autogenerated version names when running multiple checkouts are shorter (default/__init__.py)
	Leads to less wide windows being created
    - Autogenerated version names from multiple checkouts are automatically made unsaveable (testmodel.py)
	i.e. behave as if they were in the config setting "unsaveable_version"
    - "collate_file" can now reference environment variables (sandbox.py)
	including those set in specific tests
    - Running tests remotely should work better on Cygwin and on hosts with older shells (runtest.py)
	Quoting consistently uses hard quoting throughout and scripts don't use ~ or "export VAR=val" syntax any more.
	Also explicitly assume Cygwin-format paths when doing this on Windows.
	Thanks to Matt Baker for assistance here.
    - "Traffic interception" is no longer enabled by default (traffic.py)
	New setting "collect_traffic_client_server" which enables it for client server testing.
	Relevant options will only be available if that, "collect_traffic" or "collect_traffic_py_module" are set.
    - Traffic interception no longer records for new modules just because old modules exist (traffic.py)
	Need to explicitly request recording for new items
    - "collect_traffic_py_attributes" now called "collect_traffic_python" and works on builtin modules (traffic.py)
	Changed how it operates. Config form of it has changed and unified with "collect_traffic_py_module", see migration notes.
    - Can now filter out certain calling modules/directories when doing Python interception (traffic.py)
	New config setting "collect_traffic_python_ignore_callers".
	By default it includes the whole standard library and TextTest itself. See website docs.
    - Python attributes that get requested repeatedly don't cause extra traffic file entires (traffic_server.py)
	Just causes traffic files to be long and there is little point keeping track of the number of calls.
    - collect_traffic now handles environment variables being unset (traffic.py)
	Previously only recorded them being set to something else.
    - New definition file "testcustomize.py" for Python programs (traffic.py)
	Intention is for it to work like "sitecustomize.py". Useful usually for monkey-patching on startup.
    - Window hiding is now configurable for GUI testing on Windows (virtualdisplay.py)
	New config setting "virtual_display_hide_windows". Still enabled by default.
    - New hook for custom config modules to set up config file variables that depend on other ones (testmodel.py)
	setDependentConfigDefaults is now called as it is in the core. Does nothing by default.
Batch Report Enhancements:
    - HTML report now shows file diffs as well as bug information when tests have "known bugs" (testoverview.py)
	Makes it consistent with GUI and email report
    - "-bx" flag will now find the exact tests run by a particular batch session (default/__init__.py)
	Previously just picked up "batch_extra_version". See migration notes.
Grid Engine (LSF/SGE) enhancements:
    - Reconnecting using the grid no longer insists on using the resources etc. from the test itself (masterprocess.py)
	Means it should be faster and make better use of available machines
    - New config file settings to replace QUEUE_SYSTEM environment variables (masterprocess.py)
	Same names but lower case. Because config files can now be created per test. See migration notes.
    - Parallel job machine name formatting improved
	Should make for less wide boxes in HTML report
    - Uncompared temporary files are now shown if a slave job is killed but does not report in (filetrees.py)
	Usually happens when comparing the results takes longer than SGE's notify period
    - Don't leak SSH_TTY to SGE jobs (masterprocess.py)
	Seems to cause trouble on SuSE 11.
Bug Fixes:
    - Fixed Mac OS-specific bug that made traffic server fail (and by extension, recording with default settings) (traffic_server.py)
    - When recomputing, don't reload the configuration while tests are still running (changeteststate.py)
	Can lead to indeterministic errors
    - No longer try to run with multiple apps with the same name (testmodel.py)
	Pick the first one we find and run with that.
    - Fixed bug around selecting a particular version from a filter file containing tests for many versions (plugins.py)
    - Reselecting a test row when only some of the test versions are selected now reselects all versions again (testtree.py)
    - If "executable" isn't defined in a config file, don't try to make an application out of it or create testsuite files (testmodel.py)
    - Static GUI no longer makes spin buttons for text fields that just happen to have a numeric value (guiplugins.py)
    - Fixed run version problems when running the static GUI with multiple versions (default/__init__.py)
    - Various fixes for issues to do with handling extra_versions when reconnecting via a grid (queuesystem/__init__.py)
    - If externally set environment variable is reset in one test, don't leak this fact to other tests (testmodel.py)
    - Reconnecting to several runs that differ only by date will now provide the most recent as "main version" (reconnect.py)
    - Reconnecting now works if an extra_version is provided explicitly (reconnect.py)
    - Reconnecting and then recomputing a test with a known bug now works properly (knownbugs/__init__.py)
    - Removed incorrect warning when "unordered_text" differed between several applications run (guiutils.py)
    - Workaround for GTK+ 2.20 bug around RC file handling in .gtkrc-2.0 files (controller.py)
    - Fixed race condition when recomputing a running test just as it completes (controller.py)
    - Fixed race condition when recomputing a running test simultaneous to a grid engine poll (changeteststate.py)
    - traffic.ModifyTraffic script doesn't leak temporary files if it fails (traffic.py)
    - Viewing files on remote machines now works together with ssh, instead of just with rsh (fileviewers.py)
    - Fixed stacktrace when viewing Jira issue with unicode characters with no encoding, i.e. LANG=C (jira.py)
    - Code to clean up leaked Xvfb lock files now actually works (startXvfb.py)
    - Fixed stacktrace on shortcut folders when e.g. starting from scratch in your home directory (guiplugins.py)
    - Fixed stacktrace on extracting GUI config entry documentation on Windows when GTK not installed (!) (guiutils.py)
    - Fixed bug where failure to clean previous batch temp directories was not reported properly (plugins.py)
    - Fixed stacktrace when Dictionary config file entries used as basic types (plugins.py)
    - Fixed race condition in traffic server where shutdown could complete before all requests were handled (traffic_server.py)
    - Traffic mechanism now handles SUT changes to PATH correctly (traffic_server.py)
    - Fixed occasional module lookup bug in Python interception (traffic_server.py)
    - Fixed Python interception bug on Windows paths with an 'n', that got confused with linebreaks (traffic_server.py)
    - Rerun no longer repeats versions in sandbox root directory name (default/__init__.py)
    - Dynamic GUI window title now reports correctly when more than one checkout is being used (controller.py)
    - default.ReplaceText now works without an explicitly provided file, as it once did (scripts.py)
    - default.ReplaceText now works with text containing "=" characters (scripts.py)
    - default.DocumentEnvironment now works with an explicitly provided variable name (scripts.py)
    - Fixed stack trace on trying to view file properties on a file that has been removed (fileproperties.py)
    - Fixed stack trace importing and copying a file to make a new directory (adminactions.py)
    - Various error messages tidied up (e.g. filetrees.py)

Version 3.21
============
System requirements (see Migration Notes):
    - "Traffic mechanism" is now a separate library called "capturemock" and should be managed separately
	Suites with the old settings will not start any more. You will need to migrate as described in the migration notes.
General GUI Enhancements:
    - GUI now cleans up appropriately on receiving SIGINT on UNIX (engine.py)
	Means dynamic GUIs can be closed from static GUI without leaking files.
    - New entry in file view popup menu "Copy path to clipboard" (fileproperties.py)
	Can be used to paste full paths in either static or dynamic GUI to other programs.
    - Help dialog now reports location of test suite and Python installation (helpdialogs.py)
    - FileChoosers now remember any previously chosen locations when restarted (guiplugins.py)
Static GUI Enhancements:
    - Local "wrapper" scripts now appear in static GUI config tab (filetrees.py)
	Any "executable" or "interpreter" that depends on "TEXTTEST_ROOT" will be shown.
    - Application creation dialog now includes GUI test options for Eclipse RCP and SWT
	Which are supported in PyUseCase 3.5
    - Creating an application for testing PyGTK will now generate a repoint of XDG_CONFIG_HOME
	This is basically always needed in theory and quite a gotcha if you aren't familiar with it.
Dynamic GUI Enhancements:
    - Rerun is now enabled and working from reconnect runs (runningactions.py)
    - Test-specific configuration files also re-read when recomputing (changeteststate.py)
	Previously only reread application config files.
    - Behaviour of "Save" with versions changed (changeteststate.py)
	Always save the version compared with unless specified. See migration notes.
    - Text info times handle execution times > 1 day now (textinfo.py)
CaptureMock Enhancements (over old TextTest traffic mechanism):
    - Now handles Python base classes correctly
	Base classes now listed explicitly. Some recorded traffic may not work. See migration notes.
    - Can now "fix up" python objects which aren't repr-eval compatible
	See CaptureMock documentation
    - Replay matcher improvements
	No longer has TextTest paths hardcoded into it
	Instead counts items in matching sequences, followed by the number of non-matching sequences.
    - Python interception no longer uses a server process
	Basic effect is that it has to use a separate file from the command line/client-server interception
	See migration notes.
    - No longer works to intercept command line programs in the Windows system directory (e.g. Java)
	Windows doesn't want you to do this and it's hard to get right.
    - Windows paths no longer magically converted to UNIX ones
    - "Shell-like" quoting in command recording is largely removed
	Made it difficult to see which quoting came from the program and which came from the tool.
	Only thing that remains is double-quoting when arguments contain spaces.
    - Works under Jython (as does pycoverage support)
Framework Enhancements:
    - New Trac plugin for known bugs functionality (trac.py)
	Alongside Bugzilla and Jira ones. Thanks Michael Behrisch.
    - Jira plugin now highlights 'resolution' field if it is set, instead of 'status' (jira.py)
	This information is usually more interesting.
    - Filter files can now list selected test suites as well as tests (default/__init__.py)
	"Save selection" in the GUI will also just list selected suites instead of every test in them.
    - New standard location to store local config modules (testmodel.py)
	Place in a directory under the root of the test suite, called "texttest_config_modules"
    - Now enable Java features if "java" appears anywhere in "interpreter" setting (default/__init__.py)
    - "Properties files" support removed (sandbox.py)
	Handle Java system properties via "interpreter_options" files, others via normal data file mechanism.
Batch Report Enhancements:
    - Can now get green/red colourings from the batch console output (colorer.py)
	Use the new -zen option. Thanks to Matt Baker for this.
    - Email-sending in batch mode is no longer enabled by default (batch/__init__.py)
	Previously automatically sent mail to $USER: now many only use the HTML reports.
    - Usage hint in the HTML report now includes -d flag (batch/__init__.py)
	Helps actually locate the test checkout where they were run from
    - Allow setting the date for a date-based batch job (batch/__init__.py)
	Using e.g. -name 04Nov2010 will now achieve this. Useful for very long continuous integration jobs,
	e.g. running over a weekend.
    - Old results are now shown in a light-grey foregound colour on the HTML report summary pages (summarypages.py)
	(or light-grey background in the case of the pie-chart version)
	This to prevent confusion when several processes update the same table in sequence.
    - Now works together with multiple copies and batch_use_version_filtering (batchutils.py)
	Previously filtered away copy versions
Grid Engine (LSF/SGE) enhancements/bug fixes:
    - Status tab now shows grid engine status (e.g. suspension) also (statusview.py)
	Previously only visible in the test tree view.
    - Ignore order of lists of resources when deciding about reuse (masterprocess.py)
	Previously started new jobs if one test required resources a,b and the other required b,a.
    - Possibility to set up a proxy operation with separate resource requirements (masterprocess.py)
	So far used to set up a database on a database server, with the test running elsewhere.
	See website for more details.
    - SGE errors beginning with a blank line are no longer ignored (sge.py)
Bug Fixes:
    - Running extra versions with an explicit version from the static GUI does not flip version order any more (testmodel.py)
    - TextTest no longer allows data file names to clash with its own pre-defined definition file names (testmodel.py)
    - "Run Info" information when reconnecting is heavily reduced (textinfo.py)
	This to avoid the impression it's describing the environment where the original test ran
    - Disabled "regeneration" warning when recording UI tests (comparetest.py)
    - If unexpected things get regenerated, compare them as well as producing a warning (comparetest.py)
    - Fixed spurious warnings in the dynamic GUI if "<default>" setting is deleted when rerunning tests (runningactions.py)
    - Performance-related config settings can now depend on tests and suites (sandbox.py)
    - Filtering for a version and then selecting a suite no longer selects versions that should be filtered away (testtree.py)
    - Selecting from the static GUI now handles empty suites correctly (selectandfilter.py)
    - Now works if system sitecustomize.py adds things to PYTHONPATH where e.g. coverage, capturemock are found. (sitecustomize.py)
    - No longer prints warnings for non-existent tests that would have been filtered out anyway (testmodel.py)
    - Fix stacktrace when using gui_entry_override for checkbox settings in dialogs (plugins.py)
    - Don't bail out loading selections where some app isn't referred at all (plugins.py)
    - Don't regenerate batch HTML report index files if nothing the refer to has been regenerated (summarypages.py)
    - GUI now shows data files which are defined in test-specific config files (testmodel.py)
    - "historical_report_page_name" is now respected if provided in an "extra_version" (batch/__init__.py)
    - Fixed stacktrace on providing "-v" with no arguments (testmodel.py)
    - "collate_file" now works if test names have glob metacharacter like '*' or '[' in them (sandbox.py)
    - Fixed stacktrace when "max_file_size" set and files are viewed remotely which can't be accessed locally (fileviewers.py)
CaptureMock BugFixes:
    - __getitem__ now intercepted correctly for new-style classes (traffic_pymodule.py)
    - fixed infinite recursion bug if something used by inspect.getstack is intercepted (traffic_pymodule.py)
    - No longer stacktraces if called on Python earlier than 2.4 (sitecustomize.py)
    - No longer writes a trailing space if the program is called with no arguments (capturepython.py)

Version 3.22
============
Installation:
    - There is now a Windows installer (which also includes StoryText, ex PyUseCase)
General GUI Enhancements:
    - File selection is now preserved when a new test is selected
	Makes it easier to compare previews of different test results
    - Window naming changed
	Main aim is to put differentiating info at the start to aid finding in window managers
Static GUI Enhancements:
    - Version information now shown when a single test/suite with extra versions selected
	Previously hard to tell which was selected
    - Removing tests is now possible when files are selected
	Ctrl+Delete now always deletes tests. There is no default accelerator for deleting files.
    - Can now specify additional settings that only affect the current run
	For example set an environment variable, add a command line option. See Advanced tab under Running.
    - GUI testing for Swing - StoryText (formerly PyUseCase, now supporting Java also)
	replaces defunct JUseCase in application creation dialog
Dynamic GUI Enhancements:
    - New option "<full version>" in "version to save" in Save As dialog
	Basically save with the full version you ran with, as was default behaviour in TextTest 3.20
	Particularly helpful when running multiple versions
    - Recomputed completed tests always reloads config file, even if other tests still running
	Threading-related issues fixed.
    - When a file-related row is selected in the status view, select equivalent files in the test file view
	Note changes behaviour of "Save" in this situation
    - New "pairwise viewer" for test files - View Differences (between tests)
	If you select exactly two tests and one file, you can compare the behaviour of two test runs with each other.
	This is aimed at multiple versions/instances of the same test being run.
    - Settings of $TEXTTEST_CHECKOUT and $TEXTTEST_CHECKOUT_NAME now listed in Run Info tab
	Also made it easier for configurations to configure what appears there
Framework Enhancements:
    - Added "{PREVLINES }" construct to run_dependent_text
	See website for details
    - Added possibility to configure copying procedure for test data files
	See docs for "copy_test_path_script".
    - Improved reporting when tests are rerun due to known bug failures
	Now see how many times something has been run before failing.
    - Now support GUI testing on separate networks
	Both virtual display and accessibility of usecase and UI map files fixed
    - "performance_logfile" now works on any file, not just those that are being compared
	Unix file expansions can also be used
    - performance percentage numbers are now rounded to the nearest integer rather than truncated
    - Allow disabling of CaptureMock from TextTest (-rectraffic 3, or an extra radio button in the static GUI)
Batch Report Enhancements:
    - New filtering toolbar in the HTML pages
	Various operations for filtering the tests. See website for details.
    - If a date is used as the name, use that throughout instead of the actual date to identify the run
    - Junit format report now assumes locale encoding instead of hardcoding UTF-8
    - Junit format includes times when performance enabled
    - HTML pages link all graphs at the top so they can be seen at once, if there is more than one graph on the page
    - Made it easier for configurations to override how batch sessions are defined - single API function for it
	Caused some backwards compatibility changes for scripts - see migration notes
Grid Engine (LSF/SGE) enhancements/bug fixes:
    - New Dynamic GUI actions to suspend and unsuspend a test in SGE
	See popup menu in test tree
    - Fixed stacktrace when normal polling cannot find a job, e.g. if SGE master goes down
    - Fixed related issue where submitted but unstarted jobs get marked "SGE job exited" if SGE master goes down
    - Fixed problem where knownbugs cause tests to be rerun but there is no available job to run with
    - Fixed stacktrace in slave when test names contain colons
    - Recomputing after a status update in SGE no longer duplicates progress information
    - Now handles hold state (hqw) correctly
    - Fixed hang if slave gets an invalid test for any reason
    - disabled confusing multiplication of performance limits by number of processes run
    - Various network problem-related robustness fixes
    - Don't allow SGE job reuse if virtual display args differ between tests
Bug Fixes:
    - Fixed inconsistencies in dynamic GUI with test suite "all succeeded" status when tests are recomputed and then fail.
    - Fixed stacktrace trying to build piecharts when matplotlib not installed
    - Make sure options after positional arguments get treated as arguments to the new program
    - Allow linking of executable, which is done in the new rpm (thanks Michael Behrisch)
    - Record/Add dialog sizes improved
    - Focus in dialogs with file choosers (like the application creation one) now starts at the top
    - Command lines with empty string arguments now shown correctly in Run Info
    - On POSIX platforms, tests that set LANG and change encoding will no longer cause errors from TextTest previews
    - Fixed occasional stacktraces when viewing files in tests exactly as the test in question completes
    - Tried to improve handling of errors from "ps" on POSIX systems
    - Fixed bug where invalid names of saved selections persist even after being changed
    - Fixed stacktrace replacing text in files if the pattern matches a directory
    - Fixed stacktrace and inconsistency pressing "show only selected" before all tests have loaded
    - "Java detection" also works if "jython" provided in the interpreter now
    - Timeouts no longer applied when recording tests
    - No longer stacktrace if the "Enter Failure Information" dialog is destroyed
    - Refactoring to speed up reading of tests, especially when reconnecting
    - Fixed bug where Rerun functionality lost settings from the original run
    - Fixed bug with running remotely where files existed both locally and remotely - don't copy in this case.
    - Fixed/worked around GTK issue so that clearing the visibility check boxes in the status view unselects the row also
    - Now works to refer to TEXTTEST_SANDBOX in options file when running tests remotely
    - Don't get confused by test/suite names 'config' or 'performance'
    - Recomputation now works when the app config file is changed, and there is also a test config file
    - No longer fail to remove tmp directories if there are readonly broken links in them
    - Fixed crash doing "Test Filtering" when no filters were defined


Version 3.23
=============
Framework Enhancements:
    - Now take advantage of multiple cores when running tests locally with no grid available
	Somewhat overdue feature but it should speed up TextTest usage on single machines considerably now.
    - Can now chain several "interpreter" programs together, instead of having only one
	New config file section "interpreters". See website.
    - Can now run the SUT more than once using different settings for the same test
	New setting "extra_test_process_postfix". For example to verify database writes. See website.
    - "Known bugs" no longer cause TextTest to exit with exit code 1
	It's reckoned they are under control and hence not a reason to fail anything, e.g. a Jenkins build.
    - "copy_test_path_merge" can also be used on files now
	This has the meaning of appending the various files to each other and is intended for "settings"-type files to avoid having to
	copy general settings to test-specific settings-files. See the migration notes and the config file documentation.
    - "performance_logfile_extractor" format is more general
	Can now use regular expression groups to specify any format at all
    - Can now disable regular expression matching when replacing text in files
    - Replace Text In Files functionality (in static GUI and default.ReplaceText script) now handle multiline input
	Able to replace several lines with several other lines at once
    - "ssh" is now default program to use to run remotely
	Replaces "rsh", which is dying out
Dynamic GUI Enhancements:
    - Grouping now notices if some diffs are repeats of other diffs
	You may now get something like "Group 3*2", which means this is "Group 3"'s diffs, repeated twice
    - "Enter Failure Information" can now be done in the dynamic GUI
	Makes it easier to instantly verify if a knownbug is applied or not
    - New "Find failure information" action
	Allows finding other reported bugs in the test suite that might match a given failure, and applying them
    - New "split result files" action
	This allows viewing, grouping and saving the differences of parts of your files separately, for example in case many
	things have changed at once. There is a new config value "file_split_pattern", see the documentation of that in
	the config file documenation for more details of how to use it.
    - New "reload tests" action
	This is essentially like reconnecting to the current run. Main point being to make it possible to reload results
	using the grid, and/or without interfering with the currently shown results.
Static GUI Enhancements:
    - Record dialog now allows recording on a different machine via SSH
    - Root test suite is automatically selected when adding a new application
	Idea is to make it easier for newbies to understand what to do at the start.
Batch Report Enhancements:
    - Now possible to specify a specific command to kill test processes also on Linux
	"kill_command" is now portable. See docs.
    - Now allow different colours for performance and memory changes in HTML report
	Use e.g. larger_bg, faster_bg in [historical_report_colours]
    - If named runs are numeric, they will now be sorted numerically
	Previously sorting has been string-sorting, causing "10" to come before "9".
    - Summary page is now regenerated after each application
	Reduces the probability that these two can be out of synch for any significant time
    - For junit-format reports, can now choose which performance setting is used for the "time" field.
	New config file setting "batch_junit_performance"
    - Can now run in batch mode without keeping the temporary files
	Use "-keeptmp 0". "Reconnect" functionality becomse unusable of course.
    - Archiving the repository now results in it being compressed also
Grid Engine (LSF/SGE) enhancements/bug fixes:
    - Setting temporary environment variables now works with grid engines
    - Self-diagnostics in slave processes now requested separately
	New "-xs" flag for this. Not automatically inferred from "-x" any more.
    - Error messages from slave processes now shown also when running GUI
    - Error messages from proxy slave jobs are now shown
    - Proxy slave jobs now also use queues specified on the command line
    - Workaround for LS_COLORS bug in ancient version of tcsh
    - Fixed issue with "kill_timeout" if test gets suspended by grid engine
	Timeout only worked on wallclock time so test could time out prematurely.
Bug Fixes:
    - Junit report now handles tests with the same name in different suites properly.
    - "gui_entry_override" now works with spin buttons (e.g. "times_to_run", for the Running tab)
    - Fixed infinite recursion in static GUI if "interpreter" or "executable" took a script as an argument
    - Now display correct error message if a proxy job cannot be submitted to SGE
    - Now works to use coverage, capturemock and testcustomize.py under Python 3 when using TextTest
    - Importing a non-existent config file from a config file in a test no longer causes complete failure
	Just an error message for the test concerned
    - kill_timeout now disabled when using slow motion replay on GUI tests
    - Running tests on different networks (e.g. via SSH) now works also if individual tests have their own config files
    - All exceptions in the GUI are now shown in dialogs rather than the console, instead of only "expected" ones
    - Test-specific config file updates in the static GUI are now reflected better in operations like "Test Filtering".
    - Extracting performance-like numbers from log files ("performance_logfile_extractor") can now handle negative numbers
    - Section headers in environment files no longer cause a stacktrace
    - HTML report filtering now handle lower-case HTML colours as well as upper-case ones
    - Spurious error messages about duplicated sections in knownbugs files no longer produced under Python 2.7
    - Removed unicode-related error message that caused more trouble than it was worth
    - Don't copy version control systems control dirs when copying tests, even if they don't have a plugin (svn)
    - Removed VCS control dirs from display for application config tree
    - Removed possible hang if unexpected input received from startXvfb.py (virtual display handling)
    - Fix race condition when killing tests, don't terminate virtual display before process completes
    - "Replace Text In Files" works correctly when "=" characters are present
    - Fixed stacktrace trying to collect HTML report from an empty application directory
    - Discard directories in TEXTTEST_PATH that don't exist
	Previous stored them, forwarded them, kept looking in them etc
    - Error messages are now shown when doing "Follow File" remotely in the dynamic GUI file view.
	e.g. if the viewer requested doesn't exist or the remote shell configuration does not work.
    - Fixed bug in dynamic GUI where file view selections from actions in the status view
	Did not clear previous selections but added to them.
    - Now works when recomputing or saving causes a known bug to become irrelevant, state correctly updated
    - Core file interpretation now handles 'file' version 5 (previously only handled up to version 4)
    - Button images now no longer lost on some platforms
    - Can now register 0 time as performance, if compatible with other settings
    - StoryText files, particularly shortcuts, are now sorted in the Config tab
    - Windows installer no longer default-installs StoryText, and documents preconditions better

Version 3.24
============
General GUI Enhancements:
    - Can now set names also in the static GUI
	via the -name argument or the "Set Run Name" entry in the view menu, as it used to be in the dynamic GUI
    - New "Edit File" action in file drop-down menu when additional viewers are configured
	If you for example set a browser for viewing HTML files this allows you to open them conveniently with the default text editor also
    - Added StoryText's editor as default viewer for usecase files
Static GUI Enhancements:
    - "test_data_ignore" is now also used when displaying the storytext_files tree in the config tab
	Make it easier to ignore backup files, plugin sources etc.
    - Application creation dialog now allows pointing out jar files for Java programs
	Sets the class path and main class name internally
    - GEF added as an option for GUI testing
    - Swing option for GUI testing now finds SwingLibrary packaged with latest StoryText automatically
Framework Enhancements:
    - run_dependent_text now does not apply the filter in the case where the end marker is never found for a section filtering
	See migration notes for details
    - new run_dependent_text syntax {MATCH <number>}
	For filtering against later instances of the same pattern. See website.
    - New config file entry "virtual_display_count"
	Allows running multiple virtual servers in the case where for example several GUIs need to run simultaneously
    - When reconnecting, no longer show tests with no results
	Simply show less tests
    - Find Failure Information now integrates with version control plugins
	when moving or removing knownbug files
    - New config entry "default_performance_stem"
	Allows usage of selecting tests based on some other performance measure than "performance"
	batch_junit_performance is now an alias, but can no longer be configured per batch stem.
    - Knownbugs functionality now allows mulitline triggers and disabling regular expression matching.
	Hence a wider range of possible triggers
    - Knownbugs now add a brief description of why they were triggered to the report
    - Now cleans up properly on receiving SIGTERM (handled the same way as SIGINT)
Batch Report Enhancements:
    - Integration with Jenkins added
	If the job is triggered by changes in Jenkins, now link the authors and the changes from the test page.
	Also parse any bug IDs from checkin messages. See website for more details.
    - Removing previous results is now done in the background
	Avoids it slowing down the start of batch mode runs
    - A small textual report summarising the results is now produced in the log
	Similar to surefire plugin for Maven's description
    - Archived results are now named after the date of the results archived to, not the date when the archiving was done
    - Added possibility to generate web pages from archived data
	New option -collarchive. See website.
Grid Engine (LSF/SGE/Condor) enhancements/bug fixes:
    - Basic (alpha) support for Condor added
	Set queue_system_module:condor. Thanks to Tomas Liden for this.
    - Grid engine server now uses IP address instead of machine name
	Should make it more resilient to DNS trouble etc, also easier to override the behaviour
    - Fixed stacktrace when IP address is incorrectly configured
    - Fixed quoting problems when run arguments have spaces etc in them
Bug Fixes:
    - Find Failure Information picks the right file when the same bug has several triggers defined
    - Find Failure Information doesn't add spurious version IDs to new knownbug files
    - Find Failure Information removes any files left empty by its actions
    - Find Failure Information now looks in the whole suite instead of just the tests that are loaded
    - Junit report now escapes illegal XML characters in the message tag
    - Copying or moving a test to an extra version suite in the GUI no longer produces errors
    - Fixed bug when presence of file x and x.y in a test caused x to be compared, even if y was not the application name
    - Fixed reconnect failure when $TEXTTTEST_TMP was a subdirectory of $TEXTTEST_HOME
    - "Enter Failure Information" is no longer a modal dialog
    - Fixed run_dependent_text with {PREVLINES ...} filter where one of the lines would be taken by a different filter
    - Fix bug where reconnecting with recomputation to a test with a knownbug + rerun would rerun it indefinitely
    - Application creation dialog size in some environments fixed
    - Fixed problem where editing the main config file did not refresh properly if there were test-specific config files.
    - Fixed HTML report bug which didn't include descriptions for extra_version tests

Version 3.25
============
Static GUI Enhancements:
    - Refresh now reloads all test-specific config files
	Previously only reloaded the main application config files
    - (GUI testing) Can now automatically insert StoryText shortcuts into all tests without running them
	New script "default.InsertShortcuts" and item in Actions menu. Auto-detected when shortcuts are added via StoryText Editor.
    - (GUI testing) Auto-detect renaming from StoryText editor and trigger "Replace Text In Files" run
    - Added some new tooltips
Dynamic GUI Enhancements:
    - "Recompute Status" now runs in the background and doesn't lock the GUI
    - Now showing previews of succeeded files when they are selected
    - Adding ability to edit the original file also, when we have a different viewer added.
Framework Enhancements:
    - Can now make use of separate sandbox locations for running the test itself and for collecting logfiles / results
	Set default_texttest_local_tmp in your config file, or TEXTTEST_LOCAL_TMP in your environment. See website.
	(Usual setup is to run the test on a local disk and write its logfiles to a shared disk.)
    - Scripts used 'copy_test_path_script' can now use the environment variables set for the test run.
	Particularly useful if they need to refer to the logging location in a setup using the above default_texttest_local_tmp.
    - Memory/Performance settings can now be configured per test/test suite
	For example performance_logfile_extractor, performance_logfile etc
Batch Report Enhancements:
    - Now sort the applications in order of number of tests before generating HTML report
	If there are many large slow-to-generate test suites it's best they don't hold up small fast ones.
    - Applications whose test suite is removed but where old results still exist are still linked from the main index page
	Can be important, especially when live versions exist of older versions of the same apps.
    - Jenkins change handling now uses JENKINS_HOME and JOB_NAME instead of WORKSPACE variables
	Makes it independent of Jenkins workspace file layout, which seems to vary a lot
    - Jenkins change handling deals with aborted and incomplete runs in a better way
Grid Engine (LSF/SGE/Condor) enhancements/bug fixes:
    - Grid Engine submission no longer forwards the entire environment by default
	See migration notes
    - SGE errors handled in a better way, warn when we get a job status we don't expect
    - Don't lose track of SGE jobs that end up in "St" state
    - If SGE jobs start but then terminate without reporting in (e.g. by getting SIGKILL) react and report this.
    - Better handling of Eqw jobs in SGE. We grab now the error reason and kill them.
    - Added workaround for SGE issue with long command line, which are rejected as if they were long path names
Bug Fixes:
    - Fixed stacktrace for HTML report generation when the location doesn't exist yet
    - "Replace Text in Files" handles removing and inserting lines in a more consistent way
    - Fixed stacktrace when pressing recompute and temporary files have been externally removed
    - "Find Failure Information" now shows a progress indicator instead of just leaving the menu item present
    - Ignore kill signals after the first one has arrived, so we show the correct reason for being killed
    - Fixed knownbugs mechanism drops leading spaces from regular expressions. We don't accept leading spaces and show now an error message
    - Fixed occasional "TEXTTEST EXCEPTION" due to temporary file collisions when rerunning test after knownbug
    - Fixed problem with CaptureMock tests that capture files: save them when the files that refer to them are saved.
    - Fixed "Split Files" followed by "Recompute" does not work properly. "Recompute" removes now all split information if it's present.
    - Fixed problem where leading spaces got removing when matching run_dependent_text
    - Removed restrictions around rerunning tests with a version not included in the original run
    - Fixed stacktrace if test completes at the same instant it is killed
    - Creating new files via "Import File" always opens the default viewer (normally a text editor), even when a specific viewer is configured.
	Specific viewers often do not allow editing
    - Don't stacktrace when parallel GUI testing locally on Windows
    - When setting up for Java GUI testing, don't put Windows path names in the CLASSPATH, it can't handle them. Convert to DOS format first.
    - Fixed possible stacktrace in log statement in plugins.py (only relevant from custom configuration modules)
    - Fixed Jenkins plugin: Don't be fooled by artefacts whose names extend each other
    - Fixed Jenkins plugin: Double-check change information as it's prone to being corrupted by builds running concurrently
    - Fixed Jira plugin: stacktrace when Jira bug has no description
    - Fixed Jira plugin: wrong priority in jira info
    - Fixed Jira plugin: stacktrace when getting non-xmlrpc errors from Jira
    - Fixed Windows installer: failed when only TextTest and StoryText selected
    - Fixed Windows installer: get rid of the command window
    - Fixed Windows installer: doesn't allow incorrect install with Java GUI testing enabled but not Python GUI testing
    - Fixed Windows installer: no longer requires logging in and out after install if using Windows 7

Version 3.26
============
Static GUI Enhancements:
    - "Test Filtering" action now displays results in the normal text editor (default entry in "view_program")
	Allows searching, font configuration etc and is more consistent
    - "Test Filtering" now always reloads all configuration before running
	Previously triggered on an editor in a config file being closed, or on refresh being explicitly pressed
    - Config tab now has a context menu
	Many viewing actions, including version control ones, can now be carried out there.
    - (GUI testing) "run in slow motion replay" checkbox removed. It has been replaced with a spinner for adding a pause after each event and
	a new check box "Show GUI and record any extra actions".
    - (GUI testing) "Replace Text in Files" action now allows text search/replace in shortcut files.
	It shows a new check box, "Replace text in shortcut files" when GUI testing is enabled.
    - "Replace Text in Files" now applies back references as a whole, allowing e.g. swapping lines
	See migration notes
    - Can now enable CaptureMock directly from the initial application creation dialog
Dynamic GUI Enhancements:
    - Save now runs in background and is much faster for many tests
	GUI doesn't freeze while tests are being saved
    - Status view now subdivides performance numbers
	Instead of a single category "Faster" or "Slower" there are subdivisions based on multiples of the tolerance
	e.g. 10-20%. Should make it easier to spot things that are Faster because they failed catastrophically.
    - (GUI testing) New action "View screenshots" and new checkbox enabling screenshot generation in Running tab
	Intended for displaying screenshots created by new StoryText feature.
    - Wildcards now work in "file_split_pattern" list
	for the Split Files feature
Framework Enhancements:
    - Known bugs "search_file" field now supports wildcards
	for example "stdout*"
    - "Enter Failure Information" (known bugs) dialog has an extra option for providing exact matching
	Mostly for when you need to match an exact small diff, and not also trigger when other things are present.
    - Known bugs mechanism priorities
	If two known bugs are triggered and one of them requests a rerun, we report the one that didn't request a rerun.
	Can add priorities explicitly via "priority" field (not available via GUI yet)
    - New setting "custom_trigger" for known bugs, to allow further configuration of when to trigger
	(usually checking the environment)
    - TextTest now returns an exit code of 2 if there are only performanace differences
	Allows wrapper scripts to treat this differently from if there are failures.
    - (GUI testing) GUI shortcut renaming is now detected and a "Replace Text in Files" run triggered if desired, to update them.
    - (GUI testing) New script default.FilterUIMapFile
	for identifying unused entries in UI map files and shortcuts when GUI testing. See website.
Batch Report Enhancements:
    - Index page now notes which run the information there is based on
    - If you enable both the email and the HTML report, the email now just links to the HTML report
	New setting "file_to_url" to allow the links to be correct. See website and migration notes.
    - "batch_mail_on_failure_only" uses the same criteria as that which sets exit code 0
	So no mail will be sent when there are just known bugs now
    - batch.CollectFiles is removed. See migration notes.
    - batch.ArchiveRepository can give a different cutoff date for weekday-specific pages
	New argument "weekday_pages_before". See website
    - New script batch.ArchiveHTML
	Works like ArchiveRepository, but on historical_report_location. See webpage.
    - Jenkins changes feature now finds indirect dependencies where appropriate
	e.g. scope:provided in Maven
    - Jenkins changes feature now handles module structure in the jobs
	e.g. where artefacts are inside modules rather than directly in the job
    - Jenkins changes "marked artefacts" now variable per batch session
	Separate name from artefact name is also removed. Versions displayed when they change.
    - Now find Jenkins timestamps for runs, show them as tooltips in the HTML report
    - Jenkins cache files now include the date in their name as well as build number
	Saves trouble if the job gets moved to a different Jenkins server for example
    - We now wait for Jenkins fingerprints to be ready if BUILD_ID=none is set. See webpage
    - Adding links in html report to Jenkins jobs
Grid Engine (LSF/SGE/Condor) enhancements/bug fixes:
    - Default_queue setting should also apply to the proxy job
    - Don't produce warning spam if there are jobs with multiple spaces in their name
    - Run Info doesn't expand references to external environment variables any more when using grid
	This is generally misleading as the variables won't be forwarded to the grid jobs anyway
Bug Fixes:
    - Correctly find version control when TextTest files are only some part of the substructure
    - Workaround Mercurial bug for symbolically linked repository when removing or moving
    - Don't bail out if a testsuite file is missing and we don't have permission to create a new one
    - Always disable storytext editor when using a virtual display
    - Filled in some missing possible states from SGE
    - Fixed stacktrace on closing dynamic GUI after pressing F5.
    - Fixed problem when running tests on remote networks, and refreshing before they were done (F5)
    - Fixed leak of remote Xvfb processes on receiving job control signals (SIGXCPU etc)
    - Remote virtual display handling now tolerates warnings etc from ssh
    - Fixed Mac-specific exception when running in parallel
    - Fixed bug with trailing "E" and "." when doing floating point rounding (thanks Michael Behrisch)
    - Made RPM work again for "texttest.py", not just "texttest" (thanks Michael Behrisch)
    - Overlapping section filters in run_dependent_text now behave as expected. See migration notes as it may cause changes.
    - Fixing stacktrace when starting with parallel runs using a relative path to TextTest
    - Parallel GUI configuration and "Edit File" (when appropriate) now enabled on initial app creation without need for restart
    - GUI testing-specific menu items are no longer present when not GUI testing
    - Fixed Section Filtering filtered away half a section.
    - Fixed curious GTK error when trying to save test selection
    - Fixed exception when "search for" text is empty in Replace Text dialog. We show now a warning dialog if empty.
    - Fixed spurious warning when one extra version has no tests and all tests are selected via the root suite and then run.
    - Only recreate relevant index pages after each app when generating the HTML report (speedup)
    - Category ordering in column headers in HTML report should now be deterministic
    - Don't crash if directory cache doesn't exist when adding an extra test
    - Fixed stacktrace running from Jenkins without the expected naming
    - Don't print spurious Aborted messages in jenkins or write to the cache if the job is still running
    - Fixed problem with filtering out tmp directories with 'test_data_ignore'.
    - Derived memory quantities (identified as other than "memory") are now coloured correctly in the HTML report
    - Choosing "config" in "Temporary Settings" on the Running / Advanced tab now works
    - Providing -coll without -b is now disallowed. Bad things happened before and this was not supposed to be possible.
    - Save is no longer first item in any context menus (too easy to press by mistake, and hard to revert)
    - Newly created shortcuts now appear directly in the Config tab, no restarting needed
    - Test count reported in static GUI status bar is correct when test suites are selected
    - Fixed various problems where throbber didn't run to show progress
    - Unicode characters and quotes in test descriptions don't cause problems in HTML report any more
    - Fixed bug with killing running tests in "parallel" on Windows
    - Replace Text in files now works properly cross-platform, assuming home_operating_system is set correctly
    - Fixed quoting problems when running tests remotely via SSH etc

Version 3.27
============
Release Enhancements:
    - TextTest now lives in a package called "texttestlib" and is available from PyPI ("pip install texttest" or "easy_install texttest")
	Should make managing installations easier. Windows installer is now version-independent: it just grabs the latest version from PyPI.
	Command is now always "texttest" on POSIX systems. Windows has "texttest.pyw" for the GUI, "texttestc.py" for the console.
Static GUI Enhancements:
    - New "Edit Description" in test pop-up menu
	Allows editing the description in the normal text editor, rather than within TextTest using the rename dialog as before,
	or by editing the testsuite file in the editor which requires a certain amount of syntax maintenance also.
    - Default option for recording GUI tests is now to do the auto-replay in the GUI
	Doing it in the background is very confusing if something goes wrong.
Dynamic GUI Enhancements:
    - New "Generate test summary" in Actions menu
	Essentially generates the batch report for the selected tests, writing to a user-selected file
General GUI Enhancements:
    - New icons! Thanks to Emily Bache for her efforts here.
    - File choosers always pick a default choice, should be more sensible than the ones we had before
    - Change of terminology in GUIs:
	"Save" renamed to "Approve". "Standard Files" are now "Approved Files".
Framework Enhancements:
    - "test_data_require" added
	Allow specifying that certain types of test data must be present. See website
    - "collate_file" now also finds files in $TEXTTEST_LOG_DIR if local sandbox is used
	i.e. if "default_texttest_local_tmp" is set
    - New option for discarding files, "discard_file_text"
	Allows files to be discarded conditional on their contents. Useful e.g. for intermittent exceptions. See website.
    - When sending SIGQUIT to TextTest if it's hanging, now print a stacktrace of all threads instead of just the main one
	(UNIX only, naturally)
    - Section filters will not trigger on lines which match both the start and end lines now.
	This is a backwards-incompatible change, see migration notes.
    - Autogenerates CLASSPATH for StoryText/Eclipse applications
	mirroring changes in latest StoryText
    - "Knownbugs" functionality in Jira can now handle bugs that have been moved or renamed.
    - Now allow combining of comma-separated lists in options files.
    - Allow removing one or more elements of comma-separated lists in options files
    - Missing performance files are now only ignored if the test does not run on a "performance machine"
Version Control Browser Enhancements:
    - Now supports Git
    - "Update" operation is now always a "centralised-style" update
	i.e. Mercurial does "hg pull -u" instead of "hg update", Git does "git pull"
    - Keyboard accelerator Ctrl+U added for "update"
Batch Report Enhancements:
    - If "file_to_url" is set, now list URLs in the log file, of table pages and index pages
	For example Jenkins will turn these into links directly.
    - Many improvements to Jenkins Changes functionality
	Handles attached RPMs via Maven, separate "build" structure from "jobs", plain text changelogs, workspace subdirectories amongst other things
    - Runs are only shown as "greyed" in the index page if there is a clear dating schema to the names
	Index pages created from e.g different Jenkins jobs should be correct now.
    - Overhaul of the additional performance data in HTML reports
	Instead of separate pages it now appears as additional rows in the normal overview.
	"historical_report_resource_pages" renamed to "historical_report_resources" to determine which ones to show.
	See migration notes / website.
    - "Detail" pages now give a reconnect command line as well as a restart command line
	Simplify loading the results into the GUI for the uninitiated
Grid Engine enhancements/bug fixes:
    - New experimental status support for EC2 Virtual Private Cloud added
	Tests run parallel on any available cloud machines. Requires Python tool "boto". See website.
    - New config setting "queue_system_environment"
	Allows environment variables to be transferred. Equivalent to queue_system_submit_args:-v VAR with SGE, but portable
    - Grid usage is disabled when "visible GUIs" are requested during GUI testing
	Usually it isn't desirable to try to show a GUI remotely from a grid machine
    - Fixed race conditions on NFS-systems between grid engines and the file server
	New config setting "queue_system_core_file_location" can be used if TEXTTEST_TMP is autogenerated. See website
    - Fixed race condition which could lead to hanging on shutdown
    - Fixed race condition which could lead to capacity of queue being ignored (e.g. for local parallel running)
    - Grid engine status now fetched also when tests are pending. (suspended, requeued etc)
    - Various status warnings fixed, mostly for restart statuses
    - Now use both "queue_system_resource" and the deprecated environment "QUEUE_SYSTEM_RESOURCE", if both are defined
    - Made IP-address finding code more robust
	Finding an IP address is complex and the old code didn't work in all environments
    - Grid jobs disappearing after reporting in are now reported as KILLED (possibly SIGKILL) instead of "SGE job exited" etc
    - Show slave errors in GUI when jobs exit
    - Handles Grid Engine restarts better now (e.g. if a machine dies while a test is running there)
Windows installer Enhancements:
    - All files now end up under chosen location, removed hardcoded C:\virtualenv and C:\jython2.5.1
    - StoryText is now upgraded properly when the installer is run for a second time after a new release
    - Should now work for wxPython applications without needing to hack by hand afterwards
    - Now installing using --distribute as Jython and new versions of setuptools don't seem to get on
Bug Fixes:
    - Fixed wildcards for stems in "file_split_pattern" list. Using fnmatch module instead of a hacked pattern matching.
    - Fixed wildcards for stems in knownbugs "search_file", now works also with new files
    - Fixed taking long time to start a huge amount of test copies.
    - VCS update enabled when no tests are selected
    - Exit code of 1 now returned when initial test suite cannot be created
    - Fixed problem when running multiple usecases if test has "usecase" in the name
    - Fixed Exception when closing dynamic GUI after reconnecting.
    - Handle now executables inside remote checkouts
    - Fixed unresponsive dynamic GUI after viewing screenshots in a browser
    - Fixed stack trace generating batch report in Jenkins when Jenkins jobs have a nested module structure
    - Fixed bug where batch reports were collected for e.g. version abc when version ab was requested
    - Fixed inconsistency between pressing "Quit" and closing the window, in the last case warnings correctly produced now
    - Disabled VCS actions on New Files in the dynamic GUI (stacktraced before)
    - Fixed stacktrace interpreting core files when GDB fails to handle them and DBX not installed
    - If performance_test_machine is set and test is not running there, don't attempt to use "time" program
    - Fixed problems with {INTERNAL writedir} filtering when test names contain a '+'
    - Fixed java classpath for eclipse rcp applications
    - Don't start subsequent processes if a test has been killed.
    - Failure information dialog has scrollbars if needed
    - Fixed bug with {CLEAR x} in options files clearing parts of what is matched
    - Fixed Jenkins plugin bug where subprojects could try to use correct_hashes files from the main project under test
    - Using now EDITOR environment variable to determine default editor
    - Overriding environment variables through 'Temporary Settings' in Running.Advanced tab works now
    - Non existing bugs in Jira are handled now as internal errors.
    - Forbidden "/" in -v arguments. Did not work, was not intended to be supported.
    - Rerunning tests with different checkouts now works
    - Fixed hang when rerunning from dynamic GUI started from command line and closing the first one first
    - Workaround for GTK2.20 bug in filechooser when choosing directories
    - Warnings printed for same bug when it isn't possible to workaround
    - No longer start virtual display when reconnecting to GUI tests. Fixes hang when reconnecting to non-existent GUI tests.
    - No longer hang if parent directory chosen as source when importing files. Can occur with GTK2.20 bugs.
    - Select and Filter now in dynamic GUI actions menu (got forgotten)
    - File view recomputation icon in dynamic GUI no longer disappears when selecting via Selection tab
    - -reconnect to static GUI now gives an error
    - Fixed various GTK warnings that were harmless but ugly
    - Fixed error handling generating batch report in Jenkins when build.xml is empty or artefact version is not present.
    - Fixed ValueError when looking at jenkins fingerprint items
    - {PREVLINES ...} run_dependent_text filtering was unreliable, should work better now
    - {REPLACE } run_dependent_text sometimes ate trailing spaces when it shouldn't
    - "Replace Text In Files" no longer falls over on auto-generated "missing version" files
    - Fixed "remote machine" option when using local queue system
    - Fixed use of full host name from local queue system setup
    - Improve error message when remote connections fail (include exitcode)
    - Better error message if Capturemock-based tests run without CaptureMock installed.
    - Don't use path separators in job names, even if they exist in full_name for the app
    - Non-numeric arguments to options which expect numbers give an error rather than stacktrace now

Version 3.28
============
Release Enhancements:
    - Spec file for RPM packaging added.
Dynamic GUI Enhancements:
    - Default colour for known bugs is now orange, as in HTML reports
	"Marked" default colour changes to light blue accordingly
    - Rerun now marks tests in the original run window
	Also rerun windows are identified with numbers
	There is also a new menu item "Load from rerun" in the test popup menu, to load the rerun result into the original window
    - Rerun dialog now inherits all automatic setting updates from Run tab
	for example disabling grid usage when requesting replay of GUI testing
    - Additional "Ungrouped" row when many tests are grouped in the Status view
    - All test categories except Failed are now invisible by default. New config entry 'show_test_category' to configure this.
    - The old 'auto_collapse_successful' functionality is removed as no longer necessary.
    - Selected files in the file view are no longer automatically deselected when a viewer is started.
	See Migration notes
Static GUI Enhancements:
    - New "View / Show Processes" action
	This allows you to view all processes (dynamic GUIs, file viewers) started from TextTest and to kill them individually
    - New "Show Filters" dialog in File View
	Allows viewing and experimenting with the filters for a given file, and also updating them.
    - "Inherited" data files are now shown in the static GUI
	Allows an overview of which data will be used for which test, and a convenient reference without having to walk up the hierarchy
    - "Replace Text in Files" now works on files in test suites also
	For example environment, options, config files
    - Maximum copies of a test increased from 1000 to 10000
    - Reenable the old texttest icons by adding the config entry 'retro_icons:1' to personal config file
Framework Enhancements:
    - "collate_script" now accepts all the files which match the pattern  in "collate_file"
	This makes it easier to write a script to collate a summary of several related files.
	There is also a warning now if multiple files match when no collate_script is provided. (see Migration Notes)
    - "core file interpreting" script now shows a stack of all threads
	Previously only showed main thread
    - New checkbox in "Enter failure information" dialog
	Allows you to just use this mechanism to trigger reruns without being required to report the result as a known bug.
    - If known bugs trigger reruns and those reruns are killed, the original test result is now shown instead of the killed rerun.
    - If checkout settings are not provided, TEXTTEST_CHECKOUT defaults to the current working directory
	No more errors about failing to make an absolute path!
Version Control Browser Enhancements:
    - Added new feature "Difference with Filter" for all supported VCS
Batch Report Enhancements:
    - New Javascript "comment plugin" added
	Adds the ability to comment individual test failures in the HTML report. See website.
	Internal marker format in pages changed to be more friendly to this
    - Succeeded tests now stored in a more compact way in batch_result_repository
	New migration script to convert. Old format is still understood, so migration will happen naturally (but slowly) anyway
    - Batch result repositories now automatically clean themselves
	Any file not used by the HTML report generation is just removed
	To disable this behaviour use the new --manualarchive flag, which will essentially restore the old behaviour
    - Can now archive individual named runs
	Using the new flag -s "batch.ArchiveRepository name=<run name>"
    - Arrows showing trend have been added to the index page
	Mostly for a quick overview comparing to the previous run. Can be disabled via CSS.
    - Archiving now respects selected versions ("-v" argument)
    - Batch runs from Jenkins now automatically add the Jenkins run number to their batch session, along with the date
    - additional HTML classes added to generated summary tables, allows for more CSS possibilities
	Can e.g. set colours in CSS as well as via the config file if desired.
    - Adding new run-level data store to batch repositories
    - Adding a page footer to sumary_template.html . It will show a link to the associated jenkins build when available
    - Index page now stores the 5 latest versions of itself, to aid in debugging if it is regenerated many times a day
    - Generation details are now in page footer rather than window title in index page
Grid Engine/Cloud enhancements/bug fixes:
    - New config parameter "queue_system_max_reruns".
	Aims to limit amount of rerunning caused by knownbugs. Defaults to 100. See website.
    - Reworked setup so that cloud instances don't flood master machine's SSH daemon with SSH requests
    - Fixed incorrect display in Run Info of environment variables used directly in copy_test_path
    - UGE Job ID now stored with test results, to make troubleshooting easier
    - Cloud data synchronisation is now retried if it fails, e.g. if cloud drops connection
    - Fixed bug with multiple checkouts being used by the same slave process.
    - Fixed Jenkins-related crash if date links aren't present as expected.
Bug Fixes:
    - Filter behaviour is now consistent with View/Show All
    - Fixed bug with HTML summary page reporting and specific memory failure tests (i.e. anything not called "memory") being counted incorrectly
    - DocumentEnvironment script should always work, no longer depends on file sorting
    - neatened up output for Jenkins runs when full paths to artefacts are needed, don't write it in the webpage
    - Status view now shows repeat groups, even if there is only one test with exactly that number
    - Fixed bug where Temporary Settings were not affected by the Reset button
    - Fixed bug where duplicated known bugs triggering on absence meant they were always reported
    - Updated log regeneration script and logging.* files, forgotten with 3.27
    - HTML pages with a cutoff and a weekday apply the weekday first ("last 10 Fridays", instead of "the Fridays from the last 10 days" as before)
    - Fixed word wrap in dialogs
    - Fixed stacktrace when -name provided without arguments. Now ignore this.
    - Fixed GUI's test description when the last test in a suite has been commented out
    - Performance improvements for running many copies of a test
    - Better handling of loose comments and disabled tests in testsuite files
	Should be much less prone to getting lost or moved around now
    - Multiple checkouts and multiple copies now work together
    - Summary page generation with non-standard path now handles non-local paths properly
    - Fixed bug where 0 error code could be received despite no executable being present
    - Improved error message with batch_use_collection and no batch_recipients
    - Fixed so that floating point calculations are included when recomputing

Version 3.28.1
==============
Bug Fixes:
    - Don't apply subsequent single line filters if a line has already been filtered away

Version 3.28.2
==============
Bug Fixes:
    - Make killing tests work better when running in parallel on Windows

Version 3.28.3
==============
Bug Fixes:
    - Floating point configuration now works in test-specific files (thanks Michael Behrisch/DZLR)
    - JUnit report now carefully excludes illegal characters (thanks Magnus Lyckå/Pagero)

Version 3.28.4
==============
Bug Fixes:
    - Fixed Jenkins plugin crash when checkin messages are empty

Version 3.28.5
==============
Bug Fixes:
    - Fixed Jenkins plugin crash when unprintable characters (= wrong encoding) in author names
    - Fixed matplotlib code to handle version 1.5 (thanks Michael Behrisch/DZLR)

Version 3.29
============
Static GUI Enhancements:
    - Run icon changed to green arrow
Framework Enhancements:
    - New support added for running a window manager under Xvfb. (thanks Mikhail Kalkov/Jeppesen)
    Uses new config variable "virtual_display_wm_executable". 
Batch Report Enhancements:
    - more compact format for repeated host names in HTML tables when tests run on many machines in parallel (thanks Henrik Delin/Jeppesen)
    - new script default.WriteDividedSelections
    The point is to division of a set of tests to allow parallel batch environments even where TextTest's own parallel model cannot run due to lack of reciprical access 
    (e.g. in locked-down corporate Windows environments) 
Grid Engine/Cloud enhancements/bug fixes:
    - support added for Core-binding option in Grid Engine. (thanks Lennart Bengtsson/Jeppesen)
Bug Fixes:
    - handle corrupted Jenkins config.xml files without stacktracing (thanks Jens Kjerrström/Jeppesen)
    - fix problem where "create_catalogues" could not be applied on a per-test basiss (thanks Rikard Lundmark/Jeppesen)
    - expand Git file arguments to full paths, Git does not like symlinks (thanks Wilhelm Hedman/Pagero)
    - Fixed bug where a script that collates multiple files and writes nothing created empty files
    - Handle unreadable teststate files in a generic way
