Changes from Ant 1.6.3 to Ant 1.6.4
===================================

Changes that could break older environments:
--------------------------------------------

Fixed bugs:
-----------

* Sun javah failed with java.lang.NoClassDefFoundError.
  Bugzilla report 34681.

* DirectoryScanner.slowScan() was broken. Bugzilla report 34722.

* DirectoryScanner.scan() could throw a NullPointerException on
  case-insensitive filesystems (read Windows or MacOS X).

* Get w/authentication failed with ArrayOutOfBoundsExceptions.
  Bugzilla report 34734.

* Granularity attribute for <sync> task was undocumented.
  Bugzilla report 34871.

* <unzip> and <untar> could leave file handles open on invalid
  archives.  Bugzilla report 34893.

* propertyset threw NPE with nested, mapped propertysets.

* <ftp> up to date calculations were wrong.
  Bugzilla report 34941.

Other changes:
--------------

* AntXMLContext.setCurrentTargets() is now public. Bugzilla report 34680.

Changes from Ant 1.6.2 to Ant 1.6.3
===================================

Changes that could break older environments:
--------------------------------------------

* The subant task used the canonical version of a file path. This
  has been changed to use the absolute path. Bugzilla 30438.

* Tar now writes two EOF blocks rather than one.
  Bugzilla report 28776

* The Reference object now has a project field which it uses in preference
  to the project passed in. This allows composite references to be
  handled to nested projects.
  Bugzilla report 25777

* <junit> with filtertrace="true" will now also swallow lines for the
  sun.reflect package.  If you need to see them in your stack trace,
  you must set filtertrace to false.
  Bugzilla Report 22758

* The jikes compiler adapter now supports -bootclasspath, -extdirs and
  -sourcepath and also uses the same logic for debug flags as javac.
  This means, the jikes compiler adapter now requires Jikes 1.15 or later.
  Bugzilla Reports 25868, 26404 and 32609.

* Targets with identical name work in imported project. Bugzilla Report 34566.

* The gcj compiler adapter used to include the Java runtime classes
  even if includeJavaRuntime was set to false, unless the
  bootclasspath has been specified as well.  It will now always adhere
  to includeJavaRuntime, you may need to set it to true explicitly now
  if you relied on the old behavior.

Other changes:
--------------

* <javadoc> can now take an attribute 'executable'. Bugzilla report 30606.

* New attribute ignorecontents for <different> selector

* Javadoc fixes for Location, Project, and RuntimeConfigurable
  Bugzilla 30160.

* Enable to choose the regexp implementation without system property.
  Bugzilla Report 15390.

* Expose objects and methods in IntrospectionHelper. Bugzilla Report 30794.

* Allow file attribute of <move> to rename a directory.
  Bugzilla Report 22863.

* Add xmlcatalog nested element to XmlProperty. Bugzilla report 27053.

* New attribute alwayslog for <redirector> type.

* Added <target> nested elements to <ant> and <antcall> to allow
  specification of multiple sub-build targets, which are executed
  with a single dependency analysis.

* Refactored Target invocation into org.apache.tools.ant.Executor
  implementations.  Bugzilla Reports 21421, 29248.

* <rmic> now also supports Kaffe's rmic version shipping with Kaffe
  1.1.2 and above.

* added casesensitive attribute to <globmapper> and <regexpmapper>
  Bugzilla report 16686

* added handledirsep attribute to <globmapper> and <regexpmapper>
  Bugzilla report 32487

* added a new mapper <filtermapper>

* When a BuildListener tried to access System.err or System.out, Ant
  would have thrown an exception - this has been changed.  Ant now
  silently ignores the message.  BuildListeners still should avoid
  accessing either stream.

* Added a comment attribute to the zip task.
  Bugzilla report 22793.

* Overloaded FileUtils.createNewFile with a boolean mkdirs attribute
  to create nonexistent parent directories.

* <apply> has a new "force" attribute that, when true, disables
  checking of target files.

* Made the dest attribute of the apply task optional; mapped target
  filenames will be interpreted as absolute pathnames when dest is omitted.

* Changed default tempdir for <javac> from user.dir to java.io.tmpdir.

* Added searchpath attribute to <exec> for searching path variable(s)
  when resolveexecutable = true.

* Added revision and userid attributes to <pvcs> documentation.

* Added support to the touch task for a mkdirs attribute to create
  nonexistent parent directories before touching new files.

* Added support to the touch task for a pattern attribute to allow
  alternate datetime formats.

* Added support to the touch task to map touched files using a nested
  mapper element.

* Added support to the touch task for a verbose attribute to suppress
  logging of new file creation.

* bad link in docs to the enhancement page in bugzilla.
  Bugzilla report 33252.

* Added length task to get strings' and files' lengths.

* <native2ascii> and <javah> now also support Kaffe's versions.

* Recursive token expansion in a filterset can now be disabled by
  setting its recurse attribute to false.

* Pathconvert no longer requires that one of (targetos|pathsep|dirsep)
  be set; platform defaults are used when this is the case.

* Added preservelastmodified attribute to fixcrlf task. Bugzilla 25770.

* Added isfileselected condition.

* Added verbose="true|false" attribute to <subant>. When verbose is enabled,
  the directory name is logged on entry and exit of the sub-build. Bugzilla 33787.

* Added -nouserlib option to allow running ant without automatically loading
  up ${user.home}/.lib/ant. This is useful when compiling ant, and antlibs.
  Modified the build.sh and build.bat to use the option.

* Added -noclasspath option to allow running ant WITHOUT using CLASSPATH env
  variable. Modified ant.bat to do this so that %CLASSPATH% is not looked at.

* Add else attribute to the condition task, which specifies an
  optional alternate value to set the property to if the nested
  condition evaluates to false. Bugzilla report 33074.

* Ant generated jar files should now be detected as jar files by
  Solaris.  Bugzilla Report 32649.

* Added two tutorials
  - beginner: introduction into Ant
  - task developers: using path, fileset etc

* <rpm> has new attributes failonerror and quiet.

Fixed bugs:
-----------

* Do not pass on ThreadDeath when halting <java fork="false">. Bugzilla
  32941.

* Killing a thread running <java fork="true"> (e.g. from an IDE) would
  not stop the forked process. Bugzilla 31928.

* Programs run with <java fork="true"> can now accept standard input
  from the Ant console.  (Programs run with <java fork="false"> could
  already do so.)  Bugzilla 24918.

* AbstractCvsTask prematurely closed its outputStream and errorStream.
  Bugzilla 30097.

* Impossible to use implicit classpath for <taskdef>
  when Ant core loader != Java application loader and
  Path.systemClassPath taken from ${java.class.path} Bugzilla 30161.

* MacroInstance did not clean up nested elements correctly in the execute 
  method, causing multiple use of the same macro instance with nested
  elements to fail.

* checksum fileext property doc wrong. Bugzilla 30787.

* FTP task, getTimeDiff method was returning wrong value. Bugzilla 30595.

* Zip task was not zipping when only empty directories were found.
  Bugzilla 30365.

* Jar task was not including manifest files when duplicate="preserve" was
  chosen. Bugzilla 32802.

* Classpath was treated in the same way as -lib options. Bugzilla 28046.

* Manual page for cvsversion contained incorrect attributes and did not
  say since 1.6.1. Bugzilla 31408.

* Typo in definition of <cvsversion> task causing it not to be defined.
  Bugzilla 31403.

* Execution of top level tasks in imported files get delayed by targets.
  Bugzilla report 31487.

* ExecTask executes checkConfiguration() even though os does not match.
  Bugzilla report 31805.

* Concat task instance could not be run twice.
  Bugzilla report 31814.

* NPE using XmlLogger and antlib.
  Bugzilla report 31840.

* Properties.propertyNames() should be used instead of .keys().
  Bugzilla report 27261.

* Target location is not set for default target.
  Bugzilla report 32267.

* Incorrect classloader parent in junittask when using with
  ant-junit.jar and junit.jar not in the project classloader. Bugzilla
  report 28474.

* getResources() on the classloader returned by ClasspathUtils would
  see each resource twice - if the resource is in the project
  classpath and if the classloader is requested with a null path.

* XMLValidate used URL#getFile rather than the ant method FileUtils#fromURI
  Bugzilla report 32508

* fixed Regexp-Mapper docs which gave outdated instructions (optional.jar)
  Bugzilla report 28584

* <scp> using <fileset> didn't work with OpenSSH 3.9 and later.
  Bugzilla report 31939

* <setproxy> failed to set user/password on some JDKs.
  Bugzilla report 32667

* untar would go into infinite loop for some invalid tar files.
  Bugzilla report 29877

* forked <javac> won't pass -source to a JDK 1.1 or 1.2 javac anymore.
  Bugzilla report 32948

* propertyset references did not handle nested propertyset references.

* oata.types.Description.getDescription(Project) would throw a
  NullPointerException when the "ant.targets" reference was unset.

* Wrapper scripts did not detect WINNT value of dynamic OS environment
  variable when logged into workstations using Novell authentication.
  Bugzilla Report 30366.

* DependScanner.getResource() always returned nonexistent resources,
  even when the resource actually existed.  Bugzilla Report 30558.

* <apply> was broken with classfilesets.  Bugzilla Report 30567.

* <available> returned false positives when checking a file
  passed in with the current basedir leading twice:
  e.g. ${basedir}${file.separator}${basedir}${file.separator}foo .

* The first file open that took place when using input files with the
  <exec>, <apply>, or <java> tasks was always logged to System.out
  instead of to the managing Task.

* <telnet> and <rexec> would try to disconnect from servers they never
  connetced to, potentially leading to exceptions in commons-net.
  Bugzilla Report 33618.

* <zip> would drop files matched by defaultexcludes during updates.
  Bugzilla Report 33412.

* <zip> couldn't store files with size between 2GB and 4GB (the
  upper limit set by the ZIP format itself).  Bugzilla Report 33310.

* NPE when when <presetdef> tries to configure a task that
  cannot be instantiated. Bugzilla Report 33689.

* <javac debug="false"> created an invalid command line when running
  the Symantec Java compiler.

* Get with usetimestamp did not work on Java 1.2.

* Get with usetimestamp did not work when local timestamp roughly >= now.

* The framed JUnit report now handles multiple reports for the same
  testcase properly.  Bugzilla Report 32745.

* <cab> didn't work for files with spaces in their names on Windows.
  Bugzilla Report 17182.

* The VAJ tasks could fail if the project name contained characters
  that need to get URL encoded.  Bugzilla Report 23322.
  
* The FTP task could crash with an ArrayIndexOutOfBoundsException
  Bugzilla Report 28797
  
* Improved handling of paths on cygwin
  Bugzilla Report 31245

* TarInputStream#read() wasn't implemented correctly.  Bugzilla Report
  34097.

* <xslt> failed to process file-hierarchies of more than one level if
  scanincludeddirectories was true.  Bugzilla Report 24866.

* forkmode="perBatch" or "once" would ignore extension attributes that
  had been specified for <formatter>s.  Bugzilla Report 32973.
  
* minor performance update of Locator.fromUri. Bugzilla Report 34529.

* The refid attribute of the I/O redirector was not functional.

* SQL task would try access result sets of statements that didn't
  return any, causing problems with Informix IDS 9.2 and IBM DB2 8.1
  FixPak 6 (or later). Bugzilla Reports 27162 and 29954.

* make sure that Zip and its derivates call the createEmptyZip method when
 there are no resources to zip/jar/...

* ant.bat was missing runAntNoClasspath label for goto.
  Bugzilla 34510.


Changes from Ant 1.6.1 to Ant 1.6.2
===================================

Changes that could break older environments:
--------------------------------------------

* The import task used the canonical version of a file path. This
  has been changed to use the absolute path. Bugzilla 28505.

* ant-xalan2.jar has been removed since the only class contained in it
  didn't depend on Xalan-J 2 at all.  Its sole dependency has always
  been TraX and so it has been merged into ant-trax.jar.

* All exceptions thrown by tasks are now wrapped in a buildexception
  giving the location in the buildfile of the task.

* Nested elements for namespaced tasks and types may belong to the
  Ant default namespace as well as the task's or type's namespace.

