<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -4,9 +4,17 @@
    ==  in this case for the Apache Ant distribution.                      ==
    =========================================================================
 
+   Apache Ant
+   Copyright 1999-2006 The Apache Software Foundation
+
    This product includes software developed by
    The Apache Software Foundation (http://www.apache.org/).
 
    This product includes also software developed by :
      - the W3C consortium (http://www.w3c.org) ,
      - the SAX project (http://www.saxproject.org)
+
+   The &lt;sync&gt; task is based on code Copyright (c) 2002, Landmark
+   Graphics Corp that has been kindly donated to the Apache Software
+   Foundation.
+</diff>
      <filename>ant/NOTICE</filename>
    </modified>
    <modified>
      <diff>@@ -1,18 +1,19 @@
 #! /bin/sh
 
-#   Copyright 2001-2005 The Apache Software Foundation
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the &quot;License&quot;); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
 #
-#   Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-#   you may not use this file except in compliance with the License.
-#   You may obtain a copy of the License at
+#     http://www.apache.org/licenses/LICENSE-2.0
 #
-#       http://www.apache.org/licenses/LICENSE-2.0
-#
-#   Unless required by applicable law or agreed to in writing, software
-#   distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
-#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#   See the License for the specific language governing permissions and
-#   limitations under the License.
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 # Extract launch and ant arguments, (see details below).
 ant_exec_args=
@@ -43,9 +44,11 @@ if $no_config ; then
   rpm_mode=false
   usejikes=$use_jikes_default
 else
-  # load system-wide ant configuration
-  if [ -f &quot;/etc/ant.conf&quot; ] ; then
-    . /etc/ant.conf
+  # load system-wide ant configuration (ONLY if ANT_HOME has NOT been set)
+  if [ -z &quot;$ANT_HOME&quot; -o &quot;$ANT_HOME&quot; = &quot;/usr/share/ant&quot; ]; then
+      if [ -f &quot;/etc/ant.conf&quot; ] ; then
+          . /etc/ant.conf
+      fi
   fi
 
   # load user ant configuration
@@ -121,9 +124,11 @@ ANT_LIB=&quot;${ANT_HOME}/lib&quot;
 
 if [ -z &quot;$JAVACMD&quot; ] ; then
   if [ -n &quot;$JAVA_HOME&quot;  ] ; then
+    # IBM's JDK on AIX uses strange locations for the executables
     if [ -x &quot;$JAVA_HOME/jre/sh/java&quot; ] ; then
-      # IBM's JDK on AIX uses strange locations for the executables
       JAVACMD=&quot;$JAVA_HOME/jre/sh/java&quot;
+    elif [ -x &quot;$JAVA_HOME/jre/bin/java&quot; ] ; then
+      JAVACMD=&quot;$JAVA_HOME/jre/bin/java&quot;
     else
       JAVACMD=&quot;$JAVA_HOME/bin/java&quot;
     fi
@@ -144,12 +149,34 @@ fi
 # Build local classpath using just the launcher in non-rpm mode or
 # use the Jpackage helper in rpm mode with basic and default jars
 # specified in the ant.conf configuration. Because the launcher is
-# used, libraries linked in ANT_HOME will also be include, but this
+# used, libraries linked in ANT_HOME/lib will also be included, but this
 # is discouraged as it is not java-version safe. A user should
 # request optional jars and their dependencies via the OPT_JAR_LIST
 # variable
-if $rpm_mode &amp;&amp; [ -f /usr/bin/build-classpath ] ; then
+if $rpm_mode &amp;&amp; [ -x /usr/bin/build-classpath ] ; then
   LOCALCLASSPATH=&quot;$(/usr/bin/build-classpath ant ant-launcher jaxp_parser_impl xml-commons-apis)&quot;
+
+  # If no optional jars have been specified then build the default list
+  if [ -z &quot;$OPT_JAR_LIST&quot; ] ; then
+    for file in /etc/ant.d/*; do
+      if [ -f &quot;$file&quot; ]; then
+        case &quot;$file&quot; in
+        *~) ;;
+        *#*) ;;
+        *.rpmsave) ;;
+        *.rpmnew) ;;
+        *)
+          for dep in `cat &quot;$file&quot;`; do
+            case &quot;$OPT_JAR_LIST&quot; in
+            *&quot;$dep&quot;*) ;;
+            *) OPT_JAR_LIST=&quot;$OPT_JAR_LIST${OPT_JAR_LIST:+ }$dep&quot;
+            esac
+          done
+        esac
+      fi
+    done
+  fi
+
   # If the user requested to try to add some other jars to the classpath
   if [ -n &quot;$OPT_JAR_LIST&quot; ] ; then
     _OPTCLASSPATH=&quot;$(/usr/bin/build-classpath $OPT_JAR_LIST 2&gt; /dev/null)&quot;</diff>
      <filename>ant/bin/ant</filename>
    </modified>
    <modified>
      <diff>@@ -1,31 +1,61 @@
 @echo off
 
-REM  Copyright 2001,2004-2005 The Apache Software Foundation
-REM
-REM  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
-REM  you may not use this file except in compliance with the License.
-REM  You may obtain a copy of the License at
-REM
+REM  Licensed to the Apache Software Foundation (ASF) under one or more
+REM  contributor license agreements.  See the NOTICE file distributed with
+REM  this work for additional information regarding copyright ownership.
+REM  The ASF licenses this file to You under the Apache License, Version 2.0
+REM  (the &quot;License&quot;); you may not use this file except in compliance with
+REM  the License.  You may obtain a copy of the License at
+REM 
 REM      http://www.apache.org/licenses/LICENSE-2.0
-REM
+REM 
 REM  Unless required by applicable law or agreed to in writing, software
 REM  distributed under the License is distributed on an &quot;AS IS&quot; BASIS,
 REM  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 REM  See the License for the specific language governing permissions and
 REM  limitations under the License.
 
+REM This is an inordinately troublesome piece of code, particularly because it
+REM tries to work on both Win9x and WinNT-based systems. If we could abandon '9x
+REM support, things would be much easier, but sadly, it is not yet time.
+REM Be cautious about editing this, and only add WinNT specific stuff in code that
+REM only runs on WinNT.
+
+if &quot;%HOME%&quot;==&quot;&quot; goto homeDrivePathPre
 if exist &quot;%HOME%\antrc_pre.bat&quot; call &quot;%HOME%\antrc_pre.bat&quot;
 
+:homeDrivePathPre
+if &quot;%HOMEDRIVE%%HOMEPATH%&quot;==&quot;&quot; goto userProfilePre
+if &quot;%HOMEDRIVE%%HOMEPATH%&quot;==&quot;%HOME%&quot; goto userProfilePre
+if exist &quot;%HOMEDRIVE%%HOMEPATH%\antrc_pre.bat&quot; call &quot;%HOMEDRIVE%%HOMEPATH%\antrc_pre.bat&quot;
+
+:userProfilePre
+if &quot;%USERPROFILE%&quot;==&quot;&quot; goto alpha
+if &quot;%USERPROFILE%&quot;==&quot;%HOME%&quot; goto alpha
+if &quot;%USERPROFILE%&quot;==&quot;%HOMEDRIVE%%HOMEPATH%&quot; goto alpha
+if exist &quot;%USERPROFILE%\antrc_pre.bat&quot; call &quot;%USERPROFILE%\antrc_pre.bat&quot;
+
+:alpha
+
 if &quot;%OS%&quot;==&quot;Windows_NT&quot; @setlocal
 if &quot;%OS%&quot;==&quot;WINNT&quot; @setlocal
 
-rem %~dp0 is expanded pathname of the current script under NT
-set DEFAULT_ANT_HOME=%~dp0..
+if &quot;%ANT_HOME%&quot;==&quot;&quot; goto setDefaultAntHome
 
-if &quot;%ANT_HOME%&quot;==&quot;&quot; set ANT_HOME=%DEFAULT_ANT_HOME%
-set DEFAULT_ANT_HOME=
+:stripAntHome
+if not _%ANT_HOME:~-1%==_\ goto checkClasspath
+set ANT_HOME=%ANT_HOME:~0,-1%
+goto stripAntHome
 
+:setDefaultAntHome
+rem %~dp0 is expanded pathname of the current script under NT
+set ANT_HOME=%~dp0..
+
+:checkClasspath
 set _USE_CLASSPATH=yes
+rem CLASSPATH must not be used if it is equal to &quot;&quot;
+if &quot;%CLASSPATH%&quot;==&quot;&quot;&quot;&quot; set _USE_CLASSPATH=no
+if &quot;%CLASSPATH%&quot;==&quot;&quot; set _USE_CLASSPATH=no
 
 rem Slurp the command line arguments. This loop allows for an unlimited number
 rem of arguments (up to the command line limit, anyway).
@@ -49,6 +79,15 @@ rem This label provides a place for the argument list loop to break out
 rem and for NT handling to skip to.
 
 :doneStart
+
+if _USE_CLASSPATH==no goto findAntHome
+
+:stripClasspath
+if not _%CLASSPATH:~-1%==_\ goto findAntHome
+set CLASSPATH=%CLASSPATH:~0,-1%
+goto stripClasspath
+
+:findAntHome
 rem find ANT_HOME if it does not exist due to either an invalid value passed
 rem by the user or the %0 problem on Windows 9x
 if exist &quot;%ANT_HOME%\lib\ant.jar&quot; goto checkJava
@@ -90,43 +129,101 @@ if not &quot;%JIKESPATH%&quot;==&quot;&quot; goto runAntWithJikes
 
 :runAnt
 if &quot;%_USE_CLASSPATH%&quot;==&quot;no&quot; goto runAntNoClasspath
-if not &quot;%CLASSPATH%&quot;==&quot;&quot; goto runAntWithClasspath
-&quot;%_JAVACMD%&quot; %ANT_OPTS% -classpath &quot;%ANT_HOME%\lib\ant-launcher.jar&quot; &quot;-Dant.home=%ANT_HOME%&quot; org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%
+:runAntWithClasspath
+&quot;%_JAVACMD%&quot; %ANT_OPTS% -classpath &quot;%ANT_HOME%\lib\ant-launcher.jar&quot; &quot;-Dant.home=%ANT_HOME%&quot; org.apache.tools.ant.launch.Launcher %ANT_ARGS% -cp &quot;%CLASSPATH%&quot; %ANT_CMD_LINE_ARGS%
+rem Check the error code of the Ant build
+if not &quot;%OS%&quot;==&quot;Windows_NT&quot; goto onError
+set ANT_ERROR=%ERRORLEVEL%
 goto end
 
 :runAntNoClasspath
 &quot;%_JAVACMD%&quot; %ANT_OPTS% -classpath &quot;%ANT_HOME%\lib\ant-launcher.jar&quot; &quot;-Dant.home=%ANT_HOME%&quot; org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%
-goto end
-
-:runAntWithClasspath
-&quot;%_JAVACMD%&quot; %ANT_OPTS% -classpath &quot;%ANT_HOME%\lib\ant-launcher.jar&quot; &quot;-Dant.home=%ANT_HOME%&quot; org.apache.tools.ant.launch.Launcher %ANT_ARGS% -cp &quot;%CLASSPATH%&quot; %ANT_CMD_LINE_ARGS%
+rem Check the error code of the Ant build
+if not &quot;%OS%&quot;==&quot;Windows_NT&quot; goto onError
+set ANT_ERROR=%ERRORLEVEL%
 goto end
 
 :runAntWithJikes
+
+if not _%JIKESPATH:~-1%==_\ goto checkJikesAndClasspath
+set JIKESPATH=%JIKESPATH:~0,-1%
+goto runAntWithJikes
+
+:checkJikesAndClasspath
+
 if &quot;%_USE_CLASSPATH%&quot;==&quot;no&quot; goto runAntWithJikesNoClasspath
-if not &quot;%CLASSPATH%&quot;==&quot;&quot; goto runAntWithJikesAndClasspath
+
+:runAntWithJikesAndClasspath
+&quot;%_JAVACMD%&quot; %ANT_OPTS% -classpath &quot;%ANT_HOME%\lib\ant-launcher.jar&quot; &quot;-Dant.home=%ANT_HOME%&quot; &quot;-Djikes.class.path=%JIKESPATH%&quot; org.apache.tools.ant.launch.Launcher %ANT_ARGS%  -cp &quot;%CLASSPATH%&quot; %ANT_CMD_LINE_ARGS%
+rem Check the error code of the Ant build
+if not &quot;%OS%&quot;==&quot;Windows_NT&quot; goto onError
+set ANT_ERROR=%ERRORLEVEL%
+goto end
 
 :runAntWithJikesNoClasspath
 &quot;%_JAVACMD%&quot; %ANT_OPTS% -classpath &quot;%ANT_HOME%\lib\ant-launcher.jar&quot; &quot;-Dant.home=%ANT_HOME%&quot; &quot;-Djikes.class.path=%JIKESPATH%&quot; org.apache.tools.ant.launch.Launcher %ANT_ARGS% %ANT_CMD_LINE_ARGS%
+rem Check the error code of the Ant build
+if not &quot;%OS%&quot;==&quot;Windows_NT&quot; goto onError
+set ANT_ERROR=%ERRORLEVEL%
 goto end
 
-:runAntWithJikesAndClasspath
-&quot;%_JAVACMD%&quot; %ANT_OPTS% -classpath &quot;%ANT_HOME%\lib\ant-launcher.jar&quot; &quot;-Dant.home=%ANT_HOME%&quot; &quot;-Djikes.class.path=%JIKESPATH%&quot; org.apache.tools.ant.launch.Launcher %ANT_ARGS%  -cp &quot;%CLASSPATH%&quot; %ANT_CMD_LINE_ARGS%
-goto end
+:onError
+rem Windows 9x way of checking the error code.  It matches via brute force.
+for %%i in (1 10 100) do set err%%i=
+for %%i in (0 1 2) do if errorlevel %%i00 set err100=%%i
+if %err100%==2 goto onError200
+if %err100%==0 set err100=
+for %%i in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %err100%%%i0 set err10=%%i
+if &quot;%err100%&quot;==&quot;&quot; if %err10%==0 set err10=
+:onError1
+for %%i in (0 1 2 3 4 5 6 7 8 9) do if errorlevel %err100%%err10%%%i set err1=%%i
+goto onErrorEnd
+:onError200
+for %%i in (0 1 2 3 4 5) do if errorlevel 2%%i0 set err10=%%i
+if err10==5 for %%i in (0 1 2 3 4 5) do if errorlevel 25%%i set err1=%%i
+if not err10==5 goto onError1
+:onErrorEnd
+set ANT_ERROR=%err100%%err10%%err1%
+for %%i in (1 10 100) do set err%%i=
 
 :end
-rem CHANGE: set EXIT_CODE to last ERRORLEVEL
-set EXIT_CODE=%ERRORLEVEL%
-set _JAVACMD=
-set ANT_CMD_LINE_ARGS=
+rem bug ID 32069: resetting an undefined env variable changes the errorlevel.
+if not &quot;%_JAVACMD%&quot;==&quot;&quot; set _JAVACMD=
+if not &quot;%_ANT_CMD_LINE_ARGS%&quot;==&quot;&quot; set ANT_CMD_LINE_ARGS=
+
+if &quot;%ANT_ERROR%&quot;==&quot;0&quot; goto mainEnd
 
+rem Set the return code if we are not in NT.  We can only set
+rem a value of 1, but it's better than nothing.
+if not &quot;%OS%&quot;==&quot;Windows_NT&quot; echo 1 &gt; nul | choice /n /c:1
+
+rem Set the ERRORLEVEL if we are running NT.
+if &quot;%OS%&quot;==&quot;Windows_NT&quot; color 00
+
+exit %ANT_ERROR%
+
+goto omega
+
+:mainEnd
+
+rem If there were no errors, we run the post script.
 if &quot;%OS%&quot;==&quot;Windows_NT&quot; @endlocal
 if &quot;%OS%&quot;==&quot;WINNT&quot; @endlocal
 
-:mainEnd
+if &quot;%HOME%&quot;==&quot;&quot; goto homeDrivePathPost
 if exist &quot;%HOME%\antrc_post.bat&quot; call &quot;%HOME%\antrc_post.bat&quot;
 
-rem CHANGE: Exit with exit code.
-exit %ERRORLEVEL%
+:homeDrivePathPost
+if &quot;%HOMEDRIVE%%HOMEPATH%&quot;==&quot;&quot; goto userProfilePost
+if &quot;%HOMEDRIVE%%HOMEPATH%&quot;==&quot;%HOME%&quot; goto userProfilePost
+if exist &quot;%HOMEDRIVE%%HOMEPATH%\antrc_post.bat&quot; call &quot;%HOMEDRIVE%%HOMEPATH%\antrc_post.bat&quot;
+
+:userProfilePost
+if &quot;%USERPROFILE%&quot;==&quot;&quot; goto omega
+if &quot;%USERPROFILE%&quot;==&quot;%HOME%&quot; goto omega
+if &quot;%USERPROFILE%&quot;==&quot;%HOMEDRIVE%%HOMEPATH%&quot; goto omega
+if exist &quot;%USERPROFILE%\antrc_post.bat&quot; call &quot;%USERPROFILE%\antrc_post.bat&quot;
+
+:omega
 
 rem vim:fileformats=unix,dos:fileformat=dos:ssop-=unix</diff>
      <filename>ant/bin/ant.bat</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>ant/etc/ant-bootstrap.jar</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>ant/lib/ant-contrib.jar</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>ant/lib/ant-launcher.jar</filename>
    </modified>
    <modified>
      <diff></diff>
      <filename>ant/lib/ant.jar</filename>
    </modified>
    <modified>
      <diff>@@ -61,7 +61,7 @@
       &lt;/fileset&gt;
     &lt;/jar&gt;
 
-    &lt;!-- formic windows installer boostrap jar --&gt;
+    &lt;!-- formic windows installer bootstrap jar --&gt;
     &lt;jar jarfile=&quot;build/dist/formic-bootstrap.jar&quot;&gt;
       &lt;manifest&gt;
         &lt;attribute name=&quot;Main-Class&quot;
@@ -70,7 +70,7 @@
       &lt;fileset dir=&quot;build/classes&quot;&gt;
         &lt;include name=&quot;org/formic/bootstrap/**/*.class&quot;/&gt;
         &lt;include name=&quot;org/formic/util/CommandExecutor*.class&quot;/&gt;
-        &lt;include name=&quot;org/formic/dialog/gui/*.class&quot;/&gt;
+        &lt;include name=&quot;org/formic/util/dialog/gui/*.class&quot;/&gt;
       &lt;/fileset&gt;
       &lt;fileset dir=&quot;src/java&quot;&gt;
         &lt;include name=&quot;org/formic/messages.properties*&quot;/&gt;</diff>
      <filename>build.xml</filename>
    </modified>
    <modified>
      <diff>@@ -1,8 +1,5 @@
 TODO {{{
 
-  Upgrade
-    - ant from 1.6.5 to 1.7.0
-
   Panels
     - Proxy setup
     - Feature Tree
@@ -35,7 +32,7 @@ TODO {{{
 
   Uninstaller
     - uninstall wizard panels
-      Abstract InstallStep to provided shared functionality.
+      Abstract InstallStep to provide shared functionality.
     - create exe/sh at installer build time and have install procedure populate
       an ini or property file that the uninstaller can use for info it needs
       (install location, product name, service info, etc).</diff>
      <filename>notes.txt</filename>
    </modified>
    <modified>
      <diff>@@ -17,7 +17,7 @@ Third Party Open Source Code in Formic CVS
       an install, several parts of the code have been patched to facilitate the
       required monitoring.
 
-  - charva: 1.1.2
+  - charva: 1.1.4
     - Implementing necessary gabs between charva and swing that are needed to
       build robust console based interfaces.  I plan to contribute these
       upstream periodically and hopefully remove the code out of the formic cvs</diff>
      <filename>src/java/README</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,10 @@
 /*
- * Copyright  2000-2005 The Apache Software Foundation
- *
- *  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the &quot;License&quot;); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -31,13 +32,13 @@ import java.util.HashSet;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.BuildListener;
 import org.apache.tools.ant.DefaultLogger;
-import org.apache.tools.ant.Executor;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.ProjectComponent;
 import org.apache.tools.ant.ProjectHelper;
 import org.apache.tools.ant.Target;
 import org.apache.tools.ant.Task;
-import org.apache.tools.ant.helper.SingleCheckExecutor;
+import org.apache.tools.ant.MagicNames;
+import org.apache.tools.ant.Main;
 import org.apache.tools.ant.types.PropertySet;
 import org.apache.tools.ant.util.FileUtils;
 
@@ -64,6 +65,8 @@ import org.apache.tools.ant.util.FileUtils;
  */
 public class Ant extends Task {
 
+    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
+
     /** the basedir where is executed the build file */
     private File dir = null;
 
@@ -74,7 +77,7 @@ public class Ant extends Task {
     private String antFile = null;
 
     /** the output */
-    private String output  = null;
+    private String output = null;
 
     /** should we inherit properties from the parent ? */
     private boolean inheritAll = true;
@@ -109,6 +112,22 @@ public class Ant extends Task {
     private boolean targetAttributeSet = false;
 
     /**
+     * simple constructor
+     */
+    public Ant() {
+        //default
+    }
+
+    /**
+     * create a task bound to its creator
+     * @param owner owning task
+     */
+    public Ant(Task owner) {
+        bindToOwner(owner);
+    }
+
+
+    /**
      * If true, pass all properties to the new Ant project.
      * Defaults to true.
      * @param value if true pass all properties to the new Ant project.
@@ -130,13 +149,13 @@ public class Ant extends Task {
      * Creates a Project instance for the project to call.
      */
     public void init() {
-        newProject = new Project();
-        newProject.setDefaultInputStream(getProject().getDefaultInputStream());
+        newProject = getProject().createSubProject();
         newProject.setJavaVersionProperty();
     }
 
     /**
-     * Called in execute or createProperty if newProject is null.
+     * Called in execute or createProperty (via getNewProject())
+     * if newProject is null.
      *
      * &lt;p&gt;This can happen if the same instance of this task is run
      * twice as newProject is set to null at the end of execute (to
@@ -166,7 +185,7 @@ public class Ant extends Task {
         if (output != null) {
             File outfile = null;
             if (dir != null) {
-                outfile = FileUtils.newFileUtils().resolveFile(dir, output);
+                outfile = FILE_UTILS.resolveFile(dir, output);
             } else {
                 outfile = getProject().resolveFile(output);
             }
@@ -181,9 +200,6 @@ public class Ant extends Task {
                 log(&quot;Ant: Can't set output to &quot; + output);
             }
         }
-
-        getProject().initSubProject(newProject);
-
         // set user-defined properties
         getProject().copyUserProperties(newProject);
 
@@ -205,68 +221,89 @@ public class Ant extends Task {
     }
 
     /**
+     * Handles output.
+     * Send it the the new project if is present, otherwise
+     * call the super class.
+     * @param outputToHandle The string output to output.
      * @see Task#handleOutput(String)
-     *
      * @since Ant 1.5
      */
-    public void handleOutput(String output) {
+    public void handleOutput(String outputToHandle) {
         if (newProject != null) {
-            newProject.demuxOutput(output, false);
+            newProject.demuxOutput(outputToHandle, false);
         } else {
-            super.handleOutput(output);
+            super.handleOutput(outputToHandle);
         }
     }
 
     /**
-     * @see Task#handleInput(byte[], int, int)
+     * Handles input.
+     * Deleate to the created project, if present, otherwise
+     * call the super class.
+     * @param buffer the buffer into which data is to be read.
+     * @param offset the offset into the buffer at which data is stored.
+     * @param length the amount of data to read.
      *
+     * @return the number of bytes read.
+     *
+     * @exception IOException if the data cannot be read.
+     * @see Task#handleInput(byte[], int, int)
      * @since Ant 1.6
      */
     public int handleInput(byte[] buffer, int offset, int length)
         throws IOException {
         if (newProject != null) {
             return newProject.demuxInput(buffer, offset, length);
-        } else {
-            return super.handleInput(buffer, offset, length);
         }
+        return super.handleInput(buffer, offset, length);
     }
 
     /**
+     * Handles output.
+     * Send it the the new project if is present, otherwise
+     * call the super class.
+     * @param toFlush The string to output.
      * @see Task#handleFlush(String)
-     *
      * @since Ant 1.5.2
      */
-    public void handleFlush(String output) {
+    public void handleFlush(String toFlush) {
         if (newProject != null) {
-            newProject.demuxFlush(output, false);
+            newProject.demuxFlush(toFlush, false);
         } else {
-            super.handleFlush(output);
+            super.handleFlush(toFlush);
         }
     }
 
     /**
-     * @see Task#handleErrorOutput(String)
+     * Handle error output.
+     * Send it the the new project if is present, otherwise
+     * call the super class.
+     * @param errorOutputToHandle The string to output.
      *
+     * @see Task#handleErrorOutput(String)
      * @since Ant 1.5
      */
-    public void handleErrorOutput(String output) {
+    public void handleErrorOutput(String errorOutputToHandle) {
         if (newProject != null) {
-            newProject.demuxOutput(output, true);
+            newProject.demuxOutput(errorOutputToHandle, true);
         } else {
-            super.handleErrorOutput(output);
+            super.handleErrorOutput(errorOutputToHandle);
         }
     }
 
     /**
+     * Handle error output.
+     * Send it the the new project if is present, otherwise
+     * call the super class.
+     * @param errorOutputToFlush The string to output.
      * @see Task#handleErrorFlush(String)
-     *
      * @since Ant 1.5.2
      */
-    public void handleErrorFlush(String output) {
+    public void handleErrorFlush(String errorOutputToFlush) {
         if (newProject != null) {
-            newProject.demuxFlush(output, true);
+            newProject.demuxFlush(errorOutputToFlush, true);
         } else {
-            super.handleErrorFlush(output);
+            super.handleErrorFlush(errorOutputToFlush);
         }
     }
 
@@ -286,11 +323,9 @@ public class Ant extends Task {
 // NEW
             initialize();
 /* OLD
-            if (newProject == null) {
-                reinit();
-            }
+            getNewProject();
 
-            if ((dir == null) &amp;&amp; (inheritAll)) {
+            if (dir == null &amp;&amp; inheritAll) {
                 dir = getProject().getBaseDir();
             }
 
@@ -300,7 +335,7 @@ public class Ant extends Task {
                 newProject.setBaseDir(dir);
                 if (savedDir != null) {
                     // has been set explicitly
-                    newProject.setInheritedProperty(&quot;basedir&quot; ,
+                    newProject.setInheritedProperty(MagicNames.PROJECT_BASEDIR,
                                                     dir.getAbsolutePath());
                 }
             } else {
@@ -310,39 +345,37 @@ public class Ant extends Task {
             overrideProperties();
 
             if (antFile == null) {
-                antFile = &quot;build.xml&quot;;
+                antFile = Main.DEFAULT_BUILD_FILENAME;
             }
 
-            File file = FileUtils.newFileUtils().resolveFile(dir, antFile);
+            File file = FILE_UTILS.resolveFile(dir, antFile);
             antFile = file.getAbsolutePath();
 
             log(&quot;calling target(s) &quot;
                 + ((locals.size() &gt; 0) ? locals.toString() : &quot;[default]&quot;)
                 + &quot; in build file &quot; + antFile, Project.MSG_VERBOSE);
-            newProject.setUserProperty(&quot;ant.file&quot; , antFile);
+            newProject.setUserProperty(MagicNames.ANT_FILE , antFile);
 
-            String thisAntFile = getProject().getProperty(&quot;ant.file&quot;);
+            String thisAntFile = getProject().getProperty(MagicNames.ANT_FILE);
             // Are we trying to call the target in which we are defined (or
             // the build file if this is a top level task)?
             if (thisAntFile != null
-                &amp;&amp; newProject.resolveFile(newProject.getProperty(&quot;ant.file&quot;))
-                .equals(getProject().resolveFile(thisAntFile))
+                &amp;&amp; file.equals(getProject().resolveFile(thisAntFile))
                 &amp;&amp; getOwningTarget() != null) {
 
                 if (getOwningTarget().getName().equals(&quot;&quot;)) {
                     if (getTaskName().equals(&quot;antcall&quot;)) {
                         throw new BuildException(&quot;antcall must not be used at&quot;
                                                  + &quot; the top level.&quot;);
-                    } else {
-                        throw new BuildException(getTaskName() + &quot; task at the&quot;
-                                                 + &quot; top level must not invoke&quot;
-                                                 + &quot; its own build file.&quot;);
                     }
+                    throw new BuildException(getTaskName() + &quot; task at the&quot;
+                                + &quot; top level must not invoke&quot;
+                                + &quot; its own build file.&quot;);
                 }
             }
 
             try {
-                ProjectHelper.configureProject(newProject, new File(antFile));
+                ProjectHelper.configureProject(newProject, file);
             } catch (BuildException ex) {
                 throw ProjectHelper.addLocationToBuildException(
                     ex, getLocation());
@@ -355,8 +388,8 @@ public class Ant extends Task {
                 }
             }
 
-            if (newProject.getProperty(&quot;ant.file&quot;)
-                .equals(getProject().getProperty(&quot;ant.file&quot;))
+            if (newProject.getProperty(MagicNames.ANT_FILE)
+                .equals(getProject().getProperty(MagicNames.ANT_FILE))
                 &amp;&amp; getOwningTarget() != null) {
 
                 String owningTargetName = getOwningTarget().getName();
@@ -364,22 +397,22 @@ public class Ant extends Task {
                 if (locals.contains(owningTargetName)) {
                     throw new BuildException(getTaskName() + &quot; task calling &quot;
                                              + &quot;its own parent target.&quot;);
-                } else {
-                    boolean circular = false;
-                    for (Iterator it = locals.iterator(); !circular &amp;&amp; it.hasNext();) {
-                        Target other = (Target) (getProject().getTargets().get(
-                            (String) (it.next())));
-                        circular |= (other != null
-                            &amp;&amp; other.dependsOn(owningTargetName));
-                    }
-                    if (circular) {
-                        throw new BuildException(getTaskName()
-                                                 + &quot; task calling a target&quot;
-                                                 + &quot; that depends on&quot;
-                                                 + &quot; its parent target \'&quot;
-                                                 + owningTargetName
-                                                 + &quot;\'.&quot;);
-                    }
+                }
+                boolean circular = false;
+                for (Iterator it = locals.iterator();
+                     !circular &amp;&amp; it.hasNext();) {
+                    Target other =
+                        (Target) (getProject().getTargets().get(it.next()));
+                    circular |= (other != null
+                                 &amp;&amp; other.dependsOn(owningTargetName));
+                }
+                if (circular) {
+                    throw new BuildException(getTaskName()
+                                             + &quot; task calling a target&quot;
+                                             + &quot; that depends on&quot;
+                                             + &quot; its parent target \'&quot;
+                                             + owningTargetName
+                                             + &quot;\'.&quot;);
                 }
             }
 
@@ -388,35 +421,37 @@ public class Ant extends Task {
 
 // CHANGE (use 'targets' instead of 'locals')
 // NEW
-            if (targets.size() &gt; 0 &amp;&amp; !(targets.size() == 1 &amp;&amp; targets.get(0) == &quot;&quot;)) {
-                Throwable t = null;
+            if (targets.size() &gt; 0 &amp;&amp; !(targets.size() == 1
+                                       &amp;&amp; &quot;&quot;.equals(targets.get(0)))) {
+                BuildException be = null;
                 try {
                     log(&quot;Entering &quot; + antFile + &quot;...&quot;, Project.MSG_VERBOSE);
                     newProject.fireSubBuildStarted();
                     newProject.executeTargets(targets);
                 } catch (BuildException ex) {
-                    t = ProjectHelper
+                    be = ProjectHelper
                         .addLocationToBuildException(ex, getLocation());
-                    throw (BuildException) t;
+                    throw be;
                 } finally {
                     log(&quot;Exiting &quot; + antFile + &quot;.&quot;, Project.MSG_VERBOSE);
-                    newProject.fireSubBuildFinished(t);
+                    newProject.fireSubBuildFinished(be);
                 }
             }
 /* OLD
-            if (locals.size() &gt; 0 &amp;&amp; !(locals.size() == 1 &amp;&amp; locals.get(0) == &quot;&quot;)) {
-                Throwable t = null;
+            if (locals.size() &gt; 0 &amp;&amp; !(locals.size() == 1
+                                       &amp;&amp; &quot;&quot;.equals(locals.get(0)))) {
+                BuildException be = null;
                 try {
                     log(&quot;Entering &quot; + antFile + &quot;...&quot;, Project.MSG_VERBOSE);
                     newProject.fireSubBuildStarted();
                     newProject.executeTargets(locals);
                 } catch (BuildException ex) {
-                    t = ProjectHelper
+                    be = ProjectHelper
                         .addLocationToBuildException(ex, getLocation());
-                    throw (BuildException) t;
+                    throw be;
                 } finally {
                     log(&quot;Exiting &quot; + antFile + &quot;.&quot;, Project.MSG_VERBOSE);
-                    newProject.fireSubBuildFinished(t);
+                    newProject.fireSubBuildFinished(be);
                 }
             }
 // END CHANGE */
@@ -514,6 +549,7 @@ public class Ant extends Task {
                     continue;
                 }
                 copyReference(key, key);
+                newProject.inheritIDReferences(getProject());
             }
         }
     }
@@ -574,14 +610,15 @@ public class Ant extends Task {
      * Copies all properties from the given table to the new project -
      * omitting those that have already been set in the new project as
      * well as properties named basedir or ant.file.
-     * @param props properties &lt;code&gt;Hashtable&lt;/code&gt; to copy to the new project.
+     * @param props properties &lt;code&gt;Hashtable&lt;/code&gt; to copy to the
+     * new project.
      * @since Ant 1.6
      */
     private void addAlmostAll(Hashtable props) {
         Enumeration e = props.keys();
         while (e.hasMoreElements()) {
             String key = e.nextElement().toString();
-            if (&quot;basedir&quot;.equals(key) || &quot;ant.file&quot;.equals(key)) {
+            if (MagicNames.PROJECT_BASEDIR.equals(key) || MagicNames.ANT_FILE.equals(key)) {
                 // basedir and ant.file get special treatment in execute()
                 continue;
             }
@@ -600,34 +637,34 @@ public class Ant extends Task {
      * Defaults to the current project's basedir, unless inheritall
      * has been set to false, in which case it doesn't have a default
      * value. This will override the basedir setting of the called project.
-     * @param d new directory as &lt;code&gt;File&lt;/code&gt;.
+     * @param dir new directory as &lt;code&gt;File&lt;/code&gt;.
      */
-    public void setDir(File d) {
-        this.dir = d;
+    public void setDir(File dir) {
+        this.dir = dir;
     }
 
     /**
      * The build file to use. Defaults to &quot;build.xml&quot;. This file is expected
      * to be a filename relative to the dir attribute given.
-     * @param s the &lt;code&gt;String&lt;/code&gt; build file name.
+     * @param antFile the &lt;code&gt;String&lt;/code&gt; build file name.
      */
-    public void setAntfile(String s) {
+    public void setAntfile(String antFile) {
         // @note: it is a string and not a file to handle relative/absolute
         // otherwise a relative file will be resolved based on the current
         // basedir.
-        this.antFile = s;
+        this.antFile = antFile;
     }
 
     /**
      * The target of the new Ant project to execute.
      * Defaults to the new project's default target.
-     * @param s the name of the target to invoke.
+     * @param targetToAdd the name of the target to invoke.
      */
-    public void setTarget(String s) {
-        if (s.equals(&quot;&quot;)) {
+    public void setTarget(String targetToAdd) {
+        if (targetToAdd.equals(&quot;&quot;)) {
             throw new BuildException(&quot;target attribute must not be empty&quot;);
         }
-        targets.add(s);
+        targets.add(targetToAdd);
         targetAttributeSet = true;
     }
 
@@ -635,10 +672,10 @@ public class Ant extends Task {
      * Set the filename to write the output to. This is relative to the value
      * of the dir attribute if it has been set or to the base directory of the
      * current project otherwise.
-     * @param s the name of the file to which the output should go.
+     * @param outputFile the name of the file to which the output should go.
      */
-    public void setOutput(String s) {
-        this.output = s;
+    public void setOutput(String outputFile) {
+        this.output = outputFile;
     }
 
     /**
@@ -647,11 +684,8 @@ public class Ant extends Task {
      * @return the created &lt;code&gt;Property&lt;/code&gt; object.
      */
     public Property createProperty() {
-        if (newProject == null) {
-            reinit();
-        }
         Property p = new Property(true, getProject());
-        p.setProject(newProject);
+        p.setProject(getNewProject());
         p.setTaskName(&quot;property&quot;);
         properties.addElement(p);
         return p;
@@ -660,15 +694,15 @@ public class Ant extends Task {
     /**
      * Add a Reference element identifying a data type to carry
      * over to the new project.
-     * @param r &lt;code&gt;Reference&lt;/code&gt; to add.
+     * @param ref &lt;code&gt;Reference&lt;/code&gt; to add.
      */
-    public void addReference(Reference r) {
-        references.addElement(r);
+    public void addReference(Reference ref) {
+        references.addElement(ref);
     }
 
     /**
      * Add a target to this Ant invocation.
-     * @param t the &lt;CODE&gt;TargetElement&lt;/CODE&gt; to add.
+     * @param t the &lt;code&gt;TargetElement&lt;/code&gt; to add.
      * @since Ant 1.6.3
      */
     public void addConfiguredTarget(TargetElement t) {
@@ -693,6 +727,18 @@ public class Ant extends Task {
         propertySets.addElement(ps);
     }
 
+    /*
+     * Get the (sub)-Project instance currently in use.
+     * @return Project
+     * @since Ant 1.7
+     */
+    protected Project getNewProject() {
+        if (newProject == null) {
+            reinit();
+        }
+        return newProject;
+    }
+
     /**
      * @since Ant 1.6.2
      */
@@ -731,11 +777,9 @@ public class Ant extends Task {
       String savedAntFile = antFile;
       if(!newProjectInitialized){
         Vector locals = new Vector(targets);
-        if (newProject == null) {
-            reinit();
-        }
+        getNewProject();
 
-        if ((dir == null) &amp;&amp; (inheritAll)) {
+        if (dir == null &amp;&amp; inheritAll) {
             dir = getProject().getBaseDir();
         }
 
@@ -745,7 +789,7 @@ public class Ant extends Task {
             newProject.setBaseDir(dir);
             if (savedDir != null) {
                 // has been set explicitly
-                newProject.setInheritedProperty(&quot;basedir&quot; ,
+                newProject.setInheritedProperty(MagicNames.PROJECT_BASEDIR,
                                                 dir.getAbsolutePath());
             }
         } else {
@@ -755,39 +799,37 @@ public class Ant extends Task {
         overrideProperties();
 
         if (antFile == null) {
-            antFile = &quot;build.xml&quot;;
+            antFile = Main.DEFAULT_BUILD_FILENAME;
         }
 
-        File file = FileUtils.newFileUtils().resolveFile(dir, antFile);
+        File file = FILE_UTILS.resolveFile(dir, antFile);
         antFile = file.getAbsolutePath();
 
         log(&quot;calling target(s) &quot;
             + ((locals.size() &gt; 0) ? locals.toString() : &quot;[default]&quot;)
             + &quot; in build file &quot; + antFile, Project.MSG_VERBOSE);
-        newProject.setUserProperty(&quot;ant.file&quot; , antFile);
+        newProject.setUserProperty(MagicNames.ANT_FILE , antFile);
 
-        String thisAntFile = getProject().getProperty(&quot;ant.file&quot;);
+        String thisAntFile = getProject().getProperty(MagicNames.ANT_FILE);
         // Are we trying to call the target in which we are defined (or
         // the build file if this is a top level task)?
         if (thisAntFile != null
-            &amp;&amp; newProject.resolveFile(newProject.getProperty(&quot;ant.file&quot;))
-            .equals(getProject().resolveFile(thisAntFile))
+            &amp;&amp; file.equals(getProject().resolveFile(thisAntFile))
             &amp;&amp; getOwningTarget() != null) {
 
             if (getOwningTarget().getName().equals(&quot;&quot;)) {
                 if (getTaskName().equals(&quot;antcall&quot;)) {
                     throw new BuildException(&quot;antcall must not be used at&quot;
                                              + &quot; the top level.&quot;);
-                } else {
-                    throw new BuildException(getTaskName() + &quot; task at the&quot;
-                                             + &quot; top level must not invoke&quot;
-                                             + &quot; its own build file.&quot;);
                 }
+                throw new BuildException(getTaskName() + &quot; task at the&quot;
+                            + &quot; top level must not invoke&quot;
+                            + &quot; its own build file.&quot;);
             }
         }
 
         try {
-            ProjectHelper.configureProject(newProject, new File(antFile));
+            ProjectHelper.configureProject(newProject, file);
         } catch (BuildException ex) {
             throw ProjectHelper.addLocationToBuildException(
                 ex, getLocation());
@@ -800,8 +842,8 @@ public class Ant extends Task {
             }
         }
 
-        if (newProject.getProperty(&quot;ant.file&quot;)
-            .equals(getProject().getProperty(&quot;ant.file&quot;))
+        if (newProject.getProperty(MagicNames.ANT_FILE)
+            .equals(getProject().getProperty(MagicNames.ANT_FILE))
             &amp;&amp; getOwningTarget() != null) {
 
             String owningTargetName = getOwningTarget().getName();
@@ -809,22 +851,22 @@ public class Ant extends Task {
             if (locals.contains(owningTargetName)) {
                 throw new BuildException(getTaskName() + &quot; task calling &quot;
                                          + &quot;its own parent target.&quot;);
-            } else {
-                boolean circular = false;
-                for (Iterator it = locals.iterator(); !circular &amp;&amp; it.hasNext();) {
-                    Target other = (Target) (getProject().getTargets().get(
-                        (String) (it.next())));
-                    circular |= (other != null
-                        &amp;&amp; other.dependsOn(owningTargetName));
-                }
-                if (circular) {
-                    throw new BuildException(getTaskName()
-                                             + &quot; task calling a target&quot;
-                                             + &quot; that depends on&quot;
-                                             + &quot; its parent target \'&quot;
-                                             + owningTargetName
-                                             + &quot;\'.&quot;);
-                }
+            }
+            boolean circular = false;
+            for (Iterator it = locals.iterator();
+                 !circular &amp;&amp; it.hasNext();) {
+                Target other =
+                    (Target) (getProject().getTargets().get(it.next()));
+                circular |= (other != null
+                             &amp;&amp; other.dependsOn(owningTargetName));
+            }
+            if (circular) {
+                throw new BuildException(getTaskName()
+                                         + &quot; task calling a target&quot;
+                                         + &quot; that depends on&quot;
+                                         + &quot; its parent target \'&quot;
+                                         + owningTargetName
+                                         + &quot;\'.&quot;);
             }
         }
 
@@ -847,7 +889,7 @@ public class Ant extends Task {
 
         /** Creates a reference to be configured by Ant. */
         public Reference() {
-            super();
+                super();
         }
 
         private String targetid = null;
@@ -885,11 +927,12 @@ public class Ant extends Task {
          * Default constructor.
          */
         public TargetElement() {
+                //default
         }
 
         /**
          * Set the name of this TargetElement.
-         * @param name   the &lt;CODE&gt;String&lt;/CODE&gt; target name.
+         * @param name   the &lt;code&gt;String&lt;/code&gt; target name.
          */
         public void setName(String name) {
             this.name = name;
@@ -897,7 +940,7 @@ public class Ant extends Task {
 
         /**
          * Get the name of this TargetElement.
-         * @return &lt;CODE&gt;String&lt;/CODE&gt;.
+         * @return &lt;code&gt;String&lt;/code&gt;.
          */
         public String getName() {
             return name;</diff>
      <filename>src/java/org/apache/tools/ant/taskdefs/Ant.java</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,10 @@
 /*
- * Copyright  2000-2004 The Apache Software Foundation
- *
- *  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the &quot;License&quot;); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -82,10 +83,7 @@ public class CallTarget extends Task {
      * configuring it by calling its own init method.
      */
     public void init() {
-        callee = (Ant) getProject().createTask(&quot;ant&quot;);
-        callee.setOwningTarget(getOwningTarget());
-        callee.setTaskName(getTaskName());
-        callee.setLocation(getLocation());
+        callee = new Ant(this);
         callee.init();
 // CHANGE
         callee.setAntfile(getProject().getProperty(&quot;ant.file&quot;));
@@ -201,8 +199,11 @@ public class CallTarget extends Task {
 // END CHANGE
 
     /**
+     * Handles output.
+     * Send it the the new project if is present, otherwise
+     * call the super class.
+     * @param output The string output to output.
      * @see Task#handleOutput(String)
-     *
      * @since Ant 1.5
      */
     public void handleOutput(String output) {
@@ -214,22 +215,33 @@ public class CallTarget extends Task {
     }
 
     /**
-     * @see Task#handleInput(byte[], int, int)
+     * Handles input.
+     * Deleate to the created project, if present, otherwise
+     * call the super class.
+     * @param buffer the buffer into which data is to be read.
+     * @param offset the offset into the buffer at which data is stored.
+     * @param length the amount of data to read.
      *
+     * @return the number of bytes read.
+     *
+     * @exception IOException if the data cannot be read.
+     * @see Task#handleInput(byte[], int, int)
      * @since Ant 1.6
      */
     public int handleInput(byte[] buffer, int offset, int length)
         throws IOException {
         if (callee != null) {
             return callee.handleInput(buffer, offset, length);
-        } else {
-            return super.handleInput(buffer, offset, length);
         }
+        return super.handleInput(buffer, offset, length);
     }
 
     /**
+     * Handles output.
+     * Send it the the new project if is present, otherwise
+     * call the super class.
+     * @param output The string to output.
      * @see Task#handleFlush(String)
-     *
      * @since Ant 1.5.2
      */
     public void handleFlush(String output) {
@@ -241,8 +253,12 @@ public class CallTarget extends Task {
     }
 
     /**
-     * @see Task#handleErrorOutput(String)
+     * Handle error output.
+     * Send it the the new project if is present, otherwise
+     * call the super class.
+     * @param output The string to output.
      *
+     * @see Task#handleErrorOutput(String)
      * @since Ant 1.5
      */
     public void handleErrorOutput(String output) {
@@ -254,8 +270,11 @@ public class CallTarget extends Task {
     }
 
     /**
+     * Handle error output.
+     * Send it the the new project if is present, otherwise
+     * call the super class.
+     * @param output The string to output.
      * @see Task#handleErrorFlush(String)
-     *
      * @since Ant 1.5.2
      */
     public void handleErrorFlush(String output) {</diff>
      <filename>src/java/org/apache/tools/ant/taskdefs/CallTarget.java</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,10 @@
 /*
- * Copyright  2000-2004 The Apache Software Foundation
- *
- *  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the &quot;License&quot;); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -19,25 +20,35 @@ package org.apache.tools.ant.taskdefs;
 
 import java.io.BufferedOutputStream;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Vector;
 import java.util.zip.GZIPOutputStream;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.DirectoryScanner;
 import org.apache.tools.ant.Project;
+import org.apache.tools.ant.types.ArchiveFileSet;
 import org.apache.tools.ant.types.EnumeratedAttribute;
 import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Resource;
+import org.apache.tools.ant.types.ResourceCollection;
+import org.apache.tools.ant.types.resources.ArchiveResource;
+import org.apache.tools.ant.types.resources.FileResource;
+import org.apache.tools.ant.types.selectors.SelectorUtils;
+import org.apache.tools.ant.types.resources.TarResource;
+import org.apache.tools.ant.util.FileUtils;
 import org.apache.tools.ant.util.MergingMapper;
 import org.apache.tools.ant.util.SourceFileScanner;
 import org.apache.tools.bzip2.CBZip2OutputStream;
 import org.apache.tools.tar.TarConstants;
 import org.apache.tools.tar.TarEntry;
 import org.apache.tools.tar.TarOutputStream;
-import org.apache.tools.zip.UnixStat;
 
 /**
  * Creates a tar archive.
@@ -49,39 +60,52 @@ import org.apache.tools.zip.UnixStat;
 public class Tar extends MatchingTask {
 
     /**
-     * @deprecated Tar.WARN is deprecated and is replaced with
+     * @deprecated since 1.5.x.
+     *             Tar.WARN is deprecated and is replaced with
      *             Tar.TarLongFileMode.WARN
      */
     public static final String WARN = &quot;warn&quot;;
     /**
-     * @deprecated Tar.FAIL is deprecated and is replaced with
+     * @deprecated since 1.5.x.
+     *             Tar.FAIL is deprecated and is replaced with
      *             Tar.TarLongFileMode.FAIL
      */
     public static final String FAIL = &quot;fail&quot;;
     /**
-     * @deprecated Tar.TRUNCATE is deprecated and is replaced with
+     * @deprecated since 1.5.x.
+     *             Tar.TRUNCATE is deprecated and is replaced with
      *             Tar.TarLongFileMode.TRUNCATE
      */
     public static final String TRUNCATE = &quot;truncate&quot;;
     /**
-     * @deprecated Tar.GNU is deprecated and is replaced with
+     * @deprecated since 1.5.x.
+     *             Tar.GNU is deprecated and is replaced with
      *             Tar.TarLongFileMode.GNU
      */
     public static final String GNU = &quot;gnu&quot;;
     /**
-     * @deprecated Tar.OMIT is deprecated and is replaced with
+     * @deprecated since 1.5.x.
+     *             Tar.OMIT is deprecated and is replaced with
      *             Tar.TarLongFileMode.OMIT
      */
     public static final String OMIT = &quot;omit&quot;;
 
+    // CheckStyle:VisibilityModifier OFF - bc
     File tarFile;
     File baseDir;
 
     private TarLongFileMode longFileMode = new TarLongFileMode();
 
+    // need to keep the package private version for backwards compatibility
     Vector filesets = new Vector();
+    // we must keep two lists since other classes may modify the
+    // filesets Vector (it is package private) without us noticing
+    private Vector resourceCollections = new Vector();
+
     Vector fileSetFiles = new Vector();
 
+    // CheckStyle:VisibilityModifier ON
+
     /**
      * Indicates whether the user has been warned about long files already.
      */
@@ -100,16 +124,26 @@ public class Tar extends MatchingTask {
      * @return the tar fileset to be used as the nested element.
      */
     public TarFileSet createTarFileSet() {
-        TarFileSet fileset = new TarFileSet();
-        filesets.addElement(fileset);
-        return fileset;
+        TarFileSet fs = new TarFileSet();
+        fs.setProject(getProject());
+        filesets.addElement(fs);
+        return fs;
     }
 
+    /**
+     * Add a collection of resources to archive.
+     * @param res a resource collection to archive.
+     * @since Ant 1.7
+     */
+    public void add(ResourceCollection res) {
+        resourceCollections.add(res);
+    }
 
     /**
      * Set is the name/location of where to create the tar file.
      * @param tarFile the location of the tar file.
-     * @deprecated for consistency with other tasks, please use setDestFile()
+     * @deprecated since 1.5.x.
+     *             For consistency with other tasks, please use setDestFile().
      */
     public void setTarfile(File tarFile) {
         this.tarFile = tarFile;
@@ -145,7 +179,8 @@ public class Tar extends MatchingTask {
      * &lt;li&gt;  omit - paths greater than the maximum are omitted from the archive
      * &lt;/ul&gt;
      * @param mode the mode string to handle long files.
-     * @deprecated setLongFile(String) is deprecated and is replaced with
+     * @deprecated since 1.5.x.
+     *             setLongFile(String) is deprecated and is replaced with
      *             setLongFile(Tar.TarLongFileMode) to make Ant's Introspection
      *             mechanism do the work and also to encapsulate operations on
      *             the mode in its own class.
@@ -223,9 +258,10 @@ public class Tar extends MatchingTask {
                 filesets.addElement(mainFileSet);
             }
 
-            if (filesets.size() == 0) {
+            if (filesets.size() == 0 &amp;&amp; resourceCollections.size() == 0) {
                 throw new BuildException(&quot;You must supply either a basedir &quot;
-                                         + &quot;attribute or some nested filesets.&quot;,
+                                         + &quot;attribute or some nested resource&quot;
+                                         + &quot; collections.&quot;,
                                          getLocation());
             }
 
@@ -233,20 +269,11 @@ public class Tar extends MatchingTask {
             // fileset
             boolean upToDate = true;
             for (Enumeration e = filesets.elements(); e.hasMoreElements();) {
-                TarFileSet fs = (TarFileSet) e.nextElement();
-                String[] files = fs.getFiles(getProject());
-
-                if (!archiveIsUpToDate(files, fs.getDir(getProject()))) {
-                    upToDate = false;
-                }
-
-                for (int i = 0; i &lt; files.length; ++i) {
-                    if (tarFile.equals(new File(fs.getDir(getProject()),
-                                                files[i]))) {
-                        throw new BuildException(&quot;A tar file cannot include &quot;
-                                                 + &quot;itself&quot;, getLocation());
-                    }
-                }
+                upToDate &amp;= check((TarFileSet) e.nextElement());
+            }
+            for (Enumeration e = resourceCollections.elements();
+                 e.hasMoreElements();) {
+                upToDate &amp;= check((ResourceCollection) e.nextElement());
             }
 
             if (upToDate) {
@@ -277,32 +304,17 @@ public class Tar extends MatchingTask {
                 longWarningGiven = false;
                 for (Enumeration e = filesets.elements();
                      e.hasMoreElements();) {
-                    TarFileSet fs = (TarFileSet) e.nextElement();
-                    String[] files = fs.getFiles(getProject());
-                    if (files.length &gt; 1 &amp;&amp; fs.getFullpath().length() &gt; 0) {
-                        throw new BuildException(&quot;fullpath attribute may only &quot;
-                                                 + &quot;be specified for &quot;
-                                                 + &quot;filesets that specify a &quot;
-                                                 + &quot;single file.&quot;);
-                    }
-                    for (int i = 0; i &lt; files.length; i++) {
-                        File f = new File(fs.getDir(getProject()), files[i]);
-                        String name = files[i].replace(File.separatorChar, '/');
-                        tarFile(f, tOut, name, fs);
-                    }
+                    tar((TarFileSet) e.nextElement(), tOut);
+                }
+                for (Enumeration e = resourceCollections.elements();
+                     e.hasMoreElements();) {
+                    tar((ResourceCollection) e.nextElement(), tOut);
                 }
             } catch (IOException ioe) {
                 String msg = &quot;Problem creating TAR: &quot; + ioe.getMessage();
                 throw new BuildException(msg, ioe, getLocation());
             } finally {
-                if (tOut != null) {
-                    try {
-                        // close up
-                        tOut.close();
-                    } catch (IOException e) {
-                        // ignore
-                    }
-                }
+                FileUtils.close(tOut);
             }
         } finally {
             filesets = savedFileSets;
@@ -320,91 +332,157 @@ public class Tar extends MatchingTask {
     protected void tarFile(File file, TarOutputStream tOut, String vPath,
                            TarFileSet tarFileSet)
         throws IOException {
-        FileInputStream fIn = null;
+        if (file.equals(tarFile)) {
+            // If the archive is built for the first time and it is
+            // matched by a resource collection, then it hasn't been
+            // found in check (it hasn't been there) but will be
+            // included now.
+            //
+            // for some strange reason the old code would simply skip
+            // the entry and not fail, do the same now for backwards
+            // compatibility reasons.  Without this, the which4j build
+            // fails in Gump
+            return;
+        }
+        tarResource(new FileResource(file), tOut, vPath, tarFileSet);
+    }
 
-        String fullpath = tarFileSet.getFullpath();
-        if (fullpath.length() &gt; 0) {
-            vPath = fullpath;
-        } else {
-            // don't add &quot;&quot; to the archive
-            if (vPath.length() &lt;= 0) {
-                return;
-            }
+    /**
+     * tar a resource
+     * @param r the resource to tar
+     * @param tOut the output stream
+     * @param vPath the path name of the file to tar
+     * @param tarFileSet the fileset that the file came from, may be null.
+     * @throws IOException on error
+     * @since Ant 1.7
+     */
+    protected void tarResource(Resource r, TarOutputStream tOut, String vPath,
+                               TarFileSet tarFileSet)
+        throws IOException {
+
+        if (!r.isExists()) {
+            return;
+        }
+
+        if (tarFileSet != null) {
+            String fullpath = tarFileSet.getFullpath(this.getProject());
+            if (fullpath.length() &gt; 0) {
+                vPath = fullpath;
+            } else {
+                // don't add &quot;&quot; to the archive
+                if (vPath.length() &lt;= 0) {
+                    return;
+                }
 
-            if (file.isDirectory() &amp;&amp; !vPath.endsWith(&quot;/&quot;)) {
-                vPath += &quot;/&quot;;
+                String prefix = tarFileSet.getPrefix(this.getProject());
+                // '/' is appended for compatibility with the zip task.
+                if (prefix.length() &gt; 0 &amp;&amp; !prefix.endsWith(&quot;/&quot;)) {
+                    prefix = prefix + &quot;/&quot;;
+                }
+                vPath = prefix + vPath;
             }
 
-            String prefix = tarFileSet.getPrefix();
-            // '/' is appended for compatibility with the zip task.
-            if (prefix.length() &gt; 0 &amp;&amp; !prefix.endsWith(&quot;/&quot;)) {
-                prefix = prefix + &quot;/&quot;;
+            if (vPath.startsWith(&quot;/&quot;)
+                &amp;&amp; !tarFileSet.getPreserveLeadingSlashes()) {
+                int l = vPath.length();
+                if (l &lt;= 1) {
+                    // we would end up adding &quot;&quot; to the archive
+                    return;
+                }
+                vPath = vPath.substring(1, l);
             }
-            vPath = prefix + vPath;
         }
 
-        if (vPath.startsWith(&quot;/&quot;) &amp;&amp; !tarFileSet.getPreserveLeadingSlashes()) {
-            int l = vPath.length();
-            if (l &lt;= 1) {
-                // we would end up adding &quot;&quot; to the archive
-                return;
-            }
-            vPath = vPath.substring(1, l);
+        if (r.isDirectory() &amp;&amp; !vPath.endsWith(&quot;/&quot;)) {
+            vPath += &quot;/&quot;;
         }
 
-        try {
-            if (vPath.length() &gt;= TarConstants.NAMELEN) {
-                if (longFileMode.isOmitMode()) {
-                    log(&quot;Omitting: &quot; + vPath, Project.MSG_INFO);
-                    return;
-                } else if (longFileMode.isWarnMode()) {
-                    log(&quot;Entry: &quot; + vPath + &quot; longer than &quot;
-                        + TarConstants.NAMELEN + &quot; characters.&quot;,
+        if (vPath.length() &gt;= TarConstants.NAMELEN) {
+            if (longFileMode.isOmitMode()) {
+                log(&quot;Omitting: &quot; + vPath, Project.MSG_INFO);
+                return;
+            } else if (longFileMode.isWarnMode()) {
+                log(&quot;Entry: &quot; + vPath + &quot; longer than &quot;
+                    + TarConstants.NAMELEN + &quot; characters.&quot;,
+                    Project.MSG_WARN);
+                if (!longWarningGiven) {
+                    log(&quot;Resulting tar file can only be processed &quot;
+                        + &quot;successfully by GNU compatible tar commands&quot;,
                         Project.MSG_WARN);
-                    if (!longWarningGiven) {
-                        log(&quot;Resulting tar file can only be processed &quot;
-                            + &quot;successfully by GNU compatible tar commands&quot;,
-                            Project.MSG_WARN);
-                        longWarningGiven = true;
-                    }
-                } else if (longFileMode.isFailMode()) {
-                    throw new BuildException(&quot;Entry: &quot; + vPath
+                    longWarningGiven = true;
+                }
+            } else if (longFileMode.isFailMode()) {
+                throw new BuildException(&quot;Entry: &quot; + vPath
                         + &quot; longer than &quot; + TarConstants.NAMELEN
                         + &quot;characters.&quot;, getLocation());
-                }
             }
+        }
+
+        TarEntry te = new TarEntry(vPath);
+        te.setModTime(r.getLastModified());
+        // preserve permissions
+        if (r instanceof ArchiveResource) {
+            ArchiveResource ar = (ArchiveResource) r;
+            te.setMode(ar.getMode());
+            if (r instanceof TarResource) {
+                TarResource tr = (TarResource) r;
+                te.setUserName(tr.getUserName());
+                te.setUserId(tr.getUid());
+                te.setGroupName(tr.getGroup());
+                te.setGroupId(tr.getGid());
+            }
+        }
 
-            TarEntry te = new TarEntry(vPath);
-            te.setModTime(file.lastModified());
-            if (!file.isDirectory()) {
-                te.setSize(file.length());
+        if (!r.isDirectory()) {
+            if (r.size() &gt; TarConstants.MAXSIZE) {
+                throw new BuildException(
+                    &quot;Resource: &quot; + r + &quot; larger than &quot;
+                    + TarConstants.MAXSIZE + &quot; bytes.&quot;);
+            }
+            te.setSize(r.getSize());
+            // override permissions if set explicitly
+            if (tarFileSet != null &amp;&amp; tarFileSet.hasFileModeBeenSet()) {
                 te.setMode(tarFileSet.getMode());
-            } else {
-                te.setMode(tarFileSet.getDirMode());
             }
-            te.setUserName(tarFileSet.getUserName());
-            te.setGroupName(tarFileSet.getGroup());
-            te.setUserId(tarFileSet.getUid());
-            te.setGroupId(tarFileSet.getGid());
+        } else if (tarFileSet != null &amp;&amp; tarFileSet.hasDirModeBeenSet()) {
+            // override permissions if set explicitly
+            te.setMode(tarFileSet.getDirMode(this.getProject()));
+        }
+
+        if (tarFileSet != null) {
+            // only override permissions if set explicitly
+            if (tarFileSet.hasUserNameBeenSet()) {
+                te.setUserName(tarFileSet.getUserName());
+            }
+            if (tarFileSet.hasGroupBeenSet()) {
+                te.setGroupName(tarFileSet.getGroup());
+            }
+            if (tarFileSet.hasUserIdBeenSet()) {
+                te.setUserId(tarFileSet.getUid());
+            }
+            if (tarFileSet.hasGroupIdBeenSet()) {
+                te.setGroupId(tarFileSet.getGid());
+            }
+        }
 
+        InputStream in = null;
+        try {
             tOut.putNextEntry(te);
 
-            if (!file.isDirectory()) {
-                fIn = new FileInputStream(file);
+            if (!r.isDirectory()) {
+                in = r.getInputStream();
 
                 byte[] buffer = new byte[8 * 1024];
                 int count = 0;
                 do {
                     tOut.write(buffer, 0, count);
-                    count = fIn.read(buffer, 0, buffer.length);
+                    count = in.read(buffer, 0, buffer.length);
                 } while (count != -1);
             }
 
             tOut.closeEntry();
         } finally {
-            if (fIn != null) {
-                fIn.close();
-            }
+            FileUtils.close(in);
         }
     }
 
@@ -412,7 +490,8 @@ public class Tar extends MatchingTask {
      * Is the archive up to date in relationship to a list of files.
      * @param files the files to check
      * @return true if the archive is up to date.
-     * @deprecated use the two-arg version instead.
+     * @deprecated since 1.5.x.
+     *             use the two-arg version instead.
      */
     protected boolean archiveIsUpToDate(String[] files) {
         return archiveIsUpToDate(files, baseDir);
@@ -433,21 +512,255 @@ public class Tar extends MatchingTask {
     }
 
     /**
+     * Is the archive up to date in relationship to a list of files.
+     * @param r the files to check
+     * @return true if the archive is up to date.
+     * @since Ant 1.7
+     */
+    protected boolean archiveIsUpToDate(Resource r) {
+        return SelectorUtils.isOutOfDate(new FileResource(tarFile), r,
+                                         FileUtils.getFileUtils()
+                                         .getFileTimestampGranularity());
+    }
+
+    /**
+     * Whether this task can deal with non-file resources.
+     *
+     * &lt;p&gt;This implementation returns true only if this task is
+     * &amp;lt;tar&amp;gt;.  Any subclass of this class that also wants to
+     * support non-file resources needs to override this method.  We
+     * need to do so for backwards compatibility reasons since we
+     * can't expect subclasses to support resources.&lt;/p&gt;
+     * @return true for this task.
+     * @since Ant 1.7
+     */
+    protected boolean supportsNonFileResources() {
+        return getClass().equals(Tar.class);
+    }
+
+    /**
+     * Checks whether the archive is out-of-date with respect to the resources
+     * of the given collection.
+     *
+     * &lt;p&gt;Also checks that either all collections only contain file
+     * resources or this class supports non-file collections.&lt;/p&gt;
+     *
+     * &lt;p&gt;And - in case of file-collections - ensures that the archive won't
+     * contain itself.&lt;/p&gt;
+     *
+     * @param rc the resource collection to check
+     * @return whether the archive is up-to-date
+     * @since Ant 1.7
+     */
+    protected boolean check(ResourceCollection rc) {
+        boolean upToDate = true;
+        if (isFileFileSet(rc)) {
+            FileSet fs = (FileSet) rc;
+            upToDate = check(fs.getDir(getProject()), getFileNames(fs));
+        } else if (!rc.isFilesystemOnly() &amp;&amp; !supportsNonFileResources()) {
+            throw new BuildException(&quot;only filesystem resources are supported&quot;);
+        } else if (rc.isFilesystemOnly()) {
+            HashSet basedirs = new HashSet();
+            HashMap basedirToFilesMap = new HashMap();
+            Iterator iter = rc.iterator();
+            while (iter.hasNext()) {
+                FileResource r = (FileResource) iter.next();
+                File base = r.getBaseDir();
+                if (base == null) {
+                    base = Copy.NULL_FILE_PLACEHOLDER;
+                }
+                basedirs.add(base);
+                Vector files = (Vector) basedirToFilesMap.get(base);
+                if (files == null) {
+                    files = new Vector();
+                    basedirToFilesMap.put(base, new Vector());
+                }
+                files.add(r.getName());
+            }
+            iter = basedirs.iterator();
+            while (iter.hasNext()) {
+                File base = (File) iter.next();
+                Vector f = (Vector) basedirToFilesMap.get(base);
+                String[] files = (String[]) f.toArray(new String[f.size()]);
+                upToDate &amp;=
+                    check(base == Copy.NULL_FILE_PLACEHOLDER ? null : base,
+                          files);
+            }
+        } else { // non-file resources
+            Iterator iter = rc.iterator();
+            while (upToDate &amp;&amp; iter.hasNext()) {
+                Resource r = (Resource) iter.next();
+                upToDate &amp;= archiveIsUpToDate(r);
+            }
+        }
+
+        return upToDate;
+    }
+
+    /**
+     * Checks whether the archive is out-of-date with respect to the
+     * given files, ensures that the archive won't contain itself.&lt;/p&gt;
+     *
+     * @param basedir base directory for file names
+     * @param files array of relative file names
+     * @return whether the archive is up-to-date
+     * @since Ant 1.7
+     */
+    protected boolean check(File basedir, String[] files) {
+        boolean upToDate = true;
+        if (!archiveIsUpToDate(files, basedir)) {
+            upToDate = false;
+        }
+
+        for (int i = 0; i &lt; files.length; ++i) {
+            if (tarFile.equals(new File(basedir, files[i]))) {
+                throw new BuildException(&quot;A tar file cannot include &quot;
+                                         + &quot;itself&quot;, getLocation());
+            }
+        }
+        return upToDate;
+    }
+
+    /**
+     * Adds the resources contained in this collection to the archive.
+     *
+     * &lt;p&gt;Uses the file based methods for file resources for backwards
+     * compatibility.&lt;/p&gt;
+     *
+     * @param rc the collection containing resources to add
+     * @param tOut stream writing to the archive.
+     * @throws IOException on error.
+     * @since Ant 1.7
+     */
+    protected void tar(ResourceCollection rc, TarOutputStream tOut)
+        throws IOException {
+        ArchiveFileSet afs = null;
+        if (rc instanceof ArchiveFileSet) {
+            afs = (ArchiveFileSet) rc;
+        }
+        if (afs != null &amp;&amp; afs.size() &gt; 1
+            &amp;&amp; afs.getFullpath(this.getProject()).length() &gt; 0) {
+            throw new BuildException(&quot;fullpath attribute may only &quot;
+                                     + &quot;be specified for &quot;
+                                     + &quot;filesets that specify a &quot;
+                                     + &quot;single file.&quot;);
+        }
+        TarFileSet tfs = asTarFileSet(afs);
+
+        if (isFileFileSet(rc)) {
+            FileSet fs = (FileSet) rc;
+            String[] files = getFileNames(fs);
+            for (int i = 0; i &lt; files.length; i++) {
+                File f = new File(fs.getDir(getProject()), files[i]);
+                String name = files[i].replace(File.separatorChar, '/');
+                tarFile(f, tOut, name, tfs);
+            }
+        } else if (rc.isFilesystemOnly()) {
+            Iterator iter = rc.iterator();
+            while (iter.hasNext()) {
+                FileResource r = (FileResource) iter.next();
+                File f = r.getFile();
+                if (f == null) {
+                    f = new File(r.getBaseDir(), r.getName());
+                }
+                tarFile(f, tOut, f.getName(), tfs);
+            }
+        } else { // non-file resources
+            Iterator iter = rc.iterator();
+            while (iter.hasNext()) {
+                Resource r = (Resource) iter.next();
+                tarResource(r, tOut, r.getName(), tfs);
+            }
+        }
+    }
+
+    /**
+     * whether the given resource collection is a (subclass of)
+     * FileSet that only contains file system resources.
+     * @param rc the resource collection to check.
+     * @return true if the collection is a fileset.
+     * @since Ant 1.7
+     */
+    protected static final boolean isFileFileSet(ResourceCollection rc) {
+        return rc instanceof FileSet &amp;&amp; rc.isFilesystemOnly();
+    }
+
+    /**
+     * Grabs all included files and directors from the FileSet and
+     * returns them as an array of (relative) file names.
+     * @param fs the fileset to operate on.
+     * @return a list of the filenames.
+     * @since Ant 1.7
+     */
+    protected static final String[] getFileNames(FileSet fs) {
+        DirectoryScanner ds = fs.getDirectoryScanner(fs.getProject());
+        String[] directories = ds.getIncludedDirectories();
+        String[] filesPerSe = ds.getIncludedFiles();
+        String[] files = new String [directories.length + filesPerSe.length];
+        System.arraycopy(directories, 0, files, 0, directories.length);
+        System.arraycopy(filesPerSe, 0, files, directories.length,
+                         filesPerSe.length);
+        return files;
+    }
+
+    /**
+     * Copies fullpath, prefix and permission attributes from the
+     * ArchiveFileSet to a new TarFileSet (or returns it unchanged if
+     * it already is a TarFileSet).
+     *
+     * @param archiveFileSet fileset to copy attributes from, may be null
+     * @return a new TarFileSet.
+     * @since Ant 1.7
+     */
+    protected TarFileSet asTarFileSet(ArchiveFileSet archiveFileSet) {
+        TarFileSet tfs = null;
+        if (archiveFileSet != null &amp;&amp; archiveFileSet instanceof TarFileSet) {
+            tfs = (TarFileSet) archiveFileSet;
+        } else {
+            tfs = new TarFileSet();
+            tfs.setProject(getProject());
+            if (archiveFileSet != null) {
+                tfs.setPrefix(archiveFileSet.getPrefix(getProject()));
+                tfs.setFullpath(archiveFileSet.getFullpath(getProject()));
+                if (archiveFileSet.hasFileModeBeenSet()) {
+                    tfs.integerSetFileMode(archiveFileSet
+                                           .getFileMode(getProject()));
+                }
+                if (archiveFileSet.hasDirModeBeenSet()) {
+                    tfs.integerSetDirMode(archiveFileSet
+                                          .getDirMode(getProject()));
+                }
+
+                if (archiveFileSet
+                    instanceof org.apache.tools.ant.types.TarFileSet) {
+                    org.apache.tools.ant.types.TarFileSet t =
+                        (org.apache.tools.ant.types.TarFileSet) archiveFileSet;
+                    if (t.hasUserNameBeenSet()) {
+                        tfs.setUserName(t.getUserName());
+                    }
+                    if (t.hasGroupBeenSet()) {
+                        tfs.setGroup(t.getGroup());
+                    }
+                    if (t.hasUserIdBeenSet()) {
+                        tfs.setUid(t.getUid());
+                    }
+                    if (t.hasGroupIdBeenSet()) {
+                        tfs.setGid(t.getGid());
+                    }
+                }
+            }
+        }
+        return tfs;
+    }
+
+    /**
      * This is a FileSet with the option to specify permissions
      * and other attributes.
      */
-    public static class TarFileSet extends FileSet {
+    public static class TarFileSet
+        extends org.apache.tools.ant.types.TarFileSet {
         private String[] files = null;
 
-        private int fileMode = UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM;
-        private int dirMode = UnixStat.DIR_FLAG | UnixStat.DEFAULT_DIR_PERM;
-
-        private String userName = &quot;&quot;;
-        private String groupName = &quot;&quot;;
-        private int    uid;
-        private int    gid;
-        private String prefix = &quot;&quot;;
-        private String fullpath = &quot;&quot;;
         private boolean preserveLeadingSlashes = false;
 
         /**
@@ -476,13 +789,7 @@ public class Tar extends MatchingTask {
          */
         public String[] getFiles(Project p) {
             if (files == null) {
-                DirectoryScanner ds = getDirectoryScanner(p);
-                String[] directories = ds.getIncludedDirectories();
-                String[] filesPerSe = ds.getIncludedFiles();
-                files = new String [directories.length + filesPerSe.length];
-                System.arraycopy(directories, 0, files, 0, directories.length);
-                System.arraycopy(filesPerSe, 0, files, directories.length,
-                        filesPerSe.length);
+                files = getFileNames(this);
             }
 
             return files;
@@ -495,135 +802,14 @@ public class Tar extends MatchingTask {
          * @param octalString a 3 digit octal string.
          */
         public void setMode(String octalString) {
-            this.fileMode =
-                UnixStat.FILE_FLAG | Integer.parseInt(octalString, 8);
+            setFileMode(octalString);
         }
 
         /**
          * @return the current mode.
          */
         public int getMode() {
-            return fileMode;
-        }
-
-        /**
-         * A 3 digit octal string, specify the user, group and
-         * other modes in the standard Unix fashion;
-         * optional, default=0755
-         *
-         * @param octalString a 3 digit octal string.
-         * @since Ant 1.6
-         */
-        public void setDirMode(String octalString) {
-            this.dirMode =
-                UnixStat.DIR_FLAG | Integer.parseInt(octalString, 8);
-        }
-
-        /**
-         * @return the current directory mode
-         * @since Ant 1.6
-         */
-        public int getDirMode() {
-            return dirMode;
-        }
-
-        /**
-         * The username for the tar entry
-         * This is not the same as the UID.
-         * @param userName the user name for the tar entry.
-         */
-        public void setUserName(String userName) {
-            this.userName = userName;
-        }
-
-        /**
-         * @return the user name for the tar entry
-         */
-        public String getUserName() {
-            return userName;
-        }
-
-        /**
-         * The uid for the tar entry
-         * This is not the same as the User name.
-         * @param uid the id of the user for the tar entry.
-         */
-        public void setUid(int uid) {
-            this.uid = uid;
-        }
-
-        /**
-         * @return the uid for the tar entry
-         */
-        public int getUid() {
-            return uid;
-        }
-
-        /**
-         * The groupname for the tar entry; optional, default=&quot;&quot;
-         * This is not the same as the GID.
-         * @param groupName the group name string.
-         */
-        public void setGroup(String groupName) {
-            this.groupName = groupName;
-        }
-
-        /**
-         * @return the group name string.
-         */
-        public String getGroup() {
-            return groupName;
-        }
-
-        /**
-         * The GID for the tar entry; optional, default=&quot;0&quot;
-         * This is not the same as the group name.
-         * @param gid the group id.
-         */
-        public void setGid(int gid) {
-            this.gid = gid;
-        }
-
-        /**
-         * @return the group identifier.
-         */
-        public int getGid() {
-            return gid;
-        }
-
-        /**
-         * If the prefix attribute is set, all files in the fileset
-         * are prefixed with that path in the archive.
-         * optional.
-         * @param prefix the path prefix.
-         */
-        public void setPrefix(String prefix) {
-            this.prefix = prefix;
-        }
-
-        /**
-         * @return the path prefix for the files in the fileset.
-         */
-        public String getPrefix() {
-            return prefix;
-        }
-
-        /**
-         * If the fullpath attribute is set, the file in the fileset
-         * is written with that path in the archive. The prefix attribute,
-         * if specified, is ignored. It is an error to have more than one file specified in
-         * such a fileset.
-         * @param fullpath the path to use for the file in a fileset.
-         */
-        public void setFullpath(String fullpath) {
-            this.fullpath = fullpath;
-        }
-
-        /**
-         * @return the path to use for a single file fileset.
-         */
-        public String getFullpath() {
-            return fullpath;
+            return getFileMode(this.getProject());
         }
 
         /**
@@ -756,11 +942,11 @@ public class Tar extends MatchingTask {
          */
         private OutputStream compress(final OutputStream ostream)
             throws IOException {
-            final String value = getValue();
-            if (GZIP.equals(value)) {
+            final String v = getValue();
+            if (GZIP.equals(v)) {
                 return new GZIPOutputStream(ostream);
             } else {
-                if (BZIP2.equals(value)) {
+                if (BZIP2.equals(v)) {
                     ostream.write('B');
                     ostream.write('Z');
                     return new CBZip2OutputStream(ostream);</diff>
      <filename>src/java/org/apache/tools/ant/taskdefs/Tar.java</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,10 @@
 /*
- * Copyright  2002-2004 The Apache Software Foundation
- *
- *  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the &quot;License&quot;); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *</diff>
      <filename>src/java/org/apache/tools/ant/taskdefs/condition/IsFalse.java</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,10 @@
 /*
- * Copyright  2002-2004 The Apache Software Foundation
- *
- *  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the &quot;License&quot;); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *</diff>
      <filename>src/java/org/apache/tools/ant/taskdefs/condition/IsTrue.java</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,10 @@
 /*
- * Copyright  2001-2004 The Apache Software Foundation
- *
- *  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);
- *  you may not use this file except in compliance with the License.
- *  You may obtain a copy of the License at
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the &quot;License&quot;); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -16,12 +17,8 @@
  */
 package org.apache.tools.ant.types;
 
-import java.io.File;
-import java.util.Stack;
 import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.DirectoryScanner;
 import org.apache.tools.ant.Project;
-import org.apache.tools.zip.UnixStat;
 
 /**
  * A ZipFileSet is a FileSet with extra attributes useful in the context of
@@ -34,38 +31,19 @@ import org.apache.tools.zip.UnixStat;
  * Since ant 1.6 ZipFileSet can be defined with an id and referenced in packaging tasks
  *
  */
-public class ZipFileSet extends FileSet {
-
-    /**
-     * Default value for the dirmode attribute.
-     *
-     * @since Ant 1.5.2
-     */
-    public static final int DEFAULT_DIR_MODE =
-        UnixStat.DIR_FLAG  | UnixStat.DEFAULT_DIR_PERM;
+public class ZipFileSet extends ArchiveFileSet {
 
-    /**
-     * Default value for the filemode attribute.
-     *
-     * @since Ant 1.5.2
-     */
-    public static final int DEFAULT_FILE_MODE =
-        UnixStat.FILE_FLAG | UnixStat.DEFAULT_FILE_PERM;
-
-    private File srcFile          = null;
-    private String prefix         = &quot;&quot;;
-    private String fullpath       = &quot;&quot;;
-    private boolean hasDir        = false;
-    private int fileMode          = DEFAULT_FILE_MODE;
-    private int dirMode           = DEFAULT_DIR_MODE;
-
-    private boolean fileModeHasBeenSet = false;
-    private boolean dirModeHasBeenSet  = false;
+    private String encoding = null;
 
+    /** Constructor for ZipFileSet */
     public ZipFileSet() {
         super();
     }
 
+    /**
+     * Constructor using a fileset arguement.
+     * @param fileset the fileset to use
+     */
 // EV: CHANGE
 // NEW
     public ZipFileSet(FileSet fileset) {
@@ -75,230 +53,77 @@ public class ZipFileSet extends FileSet {
         super(fileset);
     }
 
-    protected ZipFileSet(ZipFileSet fileset) {
-        super(fileset);
-        srcFile = fileset.srcFile;
-        prefix = fileset.prefix;
-        fullpath = fileset.fullpath;
-        hasDir = fileset.hasDir;
-        fileMode = fileset.fileMode;
-        dirMode = fileset.dirMode;
-        fileModeHasBeenSet = fileset.fileModeHasBeenSet;
-        dirModeHasBeenSet = fileset.dirModeHasBeenSet;
-    }
-
-    /**
-     * Set the directory for the fileset.  Prevents both &quot;dir&quot; and &quot;src&quot;
-     * from being specified.
-     */
-    public void setDir(File dir) throws BuildException {
-        if (isReference()) {
-             throw tooManyAttributes();
-         }
-        if (srcFile != null) {
-            throw new BuildException(&quot;Cannot set both dir and src attributes&quot;);
-        } else {
-            super.setDir(dir);
-            hasDir = true;
-        }
-    }
-
-    /**
-     * Set the source Zip file for the zipfileset.  Prevents both
-     * &quot;dir&quot; and &quot;src&quot; from being specified.
-     *
-     * @param srcFile The zip file from which to extract entries.
-     */
-    public void setSrc(File srcFile) {
-        if (isReference()) {
-             throw tooManyAttributes();
-         }
-        if (hasDir) {
-            throw new BuildException(&quot;Cannot set both dir and src attributes&quot;);
-        }
-        this.srcFile = srcFile;
-    }
-
-    /**
-     * Get the zip file from which entries will be extracted.
-     * References are not followed, since it is not possible
-     * to have a reference to a ZipFileSet, only to a FileSet.
-     */
-    public File getSrc(Project p) {
-        if (isReference()) {
-            return ((ZipFileSet) getRef(p)).getSrc(p);
-        }
-        return srcFile;
-    }
-
-    /**
-     * Prepend this prefix to the path for each zip entry.
-     * Prevents both prefix and fullpath from being specified
-     *
-     * @param prefix The prefix to prepend to entries in the zip file.
-     */
-    public void setPrefix(String prefix) {
-        if (!prefix.equals(&quot;&quot;) &amp;&amp; !fullpath.equals(&quot;&quot;)) {
-            throw new BuildException(&quot;Cannot set both fullpath and prefix attributes&quot;);
-        }
-        this.prefix = prefix;
-    }
-
-    /**
-     * Return the prefix prepended to entries in the zip file.
-     */
-    public String getPrefix(Project p) {
-        if (isReference()) {
-            return ((ZipFileSet) getRef(p)).getPrefix(p);
-        }
-        return prefix;
-    }
-
     /**
-     * Set the full pathname of the single entry in this fileset.
-     * Prevents both prefix and fullpath from being specified
-     *
-     * @param fullpath the full pathname of the single entry in this fileset.
+     * Constructor using a zipfileset arguement.
+     * @param fileset the zipfileset to use
      */
-    public void setFullpath(String fullpath) {
-        if (!prefix.equals(&quot;&quot;) &amp;&amp; !fullpath.equals(&quot;&quot;)) {
-            throw new BuildException(&quot;Cannot set both fullpath and prefix attributes&quot;);
-        }
-        this.fullpath = fullpath;
-    }
-
-    /**
-     * Return the full pathname of the single entry in this fileset.
-     */
-    public String getFullpath(Project p) {
-        if (isReference()) {
-            return ((ZipFileSet) getRef(p)).getFullpath(p);
-        }
-        return fullpath;
-    }
-
-    /**
-     * Return the DirectoryScanner associated with this FileSet.
-     * If the ZipFileSet defines a source Zip file, then a ZipScanner
-     * is returned instead.
-     */
-    public DirectoryScanner getDirectoryScanner(Project p) {
-        if (isReference()) {
-            return getRef(p).getDirectoryScanner(p);
-        }
-        if (srcFile != null) {
-            ZipScanner zs = new ZipScanner();
-            zs.setSrc(srcFile);
-            super.setDir(p.getBaseDir());
-            setupDirectoryScanner(zs, p);
-            zs.init();
-            return zs;
-        } else {
-            return super.getDirectoryScanner(p);
-        }
-    }
-
-    /**
-     * A 3 digit octal string, specify the user, group and
-     * other modes in the standard Unix fashion;
-     * optional, default=0644
-     *
-     * @since Ant 1.5.2
-     */
-    public void setFileMode(String octalString) {
-        fileModeHasBeenSet = true;
-        this.fileMode =
-            UnixStat.FILE_FLAG | Integer.parseInt(octalString, 8);
-    }
-
-    /**
-     * @since Ant 1.5.2
-     */
-    public int getFileMode(Project p) {
-        if (isReference()) {
-            return ((ZipFileSet) getRef(p)).getFileMode(p);
-        }
-        return fileMode;
-    }
-
-    /**
-     * Whether the user has specified the mode explicitly.
-     *
-     * @since Ant 1.6
-     */
-    public boolean hasFileModeBeenSet() {
-        if (isReference()) {
-            return ((ZipFileSet) getRef(getProject())).hasFileModeBeenSet();
-        }
-        return fileModeHasBeenSet;
+    protected ZipFileSet(ZipFileSet fileset) {
+        super(fileset);
+        encoding = fileset.encoding;
     }
 
     /**
-     * A 3 digit octal string, specify the user, group and
-     * other modes in the standard Unix fashion;
-     * optional, default=0755
-     *
-     * @since Ant 1.5.2
+     * Set the encoding used for this ZipFileSet.
+     * @param enc encoding as String.
+     * @since Ant 1.7
      */
-    public void setDirMode(String octalString) {
-        dirModeHasBeenSet = true;
-        this.dirMode =
-            UnixStat.DIR_FLAG | Integer.parseInt(octalString, 8);
+    public void setEncoding(String enc) {
+        checkZipFileSetAttributesAllowed();
+        this.encoding = enc;
     }
 
     /**
-     * @since Ant 1.5.2
+     * Get the encoding used for this ZipFileSet.
+     * @return String encoding.
+     * @since Ant 1.7
      */
-    public int getDirMode(Project p) {
+    public String getEncoding() {
         if (isReference()) {
-            return ((ZipFileSet) getRef(p)).getDirMode(p);
+            AbstractFileSet ref = getRef(getProject());
+            if (ref instanceof ZipFileSet) {
+                return ((ZipFileSet) ref).getEncoding();
+            } else {
+                return null;
+            }
         }
-        return dirMode;
+        return encoding;
     }
 
     /**
-     * Whether the user has specified the mode explicitly.
-     *
-     * @since Ant 1.6
+     * Return a new archive scanner based on this one.
+     * @return a new ZipScanner with the same encoding as this one.
      */
-    public boolean hasDirModeBeenSet() {
-        if (isReference()) {
-            return ((ZipFileSet) getRef(getProject())).hasDirModeBeenSet();
-        }
-        return dirModeHasBeenSet;
+    protected ArchiveScanner newArchiveScanner() {
+        ZipScanner zs = new ZipScanner();
+        zs.setEncoding(encoding);
+        return zs;
     }
 
     /**
      * A ZipFileset accepts another ZipFileSet or a FileSet as reference
      * FileSets are often used by the war task for the lib attribute
+     * @param p the project to use
+     * @return the abstract fileset instance
      */
     protected AbstractFileSet getRef(Project p) {
-        if (!isChecked()) {
-            Stack stk = new Stack();
-            stk.push(this);
-            dieOnCircularReference(stk, p);
-        }
+        dieOnCircularReference(p);
         Object o = getRefid().getReferencedObject(p);
         if (o instanceof ZipFileSet) {
             return (AbstractFileSet) o;
         } else if (o instanceof FileSet) {
             ZipFileSet zfs = new ZipFileSet((FileSet) o);
-            zfs.setPrefix(prefix);
-            zfs.setFullpath(fullpath);
-            zfs.fileModeHasBeenSet = fileModeHasBeenSet;
-            zfs.fileMode = fileMode;
-            zfs.dirModeHasBeenSet = dirModeHasBeenSet;
-            zfs.dirMode = dirMode;
+            configureFileSet(zfs);
             return zfs;
         } else {
             String msg = getRefid().getRefId() + &quot; doesn\'t denote a zipfileset or a fileset&quot;;
             throw new BuildException(msg);
         }
     }
+
     /**
      * Return a ZipFileSet that has the same properties
      * as this one.
-     * @since Ant 1.6
+     * @return the cloned zipFileSet
      */
     public Object clone() {
         if (isReference()) {
@@ -307,4 +132,21 @@ public class ZipFileSet extends FileSet {
             return super.clone();
         }
     }
+
+    /**
+     * A check attributes for zipFileSet.
+     * If there is a reference, and
+     * it is a ZipFileSet, the zip fileset attributes
+     * cannot be used.
+     */
+    private void checkZipFileSetAttributesAllowed() {
+        if (getProject() == null
+            || (isReference()
+                &amp;&amp; (getRefid().getReferencedObject(
+                        getProject())
+                    instanceof ZipFileSet))) {
+            checkAttributesAllowed();
+        }
+    }
+
 }</diff>
      <filename>src/java/org/apache/tools/ant/types/ZipFileSet.java</filename>
    </modified>
    <modified>
      <diff>@@ -143,6 +143,7 @@ public class PackageTask
   {
     if(tar == null){
       tar = new Tar();
+      tar.setProject(getProject());
     }
     return tar;
   }</diff>
      <filename>src/java/org/formic/ant/PackageTask.java</filename>
    </modified>
    <modified>
      <diff>@@ -99,14 +99,14 @@ public class WindowsPackager
   }
 
   /**
-   * Constructs a boostrap jar file for the windows installer.
+   * Constructs a bootstrap jar file for the windows installer.
    *
    * @param archive The archive containing the installer files.
    * @return The bootstrap file.
    */
   private File constructBoostrapJar (File archive)
   {
-    File bootstrap = new File(getBuildDir() + &quot;/formic-boostrap.jar&quot;);
+    File bootstrap = new File(getBuildDir() + &quot;/formic-bootstrap.jar&quot;);
 
     AntUtils.copy(getProject(), getTaskName(),
         new File(getFormicHome() + &quot;/ant/resources/formic-bootstrap.jar&quot;),</diff>
      <filename>src/java/org/formic/ant/impl/WindowsPackager.java</filename>
    </modified>
    <modified>
      <diff>@@ -30,6 +30,7 @@ import org.apache.tools.ant.BuildListener;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Target;
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.UnknownElement;
 
 import org.apache.tools.ant.taskdefs.Ant;
 import org.apache.tools.ant.taskdefs.CallTarget;
@@ -119,14 +120,13 @@ public class InstallAction
     for (int ii = 0; ii &lt; tasks.length; ii++){
       Task task = tasks[ii];
 
-/* Breaks ant property scope for some reason.
+      this.tasks.add(task);
+
       if(task instanceof UnknownElement){
         UnknownElement ue = (UnknownElement)task;
         ue.maybeConfigure();
         task = ((UnknownElement)task).getTask();
       }
-*/
-      this.tasks.add(task);
 
       if (task instanceof Ant ||
           task instanceof CallTarget)</diff>
      <filename>src/java/org/formic/wizard/step/shared/InstallAction.java</filename>
    </modified>
    <modified>
      <diff>@@ -22,7 +22,7 @@
 
         &lt;formic:step name=&quot;license&quot;/&gt;
 
-        &lt;!--formic:step name=&quot;test&quot;/&gt;
+        &lt;formic:step name=&quot;test&quot;/&gt;
 
         &lt;formic:step name=&quot;installLocation&quot;&gt;
           &lt;property name=&quot;discoverer&quot; value=&quot;org.sample.TestDiscoverer&quot;/&gt;
@@ -32,14 +32,14 @@
           &lt;property name=&quot;provider&quot; value=&quot;org.sample.TestFeatureProvider&quot;/&gt;
         &lt;/formic:step&gt;
 
-        &lt;!- - Go to requirements branch 1 if feature == &quot;branch&quot; - -&gt;
+        &lt;!-- Go to requirements branch 1 if feature == &quot;branch&quot; --&gt;
         &lt;formic:branch path=&quot;branch_requirements&quot;&gt;
           &lt;or&gt;
             &lt;istrue value=&quot;featureList.feature.three&quot;/&gt;
             &lt;istrue value=&quot;featureList.feature.four&quot;/&gt;
             &lt;istrue value=&quot;featureList.feature.five&quot;/&gt;
           &lt;/or&gt;
-        &lt;/formic:branch--&gt;
+        &lt;/formic:branch&gt;
 
         &lt;formic:step name=&quot;summary&quot;/&gt;
         &lt;formic:step name=&quot;install&quot;/&gt;</diff>
      <filename>src/samples/src/installer.xml</filename>
    </modified>
    <modified>
      <diff>@@ -47,7 +47,7 @@
       - Don't use console appender if you plan to let users run installer in
       - console mode, as it will currupt the display.
       --&gt;
-    &lt;!--appender-ref ref=&quot;console&quot;/--&gt;
+    &lt;appender-ref ref=&quot;console&quot;/&gt;
   &lt;/root&gt;
 
 &lt;/log4j:configuration&gt;</diff>
      <filename>src/samples/src/log4j.xml</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>ant/VERSION</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>72089c5d121ec058c05506ca1f223ec785a5f254</id>
    </parent>
  </parents>
  <author>
    <name>ervandew</name>
    <email>ervandew@gmail.com</email>
  </author>
  <url>http://github.com/ervandew/formic/commit/f6fb2d8b0c100fa9cd88093d22381012ebf7feb4</url>
  <id>f6fb2d8b0c100fa9cd88093d22381012ebf7feb4</id>
  <committed-date>2008-01-31T18:00:59-08:00</committed-date>
  <authored-date>2008-01-31T18:00:59-08:00</authored-date>
  <message>upgraded ant to 1.7.0

git-svn-id: https://formic.svn.sourceforge.net/svnroot/formic/trunk@338 1a7380c6-1923-0410-bcea-c2eae4ba7d6c</message>
  <tree>9a8384e8f8d82546af014d491bc1ddb328d57167</tree>
  <committer>
    <name>ervandew</name>
    <email>ervandew@gmail.com</email>
  </committer>
</commit>