* <junitreport> will very likely no longer work with Xalan-J 1.

  Note that Xalan-J 1 has been deprecated for a very long time and we
  highly recommend that you upgrade.

  If you really need to continue using Xalan-J 1, please copy the
  junit-frames-xalan1.xsl from the distribution's etc directory as
  junit-frames.xsl into a new directory and use the task's styledir
  attribute to point to.  This is the last version of the XSLT
  stylesheet that is expected to be compatible with Xalan-J 1.

* <csc>'s extraoptions can now contain multiple arguments.
  Bugzilla Report 23599.

* <macrodef> with default values set by properties would be
  seen as new definitions when called twice with different properties.
  This was confusing so the definitions are now treated as similar.
  Bugzilla Report 31215.

* <javadoc> has a new attribute "includenosourcepackages" that can be
  used to document packages that don't hold source files but a
  package.html file.  Bugzilla Report 25339.

Fixed bugs:
-----------

* eliminate memory leak in AntClassLoader. Bugzilla Report 8689.

* subant haltonfailure=false did not catch all failures. Bugzilla Report 27007.

* macrodef @@ escaping was broken.  Bugzilla Report 27069.

* SQL task did not work with Informix IDS 9.2. Bugzilla Report 27162.

* MacroDef did not allow attributes named 'description'. Bugzilla Report 27175.

* Throw build exception if name attribute missing from patternset#NameEntry.
  Bugzilla Report 25982.

* Throw build exception if target repeated in build file, but allow targets
  to be repeated in imported files. 

* <apply> didn't compare timestamps of source and targetfiles when
  using a nested <filelist>.  Bugzilla Report 26985.

* tagdiff.xml was broken in ant 1.6.1. Bugzilla Report 27057.

* if the basedir contained .. or . dirs, and the build file name contained
  .. or ., the basedir was set incorrectly. Bugzilla Report 26765.

* regression from ant 1.5, exec task outputted two redundant trailing newlines.
  Bugzilla Report 27546.

* NPE when running commons listener. Bugzilla Report 27373.

* <java> swallowed the stack trace of exceptions thrown by the
  executed program if run in the same VM.

* -projecthelp swallowed (configuration) errors silently.
  Bugzilla report 27732.

* filterset used by filtertask doesn't respect loglevel. Bugzilla Report 27568.

* wrong compare used in ProjectComponent for logging. Bugzilla Report 28070.

* failOnAny attribute for <parallel> was broken. Bugzilla Report 28122.

* If <javac> uses gcj and any of the nested <compilerarg>s implies
  compilation to native code (like -o or --main), Ant will not pass
  the -C switch to gcj.  This means you can now compile to native code
  with gcj which has been impossible in Ant < 1.6.2.

* <import optional="false"> and <import optional="true">
  behaved identically.

* <xslt> now sets the context classloader if you've specified a nested
  <classpath>.  Bugzilla Report 24802.

* <zip> and friends would delete the original file when trying to update
  a read-only archive.  Bugzilla Report 28419.

* <junit> and <assertions> are working together. Bugzilla report 27218

* AntClassLoader#getResource could return invalid URLs.  Bugzilla
  Report 28060.

* Ant failed to locate tools.jar if the jre directory name wasn't all
  lowercase.  Bugzilla Report 25798.

* Redirector exhibited inconsistent behavior with regard to split
  output.  When sent to file only, files would be created in all
  cases; when split file-property, files were only created if
  writes were performed.

* fixed case handling of scriptdef attributes and elements.

* UNC pathnames did not work for ANT_HOME or -lib locations on Windows.
  Bugzilla report 27922.

* replacestring tokenfilter only replaced the first occurrence.

* AntLikeTasksAtTopLevelTest failed on cygwin.

* I/O-intensive processes hung when executed via <exec spawn="true">.
  Bugzilla reports 23893/26852.

* JDependTask did not close an output file. Bugzilla Report 28557.

* Using <macrodef> could break XmlLogger. Bugzilla Report 28993.

* <genkey> no longer requires keytool to be in your PATH.  Bugzilla
  Report 29382.

* <symlink> could create cyclic links.  Bugzilla Report 25181.

* <zip whenempty="skip"> didn't work in a common situation.  Bugzilla
  Report 22865.

* <scp> now properly handles remote files and directories with spaces
  in their names.  Bugzilla Report 26097.

* <scp> now has (local|remote)tofile attributes to rename files on the
  fly.  Bugzilla Report 26758.

* <telnet> and <rexec> didn't close the session.  Bugzilla Report 25935.

* <subant> and XmlLogger didn't play nicley together.

Other changes:
--------------
* doc fix concerning the dependencies of the ftp task
  Bugzilla Report 29334.

* <xmlvalidate> has now a property nested element,
  allowing to set string properties for the parser
  Bugzilla Report 23395.

* Docs fixes for xmlvalidate.html, javadoc.html, starteam.
  Bugzilla Reports 27092, 27284, 27554.

* <pathconvert> now accepts nested <mapper>s.  Bugzilla Report 26364.

* Shipped XML parser is now Xerces-J 2.6.2.

* Added nested file element to filelist.

* spelling fixes, occurred. Bugzilla Report 27282.

* add uid and gid to tarfileset. Bugzilla Report 19120.

* <scp> has a verbose attribute to get some feedback during the
  transfer and new [local|remote][File|Todir] alternatives to file and
  todir that explicitly state the direction of the transfer.

* The OS/2 wrapper scripts have been adapted to use the new launcher.
  Bugzilla Report 28226.

* <sshexec> now also captures stderr output.  Bugzilla Report 28349.

* <xslt> now supports a nested <mapper>.  Bugzilla Report 11249.

* <touch> has filelist support.

* <nice> task lets you set the priority of the current thread; non-forking
  <java> code will inherit this priority in their main thread.

* New attribute "negate" on <propertyset> to invert selection criteria.

* Target now supports a Location member.  Bugzilla Report 28599.

* New "pattern" attribute for <date> selector.

* <junit> has a new forkmode attribute that controls the number of
  Java VMs that get created when forking tests.  This allows you to
  run all tests in a single forked JVM reducing the overhead of VM
  creation a lot.  Bugzilla Report 24697.

* <jar> can now optionally create an index for jars different than the
  one it currently builds as well.  See the new <indexjars> element
  for details.  Bugzilla Report 14255.

* Permit building under JDK 1.5. Bugzilla Report 28996.

* minor Javadoc changes. Bugzilla Report 28998.

* Misc. corrections in SignJar.java. Bugzilla Report 28999.

* Remove redundant <hr> from javah.html. Bugzilla Report 28995.

* Ignore built distributions. Bugzilla Report 28997.

* A new roundup attribute on <zip> and related task can be used to
  control whether the file modification times inside the archive will
  be rounded up or down (since zips only store modification times with
  a granularity of two seconds).  The default remains to round up.
  Bugzilla Report 17934.

* A binary option has been added to <concat>. Bugzilla Report 26312.

* Added DynamicConfiguratorNS, an namespace aware version of
  DynamicConfigurator. Bugzilla Report 28436.

* Add implicit nested element to <macrodef>. Bugzilla Report 25633.

* Add deleteonexit attribute to <delete>.

* Added Target.getIf/Unless().  Bugzilla Report 29320.

* <fail> has a status attribute that can be used to pass an exit
  status back to the command line.

* <fail> accepts a nested <condition>.

* <loadproperties> supports loading from a resource.
  Bugzilla Report 28340.

* Nested file mappers and a container mapper implementation have been
  introduced.  Additionally, the <mapper> element now accepts "defined"
  nested FileNameMapper implementations directly, allowing a usage
  comparable to those of <condition>, <filter>, and <selector>.

* New <redirector> type introduced to provide extreme I/O flexibility.
  Initial support for <exec>, <apply>, and <java> tasks.

* <apply> has a new ignoremissing attribute (default true for BC)
  which will allow nonexistent files specified via <filelist>s to
  be passed to the executable.  Bugzilla Report 29585.

* <junitreport> now also works with Xalan XSLTC and/or JDK 1.5.
  Bugzilla Report 27541.

* <jspc> doesn't work properly with Tomcat 5.x.  We've implemented a
  work-around but don't intend to support future changes in Tomcat
  5.x.  Please use the jspc task that ships with Tomcat instead of
  Ant's.

Changes from Ant 1.6.0 to Ant 1.6.1
=============================================

Changes that could break older environments:
--------------------------------------------

* License is now Apache Software License 2.0
  see http://www.apache.org/licenses/ for more information

Fixed bugs:
-----------
* Remove a recursive template call in the junit xsls that could trigger a stack
  overflow. It now uses Xalan extensions to call a Java class directly.
  Bugzilla Report 19301
  
* Fix spurious infinite loop detection for filters (introduced in ant 1.6.0).
  Bugzilla Report 23154.

* Fix handling of default ant namespace for nested elements.

* Fix jboss element of ejb task (introduced in ant 1.6.0).

* <whichresource> failed to load classes correctly.

* Ant could fail to start with a NullPointerException if
  ANT_HOME/lib/ant-launcher.jar was part of the system CLASSPATH.

* presetdef'ed types did not work with the ant-type attribute

* fixed case handling of macrodef attributes and elements. Bugzilla
  Reports 25687 and 26225.

* <java> ignored the append attribute, Bugzilla Report 26137.

* The gcj compiler adapter for <javac> failed if the destination
  directory didn't exist.  Bugzilla Report 25856.

* Ant now fails with a more useful message if a new process will be
  forked in a directory and that directory doesn't exist.

* <splash> used to break the build on non-GUI environments.  Bugzilla
  report 11482.

* Ant 1.6.0 cannot run build scripts in directories with non-ASCII names.
  Bugzilla Report 26642.

Other changes:
--------------
* Shipped XML parser is now Xerces-J 2.6.1

* Translate task logs a debug message specifying the number of files
  that it processed.  Bugzilla Report 13938.

* <fixcrlf> has a new attribute - fixlast. Bugzilla Report 23262.

* <p4submit> has 2 new attributes, needsresolveproperty and changeproperty.
  Bugzilla Report 25711.

* add description attributes to macrodef attributes and elements.
  Bugzilla Report 24711.

* Extending ClearCase Tasks :
 - Added an extra option to 'failonerr' to each ClearCase task/command.
 - Extended the functionality of cccheckout. It can check (notco) to see if
  the desired element is already checked out to the current view. Thus it
   won't attempt to check it out again.
 - Added three new ClearCase commands: ccmkattr, ccmkdir, ccmkelem
  Bugzilla Report 26253.

* New condition <typefound> that can be used to probe for the declaration 
  and implementation of a task, type, preset, macro, scriptdef, whatever. 
  As it tests for the implementation, it can be used to check for optional
  tasks being available. 

* added nested text support to <macrodef>
  
* added initial support for Java 1.5.  Java 1.5 is now correctly
  detected by Ant and treated just like Java 1.4.  You can now specify
  source="1.5" in the <javac> task.

* created new task <cvsversion>

* added support for branch logging via the tag attribute in <cvschangelog>
  Bugzilla Report 13510.

* added support the groovy language in the script and scriptdef tasks

Changes from Ant 1.5.4 to Ant 1.6.0
===================================

Changes that could break older environments:
--------------------------------------------

* This version of Ant can not be built with JDK 1.1 and requires at
  least Java 1.2 at runtime as well.  Compiling for a 1.1 target is
  still supported.

* Targets cannot have the empty string as their name any longer.

* ant.jar's manifest does no longer include a Class-Path entry, so it
  is no longer possible to run Ant via "java -jar ant.jar" without
  manually altering the CLASSPATH.  Instead of that a file
  ant-bootstrap.jar is included in the etc directory of the binary
  distribution, copy this to the lib directory and use
  "java -jar ant-bootstrap.jar" instead if you want to run Ant without
  the wrapper script (not recommended).

* The <script> task now requires Apache BSF instead of the older IBM
  version.  See <http://jakarta.apache.org/bsf/>

* <xmlproperty> will no longer fail if the file to be loaded doesn't exist.

* XML namespaces are now enabled in the XML parser, meaning XML namespace
  declarations no longer cause errors. However task names containing colons
  will cause errors unless there is a corresponding namespace uri.

* The <ftp> and <telnet> tasks now require Jakarta Commons Net instead
  of the older ORO Netcomponents version.  See
  <http://jakarta.apache.org/commons/net/index.html>.

* <input> will no longer prompt the user and wait for input if the
  addproperty attribute is set to a property that has already been
  defined in the project.  If you rely on the task waiting for input,
  don't use the addproperty attribute.

* The Class-Path attribute in manifests will no longer merge the
  entries of all manifests found, but will be treated like all other
  manifest attributes - the most recent attribute(s) will be used.

* New Launch mechanism implemented. This moves some functionality from
  the batch files / shell scripts into Java. This removes environment
  limitations, for command issues, directory depth issues on Windows. Also
  allows a per-user library location to be used if the main Ant install
  is locked down.

* The Entry nested element of PropertyFile will not any more have its value
  attribute (actually increment) overwritten with the new value of the entry
  after execution.

* Output stored from a <java> or <exec> task is now exactly as generated. No
  conversion to platform end-of-line characters is performed.

* <translate> will now preserve line endings.

* <ftp> followsymlinks="false" in nested fileset definitions is explicitly
  required in order to exclude remote symbolic links (when doing a get, chmod,
  delete, rmdir).

* The values of the Copy#fileCopyMap variable has changed from String to
  String[]. (In java 1.5 terms it was Hashtable<String, String> and
  is now Hashtable<String, String[]>). This will affect third party code
  that extend Copy and override Copy#doFileOperations.

* <loadproperties> didn't expand properties while <property file="..."/>
  does, so they were not equivalent.  This has been fixed, which means
  that propetries may get expanded twice if you use an
  <expandproperties> filterreader.  Bugzilla Report 17782.

* User defined tasks and typedefs are now handled internally in the
  same way as predefined tasks and typedefs. Also tasks and typedefs
  are resolved at a later stage. This causes some
  differences especially for user defined task containers.

* <checksum> log message "Calculating checksum ..." has been degraded
  from INFO to VERBOSE.

Fixed bugs:
-----------
* Filter readers were not handling line endings properly.  Bugzilla
  Report 18476.

* Filtersets were also not handling line endings properly.

* Expand tasks did not behave as expected with PatternSets.

* <property environment=... /> now works on OS/400.

* <cab> could hang listcab on large <fileset>s.

* The starteam stcheckout, stcheckin tasks now correctly compute
  status of files against whatever local tree they are run against
  and, optionally, will not process a file if it is current.
  Previously you had to process everything unless you ran against the
  default folder which wasn't the normal use-case for ant-starteam.
  The stlist task now similarly displays that status correctly making
  it a more generally useful tool.

* entity includes would cause exceptions if path names included spaces.

* addConfiguredXXX would not work for TaskAdapter wrapped tasks

* Fix <ilasm> outputfile testing so that the output file does not need
  to exist beforehand.

* Ant will now exit with a return code of 1 if it encounters problems
  with the command line arguments.

* ClassLoader creation changes to use a factory method in Project. A new
  class AntClassLoader2 implemented for 1.2+ specific features including
  Package information and addition of classes specified in the Class-Path
  element of a Jar's manifest.

* It is now possible in <exec> to resolve the executable to a project
  basedir or execution dir relative executable. The resolveExecutable
  must be used to pick up such executables.

* splash screen wouldn't disappear when build was finished.

* <exec> output and error streams can now be redirected independently
  to either a property or a file (or both)

* TarEntry's File-arg constructor would fail with a
  StringIndexOutOfBoundsException on all OSes where os.name is shorter
  than seven characters.  Bugzilla Report 18105.

* <copy> and <move>'s failonerror didn't apply to filesets pointing to
  non-existant directories.  Bugzilla Report 18414.

* The <stripjavacomments> filter sometimes removed parts of string
  constants.  Bugzilla Report 17441.

* <antlr> will now recompile your grammar if the supergrammar has
  changed.  Bugzilla Report 12691.

* <property env> will now work on Unices with /bin/env instead of
  /usr/bin/env.  Bugzilla Report 17642.

* <jar index="on"> could include multiple index lists.  Bugzilla 10262.

* The index created by <jar> didn't conform to the spec as it didn't
  include the top-level entries.  Bugzilla Report 16972.

* <tar> and <zip> didn't honor the defaultexcludes attribute for the
  implicit fileset.  Bugzilla Report 18637.

* The <replacetokens> filter would throw an exception if the token's
  value was an empty string.  Bugzilla Report 18625.

* Perforce tasks relying on output from the server such as <p4change>
  and <p4label> were hanging. Bugzilla Reports 18129 and 18956.

* Improve exception and logging behavior of Perforce tasks.
  Bugzilla report 18154.

* build.sh install had a problem on cygwin (with REALANTHOME).
  Bugzilla Report 17257

* <replaceregexp> didn't work for multi-byte encodings if byline was false.
  Bugzilla Report 19187.

* <replaceregexp> was altering unnecessarily the timestamp of the directories
  containing the files to process
  Bugzilla Report 22541.

* file names that include spaces need to be quoted inside the @argfile
  argument using forked <javac> and (all JDKS).  Bugzilla Report 10499.
  NB : a first correction was only introducing quotes for JDK 1.4
  It has been changed to quote for all external compilers when paths
  contain spaces.
  Also the backslashes need to be converted to forward slashes
  Bugzilla Report 17683.

* Setting filesonly to true in <zip> and related tasks would cause the
  archives to be always recreated.  Bugzilla Report 19449.

* file names that include spaces need to be quoted inside the @argfile
  argument using <javadoc> and JDK 1.4.  Bugzilla Report 16871.

* <junit> didn't work with custom formatters that were only available
  on the user specified classpath when a timeout occured.  Bugzilla
  Report 19953.

* <different> selector : make ignoreFileTimes effectively default to true
  and fix a bug in the comparison of timestamps. Bugzilla Report 20205.

* <different> selector can now be nested directly under a fileset
  Bugzilla Report 20220.

* <cvstagdiff> had a problem with "dd-MM-yy hh:mm:ss" formats
  Bugzilla Report 15995.

* <cvstagdiff> cvsroot and package attributes added to the root
  element tagdiff of the xml output
  Bugzilla Report 16081.

* <cvstagdiff> had a problem with aliased modules and with requests for multiple modules
  Bugzilla Reports 21373 and 22877.

* <cvstagdiff> could not parse properly the revision number of new files with CVS 1.11.9 or higher
  Bugzilla Report 24406.

* <fixcrlf> make fixcrlf create its temporary files in the default directory
  of FileUtils#createTempFile instead of the destination dir of fixcrlf.
  Bugzilla Report 20870.

* <ejbjar> implementation for Borland.
  Prevent the task from being blocked by error messages coming from java2iiop.
  Bugzilla Report 19385.

* <unzip>'s and <untar>'s nested patternsets didn't work as documented
  when the pattern ended in a slash or backslash.  Bugzilla Report 20969.

* <fixcrlf> will now create the parent directories for the destination
  files if necessary.  Bugzilla Report 20840.

* <xmlproperty> now handles CDATA sections. BugZilla Report 17195

* <translate> now translate tokens that are placed close together.
  Bugzilla Report 17297

* Nested websphere element for ejbjar does not support spaces in file name.
  Bugzilla Report 21298

* Don't multiply Class-Path attributes when updating jars.  Bugzilla
  Report 21170.

* Do not overwrite the value (increment) attribute of PropertyFile nested Entry element.
  Bugzilla Report 21505.

* Prevent sysproperties with no key or no value from being added in <junit>.
  Bugzilla Report 21684.

* Allow references to be properly inherited via antcall
  Bugzilla Report 21724.

* ftp chmod failed when the remote system was UNIX and local system Windows
  Bugzilla Report 21865.

* ftp put with chmod failed when the remote system was UNIX and local system Windows
  Bugzilla Report 23143.

* ftp did not set the ascii mode explicity, causing problems with ftp servers
  having binary as default

* ftp was not able to download files when they were pointed to by symbolic links
  Bugzilla Report 14063.

* ftp is able to download also directories pointed to by symbolic links.

* replace would change \r\n into \r\r\n under Windows.

* junitreport with frames did not display a link for classes without a package
  or in the top package.
  Bugzilla Report 21915.

* Project.toBoolean(String) now handles null as argument and does not throw a
  NullPointerException any more.

* The socket condition will now close the socket created to test.
  Bugzilla Report 23040.

* <junit includeantruntime="true" fork="true"> replaced the CLASSPATH instead
  of adding to it.  Bugzilla Report 14971.

* <splash> could fail on JVMs that use null to indicate the system classloader.
  Bugzilla Report 23320.

* <xmlcatalog>s only worked when defined inside of tasks.  Bugzilla
  Report 20965.

* <csc> and siblings (<vbc> <jsharpc>) handle large filesets by
automatic use of response files.  Bugzilla report #19630

Other changes:
--------------

* Shipped XML parser is now Xerces 2.6.0

* All tasks can be used outside of <target>s.  Note that some tasks
  will not work at all outside of targets as they would cause infinite
  loops (<antcall> as well as <ant> and <subant> if they invoke the
  current build file).

* Six new Clearcase tasks added.

* A new filter reader namely tokenfilter has been added.  Bugzilla
  Report 18312.

* A new attribute named skip is added to the TailFilter and
  HeadFilter filter readers.

* The filesetmanifest attribute of <jar> has been reenabled.

* The start and end tokens for <translate> may now be longer than a
  single character.

* <setproxy> lets you set the username and password for proxies that
  want authentication

* <loadproperties> has a new encoding attribute.

* <echoproperties> can now create XML output.

* <echoproperties> has a new srcfile attribute that can make it read
  properties files and output them instead of Ant's properties.

* <filterset> will now resolve filters recursively.

* <input> has a new attribute that allows you to specify a default value.

* Added <image> task (requires JAI).

* <image> task has now proportions attribute in the <scale/> nested element
  instead of keepproportions (bringing in more functionality)

* New condition <isreference>

* <ftp> now has a preservelastmodified attribute to preserve the
  timestamp of a downloaded file.

* new rmdir action for <ftp> that removes directories from a fileset.

* <ftp> has attributes timediffauto and timediffmillis to use together
  with the newer attribute to tell ant to take into account a time difference
  between client and remote side.
  Bugzilla Report 19358.

* <ftp> has been optimized to go directly to the include patterns.
  This reduces scanning time under UNIX when followsymlinks="true"
  and casesensitive="true" (the default)
  Bugzilla Report 20103.

* The SOS and VSS tasks will no longer unconditionally prepend a $ to
  vsspath or projectpath.

* OS/400 now gets detected by the os condition.

* <arg> has a new attribute pathref that can be used to reference
  previously defined paths.

* <xmlproperty> has been improved, you can now expand ${properties},
  define ids or paths and use Ant's location magic for filename resolutions
  in the XML file.

* <xmlcatalog> will now support external catalogs according to the
  OASIS "Open Catalog" standard - if resolver.jar (newer than version
  1.0) from Apache's xml-commons is in your CLASSPATH.

* Starteam tasks now have support for revision labels and build labels.
  Checkouts now have the option of using repository timestamps, instead
  of current.

* new task <symlink> that creates and maintains symbolic links.

* new tasks <chown> and <chgrp> which are wrappers of the Unix commands.

* new task <attrib> to change file attributes on Windows systems.

* <style> has a new attribute reloadstylesheet to work around a
  bug in widespread Xalan versions.

* <tarfileset> has a new dirmode attribute to specify the permissions
  for directories.

* <fixcrlf>'s eol attribute now also understands "mac", "unix" and "dos".

* <classfileset> now picks up dependencies of the form MyClass.class. This
  works for the code generated by the Sun java compiler. It may not work for
  all compilers.

* a new attribute "globalopts" can be added to all Perforce tasks.
  You can put in it all the strings described by p4 help usage. Refer to
  the docs for more information.

* new Perforce tasks <p4integrate> , <p4resolve>, and <p4labelsync>

* <p4submit> will change the property p4.change if the Perforce server
  renumbers the change list.
  It will set the property p4.needsresolve if the submit fails,
  and the message says that file(s) need to be resolved.

* <replaceregexp> now has an optional encoding attribute to support
  replacing in files that are in a different encoding than the
  platform's default.

* The <exec> task may now have its input redirected from either a file
  or a string from the build file. The error output can be separated
  to a different file when outut is redirected. standard error may be
  logged to the Ant log when redirecting output to a file

* The <java> task also supports the input redirection and separate
  error streams introduced to the <exec> task. In addition, it is now
  possible to save the output into a property for use within the build
  file as was possible with <exec> in Ant 1.5

* The <javadoc> task <tag> subelement has been enhanced to allow files
  with tag mappings to be used.

* New tasks: <scp> supports file transfers, <sshexec> executes a
  command over SSH.  They require jsch, a BSD licensed SSH library that
  can be found at http://www.jcraft.com/jsch/index.html

* New filterreader <escapeunicode/>.

* Support for HP's NonStop Kernel (Tandem) OS has been added.

* <cab>'s basedir attribute is now optional if you specify nested
  filesets.  Bugzilla Report 18046.

* New task <sync> that synchronizes two directory trees.

* <apply> has new forwardslash attribute that can force filenames to
  use forward slashes (/) as file separators even on platforms with a
  different separator.  This is useful if you want to run certain
  ported Unix tools.

* Copy has a new outputencoding attribute that can be used to change
  the encoding while copying files.  Bugzilla Report 18217.

* The xml formatter for JUnit will now honor test case names set with
  setName.  Bugzilla Report 17040.

* JUnit now has an attribute reloading, which, when set to false,
  makes the task reuse the same class loader for a series of tests.

* <concat> now supports filtering and can check timestamps before
  overriding a file.  Bugzilla Report 18166.

* <junit> has a new attribute tempdir that controls the placement of
  temporary files.  Bugzilla Report 15454.

* <jdepend> now supports a new nested element <classespath> which is
  the same as <sourcespath> but point to compiled classes (the
  prefered mode of operation for JDepend > 2.5).  Additionally, nested
  <exclude> elements can be used to exclude certain packages from
  being parsed.  Bugzilla Report 17134.

* The JProbe tasks now also work with JProbe 4.x.  Bugzilla Report 14849.

* <javacc> and <jjtree> will now autodetect JavaCC 3.x and can use it.

* <sql> has a new attribute to control escape processing.

* <sql> is able to display properly several resultsets if you are
  running a compound sql statement. Bugzilla Report 21594.

* A new <containsregexp> selector has been added, that selects files
  if their content matches a certain regular expression.

* <antlr>'s debug attribute has been enabled.  Bugzilla Report 19051.

* <mail> has a new attribute charset. Bugzilla Report 15434.

* <mail> has new attributes user and password for SMTP auth.
  maillogger can also use this.
  The implementation only works with JavaMail (encoding="MIME").
  Implementation with plain mail remains to do.
  Bugzilla Report 5969.

* <mail> and mailloger support SMTP over TLS/SSL
  Bugzilla Report 19180.

* <mail> the attributes from, replyto ,tolist, cclist, bcclist
  can now contain email addresses of the form name <address@xyz.com>
  or (name) address@xyz.com
  Bugzilla Report 22474.

* <mail> (version PlainMail)
  prevent blank headers from being sent,
  make the order of the headers of plain mail messages predictable
  Bugzilla Report 22088.

* <zipfileset> can now be defined in the main body of a project
  and referred to with refid="xyz". Bugzilla Report 17007.

* A wrapper script for OS/2 has been added.

* <unzip> will now detect and successfully extract self-extracting
  archives.  Bugzilla Report 16213.

* <stcheckout> has a new attribute "converteol" that can be used to
  control the automatic line-end conversion performed on ASCII files.
  Bugzilla Report 18884.

* Users can now modify the list of default excludes using the new
  defaultexcludes task.  Bugzilla Report 12700.

* There is a new data type <propertyset> that can be used to collect
  properties.  It is supported by <ant>, <antcall>, <subant>, <java>,
  <echoproperties> and <junit>.

* <concat> can now control the encoding of the output as well and optionally
  add new-line characters at the end of files that get concatenated but
  don't end in newlines.  Bugzilla Report 12511.

* <rpm> will detect the rpmbuild executable of RedHat 8.0 and newer
  and use that if it is on your PATH.  Bugzilla Report 14650.

* A new task <rexec> has been added that requires commons-net to work.
  Bugzilla Report 19541.

* <javadoc> now supports a nested <arg> element in addition to the
  additionalparams attribute.

* You can now determine the order of standard tags in <javadoc> via
  <tag> elements - you must not use the description attribute for them.
  Bugzilla Report 18912.

* <javadoc> now supports the -noqualifier switch.  Bugzilla Report 19288.

* <javac>'s executable attribute can now also be used to specify the
  executable for jikes, jvc, sj or gcj.  Bugzilla Report 13814.

* <javac> has a new attribute tempdir that can control the placement
  of temporary files.  Bugzilla Report 19765.

* A new magic property build.compiler.jvc.extensions has been added
  that can be used to turn of Microsoft extensions while using the jvc
  compiler.  Bugzilla Report 19826.

* You can now limit the parallelism of <apply> and <chmod> by using the new
  maxparallel attribute.

* With the new addsourcefile attribute, you can make <apply> ommit the
  source file names from the command line.  Bugzilla Report 13654.

* <apply> and <chmod> now support nested <filelist>s as well as <dirset>s.
  Bugzilla Reports 15929 and 20687.

* <apply> and <chmod> will display a summary if you set the new
  verbose attribute to true.  Bugzilla Report 19883.

* <copy>/<move>'s failonerror attribute can now also be used to
  continue the build if an I/O error caused a problem.  Bugzilla
  Report 12999.

* new selector <type/> allowing to select only files or only directories.
  Bugzilla Report 20222.

* <java> and <junit> now support a nested <bootclasspath> element that
  will be ignored if not forking a new VM.

* <junit>'s nested <formatter> elements now support if/unless clauses.

* <ejbjar>
  cmpversion attribute added
  jboss element will look for jbosscmp-jdbc.xml descriptor
  if ejbjar has cmpversion="2.0" set
  Bugzilla Reports 14707 and 14709.

* <pvcs> config attribute added to set the location of a specific PVCS
  .cfg file
  Bugzilla Report 9752

* <mapper> has an "unpackage" mapper
  Bugzilla Report 18908

* Added <scriptdef> task allowing tasks to be defined using any BSF-supported
  scripting language.

* <touch>'s datetime attribute can now accept time with a granularity
  of seconds as well.  Bugzilla Report 21014.

* <checksum> has two new properties: totalproperty and todir.

* FileUtils#createTempFile will now create temporary files in the
  directory pointed to by the property java.io.tmpdir

* <unzip> and friends now supports an optional encoding attribute to
  enable it to expand archives created with filenames using an encoding
  other than UTF8.  Bugzilla Report 10504.

* <patch> has a new attribute destfile that can be used to create a new
  file instead of patching files in place.

* OpenVMS is detected as a valid OS family.

* DirectoryScanner has been optimized for cases where include patterns do not
  start with wildcards.  Bugzilla Report 20103.

* DirectoryScanner begins to be optimized not to scan excluded directories.
  Bugzilla Report 21941.

* Added keep-going feature. Bugzilla Report 21144

* The archives generated by <zip> and friends will now contain CRC and
  size information in the "local file header", thereby providing this
  information to applications that read the archives using
  java.util.ZipInputStream.  Bugzilla Report 19195.

* <copy> and <move> can now handle mappers that return multiple
  mappings per source path. This behaviour is enabled by using
  an enablemultiplemapping attribute. Bugzilla Report 21320.

* <exec> will now work on OpenVMS (please read the notes in
  <exec>'s manual page).  Bugzilla Report 21877.

* <exec> will now have a new attribute spawn (default false).
  If set to true, the process will be spawned. Bugzilla Report 5907.

* <java> will now have a new attribute spawn (default false).
  If set to true, the process will be spawned. Bugzilla Report 5907.

* <parallel> now supports a timeout which can be used to recover
  from deadlocks, etc in the parallel threads. <parallel> also
  now supports a <daemons> nested element. This can be used to
  run tasks in daemon threads which the parallel task will not
  wait for before completing. A new attribute failonany will cause
  <parallel> to throw an exception if any thread fails without
  waiting for all other threads to complete.

* <zip> and friends will consume far less memory than they used to
  when run with compress="false".  Bugzilla Report 21899.

* <if/> and <unless/> attributes added to <param/> element of <style>
   Bugzilla Report 22044

* <zip> and friends have a new attribute "keepcompression" that can be
  used to incrementally build an archive mixing compressed and uncompressed
  entries.

* <junit>'s XML formatter adds a new classname attribute to the <testcase>
  elements.

* new <permissions> type add permission handling to the code
  this type can be nested in the <java> and <junit> tasks.
  Bugzilla Report 22533.

* additional shortcuts for ant options (-d --> -debug, -e --> -emacs,
  -h --> -help, -p --> -projecthelp, -s --> -find).

* new selector <modified>. "cache" was renamed to "modified".
  Bugzilla Report 20474.

* <stcheckout> and <stlist> have a new asofdate attribute that can be
  used to checkout/list files based on a date instead of a label.
  Bugzilla Report 20578.

* New filter <concatfilter>. Adds the content of file at the beginning
  or end of a file. Discussion started at
  http://marc.theaimsgroup.com/?l=ant-user&m=106366791228585&w=2

* New task <import>

* New task <macrodef>

* New task <presetdef>

* Ant libraries that can make use of namespaces to avoid name
  clashes of custom tasks


* <java> and <junit> now support <assertions>, which let you enable
  and disable Java1.4 assertions on a package or class basis. These
  only work when fork=true, currently.

* .NET tasks expanded with VB support <vbc> and J#, via <jsharp>,
  <importtypelib> and <ilasm>. <csc> supports nested <src> types,
  <defines> for (potentially conditional) definitions, <reference>
  filesets for references. The executable attribute lets you switch to
  mono or other implementations -<csc> has been tested with Mono on
  Linux and OSX.


Changes from Ant 1.5.3 to Ant 1.5.4
===================================

Changes that could break older environments:
--------------------------------------------

* If the Visual Age tasks used to work for you, they may stop doing so
  now - and we'd like to know about it.  The current set of tasks is
  supposed to work with any version of VAJ starting with 3.0.

Fixed bugs:
-----------

* The Visual Age for Java tasks didn't work (at least for versions 3.0
  and higher).  Bugzilla Report 10016.

* URL-encoding in <vaj*port> didn't work properly.

* VAJRemoteUtil called getAbsolutePath instead of getPath
  causing problems when using a Windows VAJ server from a UNIX server.
  Bugzilla Report 20457.

* VAJImport task failed with NullPointerException when using DirectoryScanner.
  Bugzilla Report 22080.

Other changes:
--------------

* Shipped XML parser is now Xerces 2.5.0

* <javah> will invoke oldjavah on JDK 1.4.2.  Bugzilla Report 18667.

* The VAJ tasks now support a haltonfailure attribute to conditionally
  keep building even if they fail.

* It is now possible to use the latest (versioned or unversioned) edition
  in <vajload> by using special wildcard characters.  Also fixes
  Bugzilla Report 2236.

Changes from Ant 1.5.2 to Ant 1.5.3
===================================

Changes that could break older environments:
--------------------------------------------

* The <zip> task and friends have again changed a method signature
  (sorry, was necessary to fix bug 17780).  The return type of
  getResourcesToAdd has changed.

Fixed bugs:
-----------

* <zipfileset>'s filemode would get ignored and the dirmode was used
  for the included files as well.  As a side effect, WinZIP was unable
  to extract or display the files, so they seemed to be missing from
  the archive.  Bugzilla Report 17648.

* <ftp> could use the wrong path separator when trying to change the
  remote working directory.  Bugzilla Report 17735.

* <jar update="true"> would loose all original files if you didn't
  specify any nested <(zip)fileset>s and the manifest had changed.
  Bugzilla Report 17780.

* If you used a value starting with \ on Windows for the appxml
  attribute of <ear> or the webxml attribute of <war>, it would be
  ignored.  Bugzilla Report 17871.

* Ant will no longer implicitly add Sun's rt.jar in <javac> when you
  use jvc and don't specify a bootclasspath.  Bugzilla Report 18055.

* The prefix attribute of <zipfileset> would not generate directory
  entries for the prefix itself.  Bugzilla Report 18403.

* starteam checkout can now handle deleted labels.  Bugzilla Report 17646.

* The Unix wrapper script failed if you invoked it as a relative
  symlink and ANT_HOME has not been set.  Bugzilla Report 17721.

Other Changes:
--------------
* Added ability to specify manifest encoding for the <jar> and
  <manifest> tasks

Changes from Ant 1.5.1 to Ant 1.5.2
=============================================

Changes that could break older environments:
--------------------------------------------
* ANT_OPTS environment variable is now applied at the start of the
  Java command line, allowing position specific parameters of some
  JVMs, such as -classic to be specified.

* ZipScanner#getIncludedFiles will now return the names of the ZipEntries
  that have been matched instead of the name of the archive.

* The <zip> task and friends have been heavily modified, almost every
  method signature of the Zip class has changed.  If you have subclassed
  Zip (or one of its subclasses), your class will most likely not
  compile against the current code base.  If it still compiles, it will
  probably not work as in Ant 1.5.1.

Fixed bugs:
-----------
* <translate> was not ignoring comment lines.

* <manifest> wouldn't update an existing manifest if only an attribute
  of an existing section changed.

* ant.bat now supports the ANT_ARGS and JAVACMD environment variables
  again (like Ant 1.5 did).

* The "plain" <junit> <formatter> could throw a NullPointerException
  if an error occured in setUp.

* <junit> will now produce output when a test times out as well.

* <replace> would count some internal character replacements when
  reporting the number of replaced tokens.

* <concat> would cause an exception if a <filelist> pointed to files
  that do not exist.

* <javadoc> will now pass -source to custom doclets as well.

* <cvstagdiff> would throw a NullPointException if there had been no
  differences.

* <cvschangelog> could miss today's changes.

* <concat> could append newline characters between concatenated files.

* <xmlvalidate> ignored the specified encoding of the files to
  validate.

* the errorsbeginat attribute of the <http> condition didn't work.

* Ant will try to force loading of certain packages like com.sun.*
  from the system classloader.  The packages are determined by the
  version of the JVM running Ant.

* Ant didn't find the runtime libraries on IBM's JDK 1.4 for Linux.

* random component of temporary files is now always a positive integer.

* Ant could incorrectly try to use the 1.4 regexp implementation even
  if it isn't available if you run the JVM with -Xverify:none.

* Ant would die with an exception if you used nested <reference>
  elements in Ant and the refid attribute didn't point to an existing
  project reference.

* The <get> task can now be compiled (and Ant thus bootstrapped) using
  Kaffee.

* build.sysclasspath will now be honored by more tasks.

* The signjar keystore attribute has been reverted to a String allowing
  it to once again accept URLs. This should not affect current File based usage
  unless you are extending the Signjar task.

* <jar update="true"> would remove the original manifest.

* fix up folder creation in PVCS task

* <tar>'s up-to-date check didn't work for nested <(tar)fileset>s.

* Corrected a problem in XMLLogger where it would not associated
  messages with a taskdef'd task

* <uptodate> now works when using attributes (i.e. not filesets) and pointing
  to the same file

* Java task (and output system) now stores output which doos not end
  with a line feed.

* splash screen wouldn't disappear when build was finished.

* <exec> now supports OS/2.

* <zip> and friends would only update/recreate existing archives if
  the files to add/update have been newer than the archive.

* <javadoc>'s <link> element could fail for offline="true" on some JDKs.

Other changes:
--------------

* MailLogger now sets the Date header correctly.

* Shipped XML parser is now Xerces 2.3.0

* signjar now accepts a maxmemory attribute to allow the memory allocated to the
  jarsigner tool to be specified. The jarsigner from the JDK's JAVA_HOME bin
  dir is now used rather than the first jarsigner on the path.

* **/.DS_Store has been added to the list of default pattern excludes.

* The Created-By header in the default manifest now contains the JVM
  vendor and version according to the jar specification. A new header,
  Ant-Version provides the Ant version used to create the jar.

* <zip> can now store Unix permissions in a way that can be
  reconstructed by Info-Zip's unzip command.

Changes from Ant 1.5.1Beta1 to 1.5.1
====================================

Fixed bugs:
-----------

* <tstamp>'s prefix attribute failed to apply to nested <format> elements.

* <junitreport> created an empty junit-noframes.html if no format had
  been specified.

* <basename> would remove more than it should if the file name
  contained more than one dot.

* <filterset>s nested into <filterset>s didn't work.

Other changes:
--------------

* Shipped XML parser is now Xerces 2.2.0

* Filesets now support a 'file' attribute, allowing a single-file
  fileset to be constructed without having to specify its parent
  directory separately.

* <junit> will now return the result of a call to getName instead of
  "unknown" for Test implementations that don't extend TestCase but have
  a public String getName() method.

Changes from Ant 1.5 to 1.5.1Beta1
==================================

Fixed bugs:
-----------
* Date/time in CvsChangeLog was in local timezone and 12 hour format leading
  to a problem when sorting by time. It is now UTC (GMT) and in 24-hour
  format as per cvs 'specifications'.

* CvsTagDiff now supports ampersand modules or modules that have a different
  root directory than their name.

* EjbJar threw NPEs for the Websphere element. The property 'websphere.home'
  was not documented.

* Mail example in the documentation was not correct.

* Checksum was broken in the following scenario:
  (using verifyproperty OR in a condition) AND using filesets
  with multiple files.

* The ExpandProperties filter threw NPEs when defined using
  the <filterreader> format.

* The sh wrapper script didn't work under Cygwin if ANT_HOME wasn't
  set with a Unix style filename.

* The sh wrapper script could fail if you started Ant from a directory
  with whitespace in its name.

* ant -diagnostics was not working properly when the task dependency
  was missing and was just printing the missing dependency.

* If a task got redefined via <taskdef>, it lost its child elements.

* <property>'s classpathref attribute was broken.

* <arg line="''" /> would result in no command line argument, will now
  be a single empty argument.  Use <arg value="''"/> if you need the
  quotes literally.

* <replaceregexp> could append a newline character at the end of the
  file.

Other changes:
--------------

* Appendix E of Java Development with Ant (Loughran/Hatcher) was
  contributed to the docs.

* <available> will only print deprecration warnings if it is actually
  used to change the value of a property.

Changes from Ant 1.5beta3 to Ant 1.5
====================================

Changes that could break older environments:
--------------------------------------------

* The filesetmanifest attribute added to <jar> after the 1.4.1
  release has been removed for now.  This change may affect only
  the 1.5Beta/1.6Alpha users.  An attempt will be made to add this
  feature back into Ant 1.6.

Fixed bugs:
-----------

* <zip> and friends would always update existing archive if you set
  the update attribute to true.

* To support backward compatibility with older versions, <pathconvert>
  will once again set the property, even if the result is the empty
  string, unless the new 'setonempty' attribute is set to false|no|off
  (default is "true").

* The manifest task would crash XmlLogger

Other changes:
--------------

* added **/.svn and **/.svn/** to the default excludes

Changes from Ant 1.5beta2 to Ant 1.5beta3
=========================================

Changes that could break older environments:
--------------------------------------------

* <pvcs> default filenameformat has been different from Ant 1.4.1.
  Now it is different from 1.5beta1 and 1.5beta2.

* <pathconvert> won't set the property if the result is the empty string.

Fixed bugs:
-----------

* <available> could fail to find files or directories that happen to
  start with the name of the project's basedir but are not children of
  the basedir.

* Nested <property>'s inside <ant> can now be overriden by subsequent
  <ant> and <antcall> tasks.

* <xslt>'s outputtype attribute wouldn't do anything.

* <linecontains> filterreader could swallow lines.

* <sequential> used to configure the tasks (set their attributes)
  before the first task has been executed.  This means that properties
  that have been set by nested task seemed to be unset for the other
  tasks in the same <sequential> element.

* <javac>'s sourcepath setting has been ignored by some compiler
  implementations.

* <javadoc>'s packagelist attribute didn't work.

* the plain mailer would always use port 25 in <mail>.

* Ant's default logger could swallow empty lines.

* ejbjar's iPlanet nested element now can process multiple descriptors.

* IPlanetEjbc was looking in the wrong place for four iiop files.

* <javac> would pass the -source switch to JDK 1.3's javac, even
  though it doesn't support it.

Other changes:
--------------

* <checksum> now uses a buffer (of configurable size).

* The "Trying to override task definition" warning has been degraded
  to verbose level if the two task definitions only differ in the class
  loader instance that has loaded the definition.

* Add a jvmargs to the ejbjar's weblogic element to allow additional
  arguments to be provided to the VM runnign ejbc. Document the
  jvmdebuglevel attribute which can be used to avoid warnings about
  interface classess being found on the classpath. Document the new
  <sysproperty> element which allows JVM properties to be defined.
  Added an outputdir attribute to allow the destination to be a
  directory into which the exploded jar is written.

* ejbjar now supports Borland Enterprise Server 5 and Jonas 2.5

Changes from Ant 1.5beta1 to Ant 1.5beta2
=========================================

Changes that could break older environments:
--------------------------------------------

* Properties will now be expanded in mail message bodies.  This means
that one $ sign will be stripped if your mail message contains the text
$$.

* org.apache.tools.ant.taskdefs.Expand no longer extends MatchingTask.

* Available#setFile now again uses a File argument as it did in 1.4,
this may break environments that have been adapted to the String
argument version present in 1.5beta1.

Fixed bugs:
-----------
* When <move> attempts a rename, it deletes the destination file, if it
  exists, before renaming the source file.  However, <move> was not
  checking if the destination file was actually a directory before
  trying to delete it.

* Make CVS Tasks to work under Cygwin.

* Fix LineContains to handle huge files elegantly without causing
Stack Overflows.

* if you ask for the "classic" compiler on Java1.4, you get upgraded to
"modern" because there is no classic compiler any more.

* the <http> condition was viewing 404 'not found' exceptions as success. Now
it defaults to viewing any response >=400 as an error, and has an errorsBeginAt
attribute you can use if you want a higher or lower value.

* <get> throws a build exception on an http authorization error, unless you
have set ignoreerrors to true.

* <wsdltodotnet> was spelt in Wintel case: <WsdlToDotnet>. It is now lower
case, though the old spelling is retained for anyone who used it.

* Merging of Manifests in jar now works as documented.

* paths that have been separated by colons would be incorrectly parsed
on NetWare.

* runant.pl now supports NetWare.

* <tempfile> and <setproxy> tasks were in beta1, but not defined by
default; They now are. <tempfile> fills a property with the name of a
temporary file; <setproxy> lets you set the JVM's http, ftp and socks proxy
settings.

* <available classname="foo" ignoresystemclasses="true"> failed for
JDK 1.1 and 1.2, even if the class could be found on the
user-specified classpath.

* <property environment=... /> now works on z/OS.

* forked <javac> failed for the wrong reason on JDK 1.1 - Ant would
use a temporary file to hold the names of the files to compile under
some conditons, but 1.1 doesn't support this feature.  Ant will no
longer try this, but you may run into problems with the length of the
command line now.

* the refid attribute for <property>s nested into <ant> or <param>s
nested into <antcall> didn't work.

* <replaceregexp> didn't work for nested <fileset>s.

* <javadoc> dropped sourcepath entries if no "interesting" .java
source files  could be found below them.  This has been backwards
incompatible and caused problems with custom doclets like xdoclet.

* Using the doclet, docletpath or docletpathref attributes of
<javadoc> may have caused NullPointerExceptions.

* nested <filesets> of <javadoc> would include too much.

* <dependset> will no longer choke on <targetfileset>s that point to
non-existing directories.

* <patch> didn't work at all.

* <replace> and <replaceregexp> now fail if the file they are working
on is locked.

* <javadoc> would pick up the wrong executable in the combination JDK
1.2  and AIX.

Other changes:
--------------

* z/OS now gets detected by the os condition.

* <fileset> and <dirset> now have an optional followsymlink attribute
that can prevent Ant from following symbolic links on some platforms.

* BeanShell is now supported in the <script> task.

* <ejbjar> under Weblogic attempts to use the ejbc20 compiler for 2.0 beans
  based on the deployment descriptor's DTD reference. Under weblogic 7.00 Beta
  this ejbc class has been deprecated. To avoid the deprecation warning use
  ejbcclass="weblogic.ejbc".

* <ejbjar> will add a manifest to the generated jar based on the naming
  convention in use. This overrides the manifest specified in the
  <ejbjar> attribute


Changes from Ant 1.4.1 to 1.5beta1
==================================

Changes that could break older environments:
--------------------------------------------

* Important: Single $ signs are no longer silently stripped!
  Before you panic that we have broken all your build files, we have kept
  the old "$$" -> "$" behaviour. So only build files which accidentally had
  a $ sign in a string that was being silently stripped may break.
  We added this fix to stop newbie confusion; if you want to write a
  build file which works on ant versions 1.4.1 or earlier, stay with
  the double $$ sign rule.

* Project.getBuildListeners now returns a clone of the listener
  list. Changes to the returned list will not affect the listeners
  currently attached to the Project. It also means that it is safe to
  iterate over the returned list if listeners are added or removed
  during the traversal.

* <pvcs> default filenameformat has been different from Ant 1.4.1.

* Some messages that are printed during startup will not be
  written to the logfile specified via -logfile as they might destroy
  the format of the file for special BuildLoggers (like XmlLogger).

* The filesetmanifest attribute added to <jar> after the 1.4.1
  release has been removed for now.  This change may affect only
  the 1.5Beta/1.6Alpha users.  An attempt will be made to add this
  feature back into Ant 1.6.
* Shipped XML parser is now Xerces 2.0.1 along with the XML Parser APIs.
  XML Parser APIs is a separate jar that contains the necessary
  JAXP/DOM/SAX classes.

* <telnet> was fixed to expand properties inside nested <read> and
  <write> elements; before this only happened when you assigned the text
  to the string attribute. If you had $ signs in the string, they may
  need escaping.

* the RegexpMatcher interface has been extended to support case
  insensitive matches and other options - custom implementations of
  this interface won't work any longer.  We recommend to use the new
  Regexp interface that also supports substitution instead of the
  RegexpMatcher interface in the future.

* <gzip> will throw an exception if your src attribute points to a directory.

* Unjar, Unzip and Unwar will throw an exception if the Src attribute
  represents a directory.  Support for nested filesets is provided
  instead.

* It is no longer possible to overwrite a property using tasks like
  <condition>, <exec>, <pathconvert>, or <tstamp>. In some exceptional
  cases it will generate a warning if you attempt to overwrite an
  existing property.

* Taskwriters please note: Whenever tasks had any overloaded set* methods,
  Ant's introspection mechanism would select the last overloaded method
  provided to it by the Java Runtime.  A modification has now been made such
  that when the Java Runtime provides a method with a String as its argument,
  a check is made to see if there is another overloaded method that takes in
  some other type of argument.  If there is one such method, then the method
  that takes in String as an argument is not selected by the Introspector.

* The pattern definition **/._* has been included into the Default
  Excludes list.

* <propertyfile>'s <entry> element was modified to remove "never" as a value
  as its behavior was undocumented and flakey.

* The -projecthelp flag now only prints out targets that include the
  'description' attribute, unless the -verbose or -debug flag is included
  on the Ant command line.

* Ant's testcases now require JUnit 3.7 or above, as they now use the new
  assertTrue method instead of assert.

* If the 'output' attribute of <ant> is set to a simple filename or a
  relative path, the file is created relative to ${basedir}, not ${user.dir}.

* The default value for build.compiler is now javac1.x with x
  depending on the JDK that is running Ant instead of classic/modern.

Fixed bugs:
-----------

* <available> could fail to find files or directories that happen to
  start with the name of the project's basedir but are not children of
  the basedir.

* Nested <property>'s inside <ant> can now be overriden by subsequent
  <ant> and <antcall> tasks.

* <xslt>'s outputtype attribute wouldn't do anything.

* <linecontains> filterreader could swallow lines.

* <sequential> used to configure the tasks (set their attributes)
  before the first task has been executed.  This means that properties
  that have been set by nested task seemed to be unset for the other
  tasks in the same <sequential> element.

* <javac>'s sourcepath setting has been ignored by some compiler
  implementations.

* <javadoc>'s packagelist attribute didn't work.

* the plain mailer would always use port 25 in <mail>.

* Ant's default logger could swallow empty lines.

* ejbjar's iPlanet nested element now can process multiple descriptors.

* IPlanetEjbc was looking in the wrong place for four iiop files.

* <javac> would pass the -source switch to JDK 1.3's javac, even
  though it doesn't support it.

* <zip> and friends would always update existing archive if you set
  the update attribute to true.

* To support backward compatibility with older versions, <pathconvert>
  will once again set the property, even if the result is the empty
  string, unless the new 'setonempty' attribute is set to false|no|off
  (default is "true").

* The manifest task would crash XmlLogger

* A bug existed that prevented generated log files from being deleted as
  part of the build process itself.  This has now been fixed.

* Fixed bug where <move> ignored <filterset>s.

* Ant works properly with the combination of Java1.4/WindowsXP.

* Fixed bug where <java> used to sometimes invoke class constructors twice.

* Fixed bug with 4NT shell support.

* Fixed bug where ant would not perform ftp without remotedir being
  specified even though this was not mandatory.

* Fixed bug where ant would not copy system properties into new Project
  in ant/antcall tasks when inheritall="false" is set.

* <propertyfile> would not close the original property file.

* <ant> will no longer override a subbuild's basedir with inheritall="true".

* Fixed problem with the built-in <junit> formatters which assumed
  that only one test could be running at the same time - this is not
  necessarily true, see junit.extensions.ActiveTestSuite.

* <jar>'s whenEmpty attribute is useless as JARs are never empty, they
  contain at least a manifest file, therefore it will now print a
  warning and do nothing.

* <typedef> hasn't been all that useful as it couldn't be used outside
  of targets (it can now) and nested "unknown" elements have always
  been considered to be tasks (changed as well).

* <fixcrlf> would fail for files that contained lines longer than 8kB.

* Some junit formatters incorrectly assumed that all testcases would
  inherit from junit.framework.TestCase.

* <fixcrlf> dropped the first characters from Mac files.

Other changes:
--------------

* <checksum> now uses a buffer (of configurable size).

* The "Trying to override task definition" warning has been degraded
  to verbose level if the two task definitions only differ in the class
  loader instance that has loaded the definition.

* Add a jvmargs to the ejbjar's weblogic element to allow additional
  arguments to be provided to the VM runnign ejbc. Document the
  jvmdebuglevel attribute which can be used to avoid warnings about
  interface classess being found on the classpath. Document the new
  <sysproperty> element which allows JVM properties to be defined.
  Added an outputdir attribute to allow the destination to be a
  directory into which the exploded jar is written.

* ejbjar now supports Borland Enterprise Server 5 and Jonas 2.5

* added **/.svn and **/.svn/** to the default excludes
* Selector Elements now provide a way to create filesets based on
  sophisticated selection criteria.

* Gzip and Bzip2 files can now be constructed in the fly when using
  the tar task without having to create the intermediate tar file on
  disk.  The Untar task can also untar GZip and BZip2 files on the fly
  without creating the intermediate tar file.

* New optional type, <classfileset> added.

* <ejbjar> now allows control over which additional classes and interfaces
  are added to the generated EJB jars. A new attribute "dependency" can be
  defined which controls what classes are added. The addition of classes now uses
  the Jakarta-BCEL library rather than reflection, meaning bean classes are
  no longer loaded into Ant's JVM. The default dependency analyzer is known as
  the ancestor analyzer. It provides the same behaviour as the 1.4.1 version of
  <ejbjar>. If the BCEL library is not present, a warning will be issued stating
  the ancestor analyzer is not available. In this case <ejbjar> will continue
  to function but will not add super classes to the jar.

* <available> has a new attribute named ignoreSystemClasses.

* New task <cvschangelog/> generates an XML report of changes that occur
  on CVS repository.

* New filter readers: ClassConstants, ExpandProperties, HeadFilter,
  LineContains, LineContainsRegExp, PrefixLines, ReplaceTokens,
  StripJavaComments, StripLineBreaks, StripLineComments, TabsToSpaces,
  TailFilter.

* <copy>, <loadfile>, <loadproperties>, <move> support FilterChains
  of FilterReaders.

* New task <loadproperties> to load contents of file as Ant properties,
  with nested <filterchain> elements.

* New task <loadfile> to load a whole file into a property.

* New task <echoproperties> to list your current properties to the screen
  or a file.

* New tasks <bzip2> and <bunzip2> to pack and unpack files using the
  BZip2 alogrithm.

* New tasks <replaceregexp>, <checksum>, <translate>, <waitfor>,
  <manifest>, <vsscp>, <vssadd>, <vsscreate>, <splash>, <basename>, <dirname>,
  <concat>, <sourceoffsite>, <jarlib-available>, <jarlib-display>,
  <jarlib-manifest>, <jarlib-resolve>.

* A new combined <mail> task, which replaces the old <mail> and
  <mimemail> tasks, has been added.  The <mimemail> task, and
  old SendEmail and MimeMail classes have been deprecated.

* Mail task allows specification of port number.

* Users can control what <zip> and <jar> must do when duplicate files
  are found.  A new element <zipgroupfileset> allows for multiple zip
  files to be merged into the archive.  In addition, <jar> also has
  another new attribute: filesetmanifest.  The existing manifest
  attribute of <jar> now also accepts the name of a jar added through
  a fileset.

* gzip now checks that the zipfile is older than the source file
  before rebuilding the zipfile.

* TarFileset takes in three new attributes - fullpath, prefix
  and preserveLeadingSlashes.

* <move> attempts to rename the directory, if everything inside it is
  included, before performing file-by-file moves.  This attempt will
  be done only if filtering is off and if mappers are not used.  This
  is a performance improvement and there is no change otherwise in
  the funtionality of this task.

* Exec task has extra attribute "resultproperty" to get the return code
  into a property.

* Exec task prints a message when a timed-out process is killed.

* Added optional attributes - name, arch and version to the <os> task.

* Unjar, Untar, Unwar and Unzip now support patternsets to
  select files from an archive for extraction.  Filesets may be
  used to select archived files for unarchival.

* Javac task allows debug levels to be specified.  Debug levels
  will have an effect only when the modern compiler or the
  classic compiler (version 1.2 and higher) is used and debugging
  is enabled.

* Added support for specifying CVS_RSH in the <cvs/> task

* The attributes zipfile, jarfile, warfile and earfile (from the Zip,
  Jar, War and Ear tasks) have been deprecated and superseded by a
  new attribute "destfile".

* Added new conditions <isset>, <checksum>, <http>, <socket>, <contains>,
  <filesmatch>.

* <taskdef> and <typedef> will now emit a warning if a task/type of
  the given name already exists.

* A new revision of VAJ tasks: The most important new feature
  is the ability to execute VAJ tasks from the command line by
  exploiting the Remote Tool Access feature of VAJ.

* Improved support for Novell NetWare.

* Added an optional encoding attribute to <fixcrlf>.

* <apply> has a new attribute relative that allows users to pass the
  filenames as relative instead of absolute paths on the command line.

* References can now be copied into the child build by <ant> and
  <antcall> using nested <reference> elements or the new inheritRefs
  attribute.

* <fail> now supports builds to fail based on conditions via if and
  unless attributes.

* Ant now comes with two new BuildLogger implementations - one that
  can send emails containing a log of the build process (MailLogger),
  and one that colorizes the output based on message levels, using
  ANSI color code escape sequences (AnsiColorLogger).

* A "package" mapper type has been added to allow package directory
  names replaced with the dotted form.

* You can now specify environment variables in the <java> and <junit> tasks
  if the fork attribute has been set to true.

* -propertyfile command-line option has been added to load an entire
  property file just as -D properties are declared (as user properties).
  -D properties take precedence over -propertyfile specified ones.

* You can now set an ANT_ARGS environment variable to hold arguments you
  always want passed to the 'ant' command -- for example, if you always
  want to use a different logger or the -find flag.

* <tstamp> now supports a new "prefix" attribute to prefix properties set.

* You can now specify the -sourcepath for <javac> explicitly.

* <javac> now supports a new "listfiles" attribute to list the source
  files it's handing off to the compiler.

* The compiler implementation for <javac> can now be chosen on a task by
  task basis.  The new "compiler" attribute of <javac> can be used to override
  the value of the build.compiler property, if set.

* <javac> has a new nested element, <compilerarg>, which allows you
  to specify additional args for the specific compiler you're using.

* <javac>'s "source" attribute is now enabled for jikes as well.

* <propertyfile>'s <entry> now has a 'unit' attribute to specify the
  increment/decrement unit on date operations.

* <property> now supports a 'prefix' attribute when loading from a file
  or resource.

* In Ant 1.4, a feature has been added to the <junit> task that would
  add ant.jar, optional.jar and junit.jar implicitly to the classpath -
  this feature can now be disabled by setting the new includeantruntime
  attribute to false.

* <style> behaves differently from any other directory-based task, as it
  processes all files that it finds in included directories in
  addition to the files matched by your patterns.  There is now a new
  attribute, 'scanincludeddirectories', to suppress this behavior.

* <javadoc> now supports a <tag> nested element to provide the -tag option
  to the standard Java 1.4 doclet. The element is ignored when not running
  on Java 1.4.

* <ftp> can now chmod files on a remote server that supports
  "site chmod", as well as set the umask before transferring files, if
  the server supports "site umask".

* New <serverdeploy> "optional" task.

* <patternset> now supports nested patternsets.

* Perforce tasks now support a "failonerror" attribute (defaults to "true").

* Open Source application server JOnAS support:
    EJB hot deploy and deploy with <serverdeploy> and <ejbjar>

* Added new DirSet (<dirset>) datatype.

* <path> now supports nested <dirset> and <filelist> elements.

* <pathconvert> now supports nested <dirset> and <filelist> elements.

* <pathconvert>'s "dirsep" and "pathsep" attributes now accept
  multi-character values.

* <copy> task now has a 'failonerror' attribute to allow keep-going
  behaviour when the file to be copied is not found (defaults to "true").

* <uptodate> now has a 'srcfile' attribute to allow specifying a
  full-path filename.

* <exec>, <sql> and <java> now support append attributes to allow
  appending the output to an existing file.

* <java> now supports a timeout attribute analog to <exec> - it is
  highly recommended to only use it together with fork="true".

* <javadoc> now supports a source attribute to enable javadoc to
  handle assertions present in JDK 1.4 source code.

* <replace> supports a new replacefilterfile attribute that
  automatically turns all properties of a given file into
  replacefilters.

* An alias of <xslt> has been added to refer to the <style> task.

* The compiler implementation for <rmic> can now be chosen on a task by
  task basis.  The new "compiler" attribute of <rmic> can be used to override
  the value of the build.rmic property, if set.

* <rmic> has a new nested element, <compilerarg>, which allows you
  to specify additional args for the specific compiler you're using.

* org.apache.tools.ant.XmlLogger now is a BuildLogger, rather than just
  a BuildListener. It can operate in either mode successfully.

* <junit> has a new attribute "showoutput".  If set to true, output
  generated by tests will be sent to Ant's logging system as well as
  to the formatters (instead of sending it to the formatters
  exclusively).

* Ant has now a pluggable way to prompt users for input, which is used
  by the new <input> task.  IDE integrators can provide an
  implementation of the InputHandler interface to decouple Ant's input
  from the console.  An implementation that gets its input from a file
  for unattended builds is part of Ant's distribution.

  For more details see docs/manual/inputhandler.html.

* <patch> has a new attribute that selects the directory in which to
  run the command.

* <javadoc> now supports two new nested elements, <fileset> and <packageset>.


Changes from Ant 1.4 to Ant 1.4.1
===========================================

Fixed bugs:
-----------

* <ant>'s antfile attribute will now also be considered an absolute path on
  Windows systems, if it starts with a \ and no drive specifier.

* The fullpath attribute of <zipfileset> has been ignored if you used
  the src attribute at the same time.

* The manifest file is now always placed as the second entry (after /META-INF)
  in generated jars. This allows the manifest to be read by JarInputStreams

* Fixed bug in depend task which would fail with a NullPointerException if no
  dependency cache was specified.

* sql task now handles REM statements correctly so that lines starying with rem
  but which are not comments are actually processed.

* XMLLogger now uses the task's name rather than the classname

* <mapper>s will now work as expected if the to pattern expands to an
  absolute pathname.

* <javac> didn't ignore memory settings in non-fork mode

* <cab> didn't split the options attribute into several command line
  arguments correctly.

Other changes:
--------------

* New source attribute for <javac> to enable assertion in JDK 1.4

* XmlLogger and <antstructure> now add an encoding declaration to the
  XML files they generate.

* <fileset> has a new attribute "casesensitive" to make it match
  filenames in a case insensitive way (if you set it to false) - by
  default filesets remain case sensitive.

Changes from Ant 1.3 to Ant 1.4
===========================================

Changes that could break older environments:
--------------------------------------------
* JUnitReport now uses the xalan redirect extension for multi-output.
  With Xalan 1.2.2 it forces the use of bsf.jar in the classpath.
  (Available in the xalan distribution). It is recommended to switch
  to Xalan 2.x that do not need it.

* Zip.setWhenempty() has changed its signature.

* <rmic> is now implemented using a factory. This makes extending
  rmic to use a new compiler a lot easier but may break custom
  versions of this task that rely on the old implementation.

* several Zip methods have changed their signature as we now use a Zip
  package of our own that handles Unix permissions for directories.
  Furthermore <zip> will now use the platform's default character
  encoding for filenames - this is consistent with the command line
  ZIP tools, but causes problems if you try to open them from within
  Java and your filenames contain non US-ASCII characters. Use the new
  encoding attribute of the task and set it to UTF8 to get the old
  behavior.

* The <pvcs> task has been moved to a package of its own.

* JUnitResultFormater has two additional methods that must be
  implemented by custom formatters.

* Ant will no longer use the canonical version of a path internally -
  this may yield different results on filesystems that support
  symbolic links.

* The output generated by the xml formatter for <junit> has changed
  again, it doesn't format the numeric value in the time attribute anymore.

* Pattern matching rules have changes slightly, the pattern foo*
  doesn't match files contained in a directory named foo - use foo/*
  instead.

* <fixcrlf> will not remove trailing whitespace at the end of lines anymore.

* The Classloader usage has been changed for the taskdef, property, available
  and sql tasks so that it delegates to the parent classloader. This may cause
  ClassNotFoundExceptions to be thrown if a system class attempts to load a
  class in the taskdef's classpath (typically factory objects).

* Ant now allows multithreading of tasks and the containment of tasks within
  other tasks. This can break customer listeners which do not expect messages
  from a task before the previous task has finished.

* Ant now installs its own ouput stream into System.out to route output to the
  task currently executing on the current thread. This also means that all
  output is now routed as Ant message events. Customer listeners and loggers
  should not call System.out at any time. This has always been true but such
  usage now will cause problems due to possible recursion.

* Invalid manifest files will now cause build failures in the <jar> task.

* Ant Introspection now looks for methods with method names starting with
  addConfigured. When called these methods are passed an argument after it has
  been configured from the build file. Custom tasks supporting nested elements
  starting with the name configured will no longer function.

* The environment variable JAVACMD that can be used to specify the
  java executable to Ant's wrapper scripts must not contain additional
  command line parameters any longer - please use the environment
  variable ANT_OPTS for such parameters now.

* Ant's wrapper scripts now quote the CLASSPATH environment variable, thus
  supporting classpaths which refer to directories containing spaces. This means
  that the CLASSPATH environment variable cannot have quotes. Any quotes should
  be removed. This will not affect the operation of the CLASSPATH environment
  variable in other contexts.

* A delete task like
  <delete includeEmptyFilesets="true">
    <fileset dir="somedir" />
  </delete>
  will now remove "somedir" as well, unless there are still files left
  in it (matched by the default excludes).

* The copy task will now fail if the file to be copied is not found.

* Ant properties defined in properties files now behave the same way as
  properties defined in the build file. In particular the $ character needs
  to be escaped in property values by doubling it to $$. So, to define a
  property with the value $hello, you need to define it in a properties file
  as
    test.prop=$$hello
  This was not the case in Ant 1.3

Other changes:
--------------

* New tasks: ear, p4counter, record, cvspass, vsscheckin, vsscheckout,
  typedef, sleep, mimemail, set of tasks for Continuus/Synergy, dependset,
  condition, maudit, mmetrics, jpcoverage, jpcovreport, jpcovmerge

* Ant now uses JAXP 1.1

* rmic now supports Kaffe's and Weblogic's version of rmic.

* new magic property build.rmic to chose the rmic implementation

* <tar> will now add empty directories as well

* you can now specify a description for <p4change>

* <touch> can now work on <fileset>s

* <uptodate> now supports a value attribute

* <fail> supports nested text

* <fixcrlf> won't override files that are already in the correct
   format.

* <sql> now supports REM comments as well as // and --

* <jar> now has a nested <metainf> element following the same idea as
  <war>'s <webinf>.

* <pvcs> can now handle multiple projects.

* <available> now has a "type" attribute you can use in conjunction
  with the "file" attribute to specify whether the "file" you're
  looking for is a file or a directory.

* New <junit> formatter named "brief"

* <ejbjar> changes
  * Add support for Borland Application Server to the <ejbjar> task using
    a <borland> nested element.
  * Add support for iPlanet Application Server to the <ejbjar> task. Also
    includes some iPlanet utility tasks
  * Add support for JBoss Application Server to the <ejbjar> task.
  * Add a naming attribute to control the naming scheme that
    ejbjar uses to name the generated EJB jars.
  * Weblogic element now sets the compiler class for EJB 2.0 beans
  * <dtd> elements can be specified at the <ejbjar> level for building generic
    beans
  * <dtd> elements can now be URLs
  * Allow the manifest to be specified for the generated jars
  * The weblogic element now supprts an attribte noEJBC to skip the processing
    of the jar by ejbc. The ejbc step will then occur at deployment
  * weblogic will tell ejbc to use Jikes compiler if build.compiler is set to
    jikes. It can be restored to the default, javac, operation if desired.

* Allow the <sql> Delimiter to be set in the so that Oracle stored procs may be
  entered

* <execon> and <apply> can now optionally skip empty filesets.

* <javadoc> has a new useexternalfile attribute that makes it use a
  temporary file for sourcefile and package names - helps to defeat
  command line length limitations.

* Data types like <path> can now be defined inside of <target>s

* you can now specify a classpath for <style> - the XSLZ processor
  will be loaded from this path

* added a force attribute to <style> to support dependencies that the
  task cannot determine itself (dependency on parameters, not file
  modification times for example)

* added vmlauncher attribute to exec tasks. This defaults to true. If
  it is set to false, the VM's ability to launch commands in bypassed
  and the OS shell, either directly or through the auxillary antRun
  scripts is used.

* regexp mapper now supports the java.util.regex package of JDK 1.4.

* New filesonly attribute for <zip> and friends to suppress directory
  entries.

* New update attribute for <zip> and friends - update an existing
  archive instead of creating a new one.

* <apply> and <execon> have been merged into a single task.

* added vssver.scc to the default excludes

* <available> has a new filepath attribute/nested element that allows
  you top search for a file in a given path.

* <junit> can now optionally set a property on test failure.

* <taskdef> can now define several tasks at once, reading the
  name/classname pairs from a property file or resource.

* <unzip/unjar/unwar> and <untar> now have an overwrite attribute that
  defaults to true.  If set to false, files that are newer than the
  files in the archive will not be replaced.

* <patternset> and <fileset> now support nested <in/excludesfile>
  elements - using these you can have more than one in/excludes file
  per <patternset>.

* Three new supported compilers for javac: kjc for kopi, gcj for the
  gcc frontend and sj for Symantec's compiler.
  In addition extJavac or the new fork attribute can be
  used to run the JDK's javac in a JVM separate from Ant.

* <fixrlf> can now with CR only line-ends and can use an arbitraty
  between 2 and 80.

* The .NET tasks have been adapted to the beta2 release of the framework.

* <move> will now try to rename() files before copying them byte by
  byte - only if filtering is of, of course.

* <ant> and <antcall> tasks now support a new attribute inheritAll. When set to
  false, only user properties are passed through to the target Ant instance.
  This includes properties set on the command line and properties explicitly
  passed

* <javadoc> now skips off line links if the package list cannot be found.

* <wlrun> now allows the security policy file to exist outside the weblogic
  directory.

* <java> task will set the Thread contextClassLoader under JDKs 1.2+ to the
  classloader for the class being executed.

* Introduce the concept of a TaskContainer - a task or element which can contain
  Ant Tasks.

* Add new tasks implementing the TaskContainer interface <parallel> and
  <sequential> which allow parallel execution of tasks to be specified.

* <depend> task will now take into account dependencies on jar files and class
  files from a given classpath.

* <jar> manifest entries may now be specified in the build file either
  completely or to be merged with a manifest file.

* <tstamp> task custom formats now support locales.

* Added a listner which will forward events to Log4J. The log4j configuration
  file should be in the directory from which Ant is run or passed as a system
  property using a JVM argument.

* Introduced the concept of <filtersets> to allow for more control in which
  filters get applied in a <copy> or <move> operation.

* Added nowarn attribute to javac and deprecated the Jikes-magic property
  build.compiler.warnings.

* The <depend> task cache format has changed and all dependency information is
  now stored in a single file.

Fixed bugs:
-----------

* Testcases have been made independent of current working directory.

* Input ZIP-Files will be closed when using a <zipfileset>.

* p4 tasks now don't fail if user, port or client have been omitted
  (and this is acceptable for the context of the command).

* <javah>'s outputfile attribute will be resolved as relative to the
  projects basedir.

* <antstructure> should create a valid DTD for propertyfile.operation.entry
  and omit tasks it fails to load.

* won't try to pass a -bootclasspath flag to javac 1.1 anymore

* <style>'s style attribute no handles absolute paths correctly.

* <delete includeemptydirs="true"> now deletes more than just the leaf
  directories.

* You can now specify a <fileset> for a directory that doesn't exist at
  declaration time but will created before the fileset gets used for the
  first time.

* If the quiet attribute has been set, <delete> will handle <fileset>s
  with non-existing directories gracefully.

* Output written by testcases will now be captured by the <junit> task
  and passed to the formatters.

* Quote the -group parameter to Javadoc as per the specification

* Initialise classes when loaded through the AntClassLoader - that is, run
  static initializers

* Implement getResource() and getResources() in AntClassLoader

* Create the <ejbjar> weblogic command line as a set of arguments rather than
  as a single line. Avoids problems with paths which contain spaces.

* <ejbjar> now fails when the weblogic ejbc compiler reports an error.

* Make the AntClassLoader load resources in the same order as it currently
  loads classes.

* Handle classpaths with spaces

* Make sure XSLT processors close their output files in <style>.

* perform proper uptodate check in <rmic> when compiling for IIOP.

* <jjtree>'s uptodate test works even if outputdirectory is not the
  parent dir of target

* <copy> will remove target file (if it exists) before writing to it -
  this avoids problems with links on filesystems that support them.

* <ftp> now properly recurses remote directories.

* <ftp> closes remote connection when it's done.

* <junit> tries to include all necessary classes for the task itself
  to the classpath when running in fork mode - doesn't work for JDK 1.1

* <apply> and <execon> do now execute the command only once, if you
  specify the parallel attribute - instead of once per fileset.

* directory based tasks and fileset could miss some included files in
  directories that have been excluded

* <fixcrlf> failed for large files.

* <move> removed files you tried to move to themselves.

* <sql> task will not trty to print the result set unless the query succeeded.

* Ant classloader will now ignore paths which are invalid relative to the
  project base

* <ejbjar> weblogic elements check for jar file changes has been fixed.
  Previously some changes would not be included.

* properties loaded from properties files are now resolved internally. This
  removes the spurious warnings about usage of properties which have not been
  set.

* <jar> task and friends now process the JAR manifest to ensure it is valid.

* The task finished event now includes any exception thrown by the task.

* <java> task now supports a jvmVersion attribute so that if another JVM is
  being used, Ant can determine which options to use for features such as the
  VM memory limits


Changes from Ant 1.2 to Ant 1.3
===========================================

Changes that could break older environments:
--------------------------------------------

* Ant doesn't search for the buildfile anymore, unless you use the new
  -find argument.

* <perforce> has been replaced by a number of new tasks.

* <javac> is now implemented using a factory. This makes extending
  javac to use a new compiler a lot easier but may break custom
  versions of this task that rely on the old implementation.

* The output generated by the xml formatter for <junit> has changed a
  little, it doesn't append " sec" in the time attribute anymore.

Other changes:
--------------

* A GUI Frontend: Antidote. This is currently in development. At this
  time, this is not part of the Ant release, although the source is
  included if you are interested.

* New tasks: stylebook, propertyfile, depend, antlr, telnet, csc,
  ilasm, apply, javah, several clearcase tasks, junitreport, sound

* Added output attribute to <java>.

* Added nested zipfileset element to <zip>

* Changed <sql> so that printing is at the task level rather than
  the statement level.

* javadoc task will pass -d flag to any doclet if the destDir attribute is
  given. If the doclet does not accept the -d flag then omit the destdir
  attribute.

* <cab> can work on non-Windows platforms with the help of libcabinet.
  See http://trill.cis.fordham.edu/~barbacha/cabinet_library/.

* <ftp> now supports passive mode.

* New <mapper> data type that can be used to get influence on the
  target files for some tasks like <copy> or enable new types of tasks
  like <apply>.

* <execon> provides more control over the command line now, the names
  of the source files are no longer required to be at the end of the
  command.

* Style tasks will now support TraX compliant XSL processors if one is present
  in your classpath.

* Added a failonerror to the javac task. If set to false, the build will
  continue even if there are compilation errors.

* Added nested format elements to the tstamp task allowing additional time
  formats to be defined for arbitrary properties.

* Added classpath attribute and nested classpath element to <property>
  to make the resource attribute more powerful.

* ${} property expansion will now be performed on the patterns read
  from files specified as includesfile or excludesfile attributes.

* The <tar> and <untar> tasks now support GNU format for handling paths
  which are greater than 100 characters in length. In addition the <tar>
  task now supports nested filesets through which the file permissions
  may be controlled.

* wlrun, wlstop and ejbjar now support Weblogic 6.0

* The MPasre task has been updated to work with MParse 2.0

* The documentation has been significantly updated.


Fixed bugs:
-----------

* <signjar> doesn't use deprectated methods anymore.

* javadoc's failonerror attribute works again

* javadoc's additionalparam attribute will now be split into separate
  parameters (on spaces) to allow for more than one parameter.

* Changed <sql> task so that printing result sets works on Oracle

* Changes to ddcreator and ejbc helper to respect the descriptor hierarchy
  keppgenerated in ejbc can now be turned off

* ejbjar now correctly ignores <ejb-ref> elements in the deployment descriptor.
  CMP files are included by parsing the weblogic deployment descriptor rather
  than relying on the naming convention used in ant 1.2

* ejbjar includes super classes and super interfaces into the generated ejb
  jar files. The <support> nested element allows support classes to be
  included in the EJB jar. The toplink element should now correctly locate
  the toplink descriptor.

* <vssget> now correctly deals with spaces in arguments

* <jar> fails early if a given manifest file doesn't exist

* <rmic> doesn't search for the _Skel file anymore when stubversion is
  set to 1.2.

* <rmic> uses the the same classpath to verify a class can be rmic'd
  as it passes to the compiler.

* org.apache.tools.mail.MailMessage (and therefore <mail>) can now
  handle SMTP servers sending multi line responses.

* nested <classpath> elements of <taskdef> now work for <taskdef>s not
  nested into <target> as well.

* <property> and <available> will search for the resource "foo" instead
  of "/org/apache/tools/ant/taskdefs/foo" when given a relative resource
  name foo.

* Handle build files in directories whose name contained a "#" character

* <junit> can now log to files whose name contains a comma as well.

* The AntClassLoader now refers to the loader which loaded it, any
  requests it does not handle itself. Previously these went to the
  primordial loader.

Changes from Ant 1.1 to Ant 1.2
===============================

Changes that could break older environments:
--------------------------------------------

* Semantics of <property> has changed again in the hope to be more
intuitive. ${} expansion now happens at runtime and <property> tags
living inside of targets only take effect if they are visited at
runtime.

As a side effect of this change, task's attributes get set at runtime
not at parser time as well, which might change the results of
<script>s or other custom tasks that reference other tasks by their id
attribute.

* copying of support files in <javac> has been removed - as well as
the filtering attribute.

* the <expand> and <keysubst> tasks have been removed.

* the ignore and items attributes of directory based tasks have been removed.

* the command line switches _not_ starting with - have been removed.

* Path and EnumeratedAttribute have been moved from
org.apache.tools.ant to org.apache.tools.ant.types.

* the class attributes of <available>, <java>, <rmic> and <taskdef>
have been removed.

* the src attribute of <chmod> has been removed.

* <patch> and <javadoc> have lost some of their attributes.

* <java> and <cvs> have lost some undocumented attributes.

* the Unix antRun script would search for command.sh in the directory
it changed to and invoke this instead of command if present. This
behavior has been dropped.

* <ejbjar> task syntax has been changed significantly

* <exec> is no longer implemented by org.apache.tool.ant.taskdefs.Exec.
Custom tasks that rely on Project.createTask("exec") to return an
instance of this class are going to fail.

* nested <include> and <exclude> elements expect the value of their
name attribute to be a single pattern, they don't accept multiple
patterns anymore. Split them into multiple elements of the same type.

* <delete dir="somedir" /> will now delete the directory itself as
well as all included files. If you just want to clean out the
directory and keep the empty one, use a nested fileset.

Other changes:
--------------

* New tasks: antstructure, cab, execon, fail, ftp, genkey, jlink,
junit, sql, javacc, jjtree, starteam, war, unwar, uptodate,
native2ascii, copy, move, mparse.

* copydir, copyfile, deltree and rename are now deprecated. They
should be replaced with the new copy, delete and move tasks.

* <java> uses a ClassLoader of its own in no-fork mode if a classpath is
specified.

* <style> will create the necessary target directories and reprocess
all files if the stylesheet changes.

* New data types fileset and patternset - expected to get a broader use.
They, as well as PATH like structures, can now be defined on a global
level and later be referenced by their id attribute.

* You can specify environment variables to <exec>.

* <get> can check whether a remote file is actually newer than a local
copy before it starts a download (HTTP only).

* Added a -logger option to allow the class which performs logging to be
specified on the command line.

* Added a -emacs option to tell the logger to leave out taskname adornments
on log output.

* <chmod> works on all files in parallel and supports multiple filesets.

* <replace> can now use tokens and/or values that cross line boundaries.

* build.compiler supports now jvc as well.

* project specific help can now be obtained with the -projecthelp option.

* Added a -debug option to make -verbose less verbose (and more useful)

* Ant will now search for a file named build.xml in the parent directory
and above (towards the root of the filesystem) if you didn't specify
-buildfile and there is no build.xml in the current directory.

* <echo> can now write to a file and accepts nested text.

Fixed bugs:
-----------

* <chmod> didn't work when used as a directory based task.

* Path, Available, Property didn't resolve relative filenames with
respect to the Project's basedir.

* Project didn't interpret the basedir attribute correctly in all
cases.

* Nested <src> in <javac> caused NullPointerException.

* Corrupt Zip- and Jar-files ar now deleted if the task fails.

* many more fixes we've forgotten to document here ...

* The packagelistloc attribute of <javadoc>'s <link> child will be
  resolved as a file (i.e. it is either absolute or relative to
  basedir).
