ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mben...@apache.org
Subject cvs commit: ant/src/etc/testcases/taskdefs/exec apply.xml
Date Wed, 26 Jan 2005 21:50:57 GMT
mbenson     2005/01/26 13:50:45

  Modified:    .        Tag: ANT_16_BRANCH WHATSNEW
               src/main/org/apache/tools/ant/taskdefs Tag: ANT_16_BRANCH
                        ExecuteOn.java
               src/testcases/org/apache/tools/ant/taskdefs Tag:
                        ANT_16_BRANCH ExecuteOnTest.java
               src/etc/testcases/taskdefs/exec Tag: ANT_16_BRANCH apply.xml
  Log:
  Merge apply changes from HEAD.
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.503.2.164 +12 -0     ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.503.2.163
  retrieving revision 1.503.2.164
  diff -u -r1.503.2.163 -r1.503.2.164
  --- WHATSNEW	26 Jan 2005 19:28:16 -0000	1.503.2.163
  +++ WHATSNEW	26 Jan 2005 21:46:28 -0000	1.503.2.164
  @@ -54,6 +54,12 @@
   * Overloaded FileUtils.createNewFile with a boolean mkdirs attribute
     to create nonexistent parent directories.
   
  +* <apply> has a new "force" attribute that, when true, disables
  +  checking of target files.
  +
  +* Made the dest attribute of the apply task optional; mapped target
  +  filenames will be interpreted as absolute pathnames when dest is omitted.
  +
   Fixed bugs:
   -----------
   
  @@ -142,6 +148,12 @@
   * DependScanner.getResource() always returned nonexistent resources,
     even when the resource actually existed.  Bugzilla Report 30558.
   
  +* <apply> was broken with classfilesets.  Bugzilla Report 30567.
  +
  +* <available> returned false positives when checking a file
  +  passed in with the current basedir leading twice:
  +  e.g. ${basedir}${file.separator}${basedir}${file.separator}foo .
  +
   Changes from Ant 1.6.1 to Ant 1.6.2
   ===================================
   
  
  
  
  No                   revision
  No                   revision
  1.46.2.7  +119 -96   ant/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java
  
  Index: ExecuteOn.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/ExecuteOn.java,v
  retrieving revision 1.46.2.6
  retrieving revision 1.46.2.7
  diff -u -r1.46.2.6 -r1.46.2.7
  --- ExecuteOn.java	23 Jun 2004 19:17:12 -0000	1.46.2.6
  +++ ExecuteOn.java	26 Jan 2005 21:47:39 -0000	1.46.2.7
  @@ -1,5 +1,5 @@
   /*
  - * Copyright  2000-2004 The Apache Software Foundation.
  + * Copyright  2000-2005 The Apache Software Foundation.
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -43,18 +43,6 @@
    */
   public class ExecuteOn extends ExecTask {
   
  -    private class ExtendedDirectoryScanner extends DirectoryScanner {
  -        public int getIncludedFilesCount() {
  -            if (filesIncluded == null) throw new IllegalStateException();
  -            return filesIncluded.size();
  -        }
  -
  -        public int getIncludedDirsCount() {
  -            if (dirsIncluded == null) throw new IllegalStateException();
  -            return dirsIncluded.size();
  -        }
  -    }
  -
       protected Vector filesets = new Vector(); // contains AbstractFileSet
                                                 // (both DirSet and FileSet)
       private Vector filelists = new Vector();
  @@ -72,6 +60,7 @@
       private boolean addSourceFile = true;
       private boolean verbose = false;
       private boolean ignoreMissing = true;
  +    private boolean force = false;
   
       /**
        * Has &lt;srcfile&gt; been specified before &lt;targetfile&gt;
  @@ -79,14 +68,15 @@
       protected boolean srcIsFirst = true;
   
       /**
  -     * Source files to operate upon.
  +     * Add a set of files upon which to operate.
  +     * @param set the FileSet to add.
        */
       public void addFileset(FileSet set) {
           filesets.addElement(set);
       }
   
       /**
  -     * Adds directories to operate on.
  +     * Add a set of directories upon which to operate.
        *
        * @param  set the DirSet to add.
        *
  @@ -95,18 +85,21 @@
       public void addDirset(DirSet set) {
           filesets.addElement(set);
       }
  +
       /**
  -     * Source files to operate upon.
  +     * Add a list of source files upon which to operate.
  +     * @param list the FileList to add.
        */
       public void addFilelist(FileList list) {
           filelists.addElement(list);
       }
   
       /**
  -     * Whether the filenames should be passed on the command line as
  +     * Set whether the filenames should be passed on the command line as
        * absolute or relative pathnames. Paths are relative to the base
        * directory of the corresponding fileset for source files or the
        * dest attribute for target files.
  +     * @param relative whether to pass relative pathnames.
        */
       public void setRelative(boolean relative) {
           this.relative = relative;
  @@ -114,38 +107,45 @@
   
   
       /**
  +     * Set whether to execute in parallel mode.
        * If true, run the command only once, appending all files as arguments.
        * If false, command will be executed once for every file. Defaults to false.
  +     * @param parallel whether to run in parallel.
        */
       public void setParallel(boolean parallel) {
           this.parallel = parallel;
       }
   
       /**
  -     * Whether the command works only on files, directories or both?
  +     * Set whether the command works only on files, directories or both.
  +     * @param type a FileDirBoth EnumeratedAttribute.
        */
       public void setType(FileDirBoth type) {
           this.type = type.getValue();
       }
   
       /**
  -     * If no source files have been found or are newer than their
  -     * corresponding target files, do not run the command.
  +     * Set whether empty filesets will be skipped.  If true and
  +     * no source files have been found or are newer than their
  +     * corresponding target files, the command will not be run.
  +     * @param skip whether to skip empty filesets.
        */
       public void setSkipEmptyFilesets(boolean skip) {
           skipEmpty = skip;
       }
   
       /**
  -     * The directory where target files are to be placed.
  +     * Specify the directory where target files are to be placed.
  +     * @param destDir the File object representing the destination directory.
        */
       public void setDest(File destDir) {
           this.destDir = destDir;
       }
   
       /**
  -     * The source and target file names on Windows and OS/2 must use
  -     * forward slash as file separator.
  +     * Set whether the source and target file names on Windows and OS/2
  +     * must use the forward slash as file separator.
  +     * @param forwardSlash whether the forward slash will be forced.
        */
       public void setForwardslash(boolean forwardSlash) {
           this.forwardSlash = forwardSlash;
  @@ -157,6 +157,9 @@
        *
        * <p>Set to &lt;= 0 for unlimited - this is the default.</p>
        *
  +     * @param max <code>int</code> maximum number of sourcefiles
  +     *            passed to the executable.
  +     *
        * @since Ant 1.6
        */
       public void setMaxParallel(int max) {
  @@ -164,10 +167,12 @@
       }
   
       /**
  -     * Whether to send the source file name on the command line.
  +     * Set whether to send the source file name on the command line.
        *
        * <p>Defaults to <code>true</code>.
        *
  +     * @param b whether to add the source file to the command line.
  +     *
        * @since Ant 1.6
        */
       public void setAddsourcefile(boolean b) {
  @@ -175,7 +180,9 @@
       }
   
       /**
  -     * Whether to print a verbose summary after execution.
  +     * Set whether to operate in verbose mode.
  +     * If true, a verbose summary will be printed after execution.
  +     * @param b whether to operate in verbose mode.
        *
        * @since Ant 1.6
        */
  @@ -184,7 +191,8 @@
       }
   
       /**
  -     * Whether to ignore nonexistent files from filelists.
  +     * Set whether to ignore nonexistent files from filelists.
  +     * @param b whether to ignore missing files.
        *
        * @since Ant 1.6.2
        */
  @@ -193,8 +201,19 @@
       }
   
       /**
  -     * Marker that indicates where the name of the source file should
  -     * be put on the command line.
  +     * Set whether to bypass timestamp comparisons for target files.
  +     * @param b whether to bypass timestamp comparisons.
  +     *
  +     * @since Ant 1.6.3
  +     */
  +    public void setForce(boolean b) {
  +        force = b;
  +    }
  +
  +    /**
  +     * Create a placeholder indicating where on the command line
  +     * the name of the source file should be inserted.
  +     * @return <code>Commandline.Marker</code>.
        */
       public Commandline.Marker createSrcfile() {
           if (srcFilePos != null) {
  @@ -206,8 +225,9 @@
       }
   
       /**
  -     * Marker that indicates where the name of the target file should
  -     * be put on the command line.
  +     * Create a placeholder indicating where on the command line
  +     * the name of the target file should be inserted.
  +     * @return <code>Commandline.Marker</code>.
        */
       public Commandline.Marker createTargetfile() {
           if (targetFilePos != null) {
  @@ -220,7 +240,10 @@
       }
   
       /**
  -     * Mapper to use for mapping source files to target files.
  +     * Create a nested Mapper element to use for mapping
  +     * source files to target files.
  +     * @return <code>Mapper</code>.
  +     * @throws BuildException if more than one mapper is defined.
        */
       public Mapper createMapper() throws BuildException {
           if (mapperElement != null) {
  @@ -232,51 +255,71 @@
       }
   
       /**
  -     * @todo using taskName here is brittle, as a user could override it.
  -     *       this should probably be modified to use the classname instead.
  +     * Add a nested FileNameMapper.
  +     * @param fileNameMapper the mapper to add.
  +     * @since Ant 1.6.3
  +     */
  +    public void add(FileNameMapper fileNameMapper) {
  +        createMapper().add(fileNameMapper);
  +    }
  +
  +    /**
  +     * Check the configuration of this ExecuteOn instance.
        */
       protected void checkConfiguration() {
  +//     * @TODO using taskName here is brittle, as a user could override it.
  +//     *       this should probably be modified to use the classname instead.
           if ("execon".equals(getTaskName())) {
               log("!! execon is deprecated. Use apply instead. !!");
           }
  -
           super.checkConfiguration();
           if (filesets.size() == 0 && filelists.size() == 0) {
               throw new BuildException("no filesets and no filelists specified",
                                        getLocation());
           }
  -
  -        if (targetFilePos != null || mapperElement != null
  -            || destDir != null) {
  -
  -            if (mapperElement == null) {
  -                throw new BuildException("no mapper specified", getLocation());
  -            }
  -            if (destDir == null) {
  -                throw new BuildException("no dest attribute specified",
  -                                         getLocation());
  -            }
  +        if (targetFilePos != null && mapperElement == null) {
  +            throw new BuildException("targetfile specified without mapper",
  +                                     getLocation());
  +        }
  +        if (destDir != null && mapperElement == null) {
  +            throw new BuildException("dest specified without mapper",
  +                                     getLocation());
  +        }
  +        if (mapperElement != null) {
               mapper = mapperElement.getImplementation();
           }
       }
   
  +    /**
  +     * Create the ExecuteStreamHandler instance that will be used
  +     * during execution.
  +     * @return <code>ExecuteStreamHandler</code>.
  +     * @throws BuildException on error.
  +     */
       protected ExecuteStreamHandler createHandler() throws BuildException {
           //if we have a RedirectorElement, return a decoy
           return (redirectorElement == null)
               ? super.createHandler() : new PumpStreamHandler();
       }
   
  +    /**
  +     * Set up the I/O Redirector.
  +     */
       protected void setupRedirector() {
           super.setupRedirector();
           redirector.setAppendProperties(true);
       }
   
  +    /**
  +     * Run the specified Execute object.
  +     * @param exe the Execute instance representing the external process.
  +     * @throws BuildException on error
  +     */
       protected void runExec(Execute exe) throws BuildException {
           int totalFiles = 0;
           int totalDirs = 0;
           boolean haveExecuted = false;
           try {
  -
               Vector fileNames = new Vector();
               Vector baseDirs = new Vector();
               for (int i = 0; i < filesets.size(); i++) {
  @@ -293,10 +336,7 @@
                   }
                   File base = fs.getDir(getProject());
   
  -                ExtendedDirectoryScanner ds = new ExtendedDirectoryScanner();
  -                fs.setupDirectoryScanner(ds, getProject());
  -                ds.setFollowSymlinks(fs.isFollowSymlinks());
  -                ds.scan();
  +                DirectoryScanner ds = fs.getDirectoryScanner(getProject());
   
                   if (!"dir".equals(currentType)) {
                       String[] s = getFiles(base, ds);
  @@ -306,7 +346,6 @@
                           baseDirs.addElement(base);
                       }
                   }
  -
                   if (!"file".equals(currentType)) {
                       String[] s = getDirs(base, ds);
                       for (int j = 0; j < s.length; j++) {
  @@ -315,7 +354,6 @@
                           baseDirs.addElement(base);
                       }
                   }
  -
                   if (fileNames.size() == 0 && skipEmpty) {
                       int includedCount
                           = ((!"dir".equals(currentType))
  @@ -328,7 +366,6 @@
                           Project.MSG_INFO);
                       continue;
                   }
  -
                   if (!parallel) {
                       String[] s = new String[fileNames.size()];
                       fileNames.copyInto(s);
  @@ -342,7 +379,6 @@
                               setupRedirector();
                               redirectorElement.configure(redirector, s[j]);
                           }
  -
                           if (redirectorElement != null || haveExecuted) {
                               // need to reset the stream handler to restart
                               // reading of pipes;
  @@ -356,7 +392,6 @@
                       baseDirs.removeAllElements();
                   }
               }
  -
               for (int i = 0; i < filelists.size(); i++) {
                   FileList list = (FileList) filelists.elementAt(i);
                   File base = list.getDir(getProject());
  @@ -372,14 +407,12 @@
                           } else {
                               totalDirs++;
                           }
  -
                           fileNames.addElement(names[j]);
                           baseDirs.addElement(base);
                       }
                   }
  -
                   if (fileNames.size() == 0 && skipEmpty) {
  -                    ExtendedDirectoryScanner ds = new ExtendedDirectoryScanner();
  +                    DirectoryScanner ds = new DirectoryScanner();
                       ds.setBasedir(base);
                       ds.setIncludes(list.getFiles(getProject()));
                       ds.scan();
  @@ -391,7 +424,6 @@
                           Project.MSG_INFO);
                       continue;
                   }
  -
                   if (!parallel) {
                       String[] s = new String[fileNames.size()];
                       fileNames.copyInto(s);
  @@ -405,7 +437,6 @@
                               setupRedirector();
                               redirectorElement.configure(redirector, s[j]);
                           }
  -
                           if (redirectorElement != null || haveExecuted) {
                               // need to reset the stream handler to restart
                               // reading of pipes;
  @@ -419,12 +450,10 @@
                       baseDirs.removeAllElements();
                   }
               }
  -
               if (parallel && (fileNames.size() > 0 || !skipEmpty)) {
                   runParallel(exe, fileNames, baseDirs);
                   haveExecuted = true;
               }
  -
               if (haveExecuted) {
                   log("Applied " + cmdl.getExecutable() + " to "
                       + totalFiles + " file"
  @@ -433,7 +462,6 @@
                       + (totalDirs != 1 ? "ies" : "y") + ".",
                       verbose ? Project.MSG_INFO : Project.MSG_VERBOSE);
               }
  -
           } catch (IOException e) {
               throw new BuildException("Execute failed: " + e, e, getLocation());
           } finally {
  @@ -447,8 +475,9 @@
       /**
        * Construct the command line for parallel execution.
        *
  -     * @param srcFiles The filenames to add to the commandline
  -     * @param baseDirs filenames are relative to this dir
  +     * @param srcFiles The filenames to add to the commandline.
  +     * @param baseDirs filenames are relative to this dir.
  +     * @return the command line in the form of a String[].
        */
       protected String[] getCommandline(String[] srcFiles, File[] baseDirs) {
           final char fileSeparator = File.separatorChar;
  @@ -482,7 +511,6 @@
           if (!addSourceFile) {
               srcFiles = new String[0];
           }
  -
           String[] orig = cmdl.getCommandline();
           String[] result
               = new String[orig.length + srcFiles.length + targetFiles.length];
  @@ -491,7 +519,6 @@
           if (srcFilePos != null) {
               srcIndex = srcFilePos.getPosition();
           }
  -
           if (targetFilePos != null) {
               int targetIndex = targetFilePos.getPosition();
   
  @@ -544,9 +571,7 @@
               System.arraycopy(orig, srcIndex, result,
                                srcIndex + srcFiles.length,
                                orig.length - srcIndex);
  -
           }
  -
           // fill in source file names
           for (int i = 0; i < srcFiles.length; i++) {
               if (!relative) {
  @@ -566,8 +591,9 @@
       /**
        * Construct the command line for serial execution.
        *
  -     * @param srcFile The filename to add to the commandline
  -     * @param baseDir filename is relative to this dir
  +     * @param srcFile The filename to add to the commandline.
  +     * @param baseDir filename is relative to this dir.
  +     * @return the command line in the form of a String[].
        */
       protected String[] getCommandline(String srcFile, File baseDir) {
           return getCommandline(new String[] {srcFile}, new File[] {baseDir});
  @@ -576,52 +602,50 @@
       /**
        * Return the list of files from this DirectoryScanner that should
        * be included on the command line.
  +     * @param baseDir the File base directory.
  +     * @param ds the DirectoryScanner to use for file scanning.
  +     * @return a String[] containing the filenames.
        */
       protected String[] getFiles(File baseDir, DirectoryScanner ds) {
  -        if (mapper != null) {
  -            SourceFileScanner sfs = new SourceFileScanner(this);
  -            return sfs.restrict(ds.getIncludedFiles(), baseDir, destDir,
  -                                mapper);
  -        } else {
  -            return ds.getIncludedFiles();
  -        }
  +        return restrict(ds.getIncludedFiles(), baseDir);
       }
   
       /**
        * Return the list of Directories from this DirectoryScanner that
        * should be included on the command line.
  +     * @param baseDir the File base directory.
  +     * @param ds the DirectoryScanner to use for file scanning.
  +     * @return a String[] containing the directory names.
        */
       protected String[] getDirs(File baseDir, DirectoryScanner ds) {
  -        if (mapper != null) {
  -            SourceFileScanner sfs = new SourceFileScanner(this);
  -            return sfs.restrict(ds.getIncludedDirectories(), baseDir, destDir,
  -                                mapper);
  -        } else {
  -            return ds.getIncludedDirectories();
  -        }
  +        return restrict(ds.getIncludedDirectories(), baseDir);
       }
   
       /**
        * Return the list of files or directories from this FileList that
        * should be included on the command line.
  +     * @param list the FileList to check.
  +     * @return a String[] containing the directory names.
        *
        * @since Ant 1.6.2
        */
       protected String[] getFilesAndDirs(FileList list) {
  -        if (mapper != null) {
  -            SourceFileScanner sfs = new SourceFileScanner(this);
  -            return sfs.restrict(list.getFiles(getProject()),
  -                                list.getDir(getProject()), destDir,
  -                                mapper);
  -        } else {
  -            return list.getFiles(getProject());
  -        }
  +        return restrict(list.getFiles(getProject()), list.getDir(getProject()));
  +    }
  +
  +    private String[] restrict(String[] s, File baseDir) {
  +        return (mapper == null || force) ? s
  +            : new SourceFileScanner(this).restrict(s, baseDir, destDir, mapper);
       }
   
       /**
  -     * Runs the command in "parallel" mode, making sure that at most
  +     * Run the command in "parallel" mode, making sure that at most
        * maxParallel sourcefiles get passed on the command line.
  -     *
  +     * @param exe the Executable to use.
  +     * @param fileNames the Vector of filenames.
  +     * @param baseDirs the Vector of base directories corresponding to fileNames.
  +     * @throws IOException  on I/O errors.
  +     * @throws BuildException on other errors.
        * @since Ant 1.6
        */
       protected void runParallel(Execute exe, Vector fileNames,
  @@ -654,7 +678,6 @@
                       setupRedirector();
                       redirectorElement.configure(redirector, null);
                   }
  -
                   if (redirectorElement != null || currentOffset > 0) {
                       // need to reset the stream handler to restart
                       // reading of pipes;
  
  
  
  No                   revision
  No                   revision
  1.6.2.2   +10 -2     ant/src/testcases/org/apache/tools/ant/taskdefs/ExecuteOnTest.java
  
  Index: ExecuteOnTest.java
  ===================================================================
  RCS file: /home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/ExecuteOnTest.java,v
  retrieving revision 1.6.2.1
  retrieving revision 1.6.2.2
  diff -u -r1.6.2.1 -r1.6.2.2
  --- ExecuteOnTest.java	23 Jun 2004 19:30:14 -0000	1.6.2.1
  +++ ExecuteOnTest.java	26 Jan 2005 21:48:36 -0000	1.6.2.2
  @@ -1,5 +1,5 @@
   /*
  - * Copyright 2004 The Apache Software Foundation.
  + * Copyright 2004-2005 The Apache Software Foundation.
    *
    *  Licensed under the Apache License, Version 2.0 (the "License");
    *  you may not use this file except in compliance with the License.
  @@ -554,13 +554,21 @@
           executeTarget("ignoremissing");
       }
   
  +    public void testForce() {
  +        executeTarget("force");
  +    }
  +
  +    public void testNoDest() {
  +        executeTarget("testNoDest");
  +    }
  +
       //borrowed from TokenFilterTest
       private String getFileString(String filename) throws IOException {
           String result = null;
           FileReader reader = null;
           try {
               reader = new FileReader(getProject().resolveFile(filename));
  -            result = FileUtils.newFileUtils().readFully(reader);
  +            result = FileUtils.readFully(reader);
           } finally {
               if (reader != null) {
                   try {
  
  
  
  No                   revision
  No                   revision
  1.3.2.4   +57 -4     ant/src/etc/testcases/taskdefs/exec/apply.xml
  
  Index: apply.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/exec/apply.xml,v
  retrieving revision 1.3.2.3
  retrieving revision 1.3.2.4
  diff -u -r1.3.2.3 -r1.3.2.4
  --- apply.xml	13 Jul 2004 16:11:27 -0000	1.3.2.3
  +++ apply.xml	26 Jan 2005 21:49:13 -0000	1.3.2.4
  @@ -313,10 +313,7 @@
           </apply>
       </target>
   
  -    <target name="ignoremissing" depends="init,xyz" if="echo.can.run">
  -        <filelist id="xylist" dir="${basedir}" files="x,y" />
  -        <delete file="z" />
  -
  +    <target name="pad">
           <condition property="pad" value="">
               <or>
                   <not>
  @@ -341,6 +338,12 @@
               </and>
           </condition>
   
  +    </target>
  +
  +    <target name="ignoremissing" depends="init,xyz,pad" if="echo.can.run">
  +        <filelist id="xylist" dir="${basedir}" files="x,y" />
  +        <delete file="z" />
  +
           <pathconvert property="xy" pathsep="${pad}${line.separator}">
               <path>
                   <filelist refid="xylist" />
  @@ -375,6 +378,56 @@
           </fail>
       </target>
   
  +    <target name="force" depends="init,xyz,pad" if="echo.can.run">
  +        <presetdef name="ekko">
  +            <apply executable="echo" append="true" dest="${basedir}">
  +                <filelist refid="xyzlist" />
  +                <mapper type="identity" />
  +            </apply>
  +        </presetdef>
  +
  +        <pathconvert property="xyz" pathsep="${pad}${line.separator}">
  +            <path>
  +                <filelist refid="xyzlist" />
  +            </path>
  +        </pathconvert>
  +
  +        <ekko outputproperty="foo" />
  +        <ekko outputproperty="bar" force="true" />
  +        <fail>
  +            <condition>
  +                <not>
  +                    <and>
  +                        <equals arg1="${foo}" arg2="" />
  +                        <equals arg1="${bar}" arg2="${xyz}" />
  +                    </and>
  +                </not>
  +            </condition>
  +        </fail>
  +    </target>
  +
  +    <target name="testNoDest" depends="init,xyz" if="echo.can.run">
  +      <presetdef name="ekko">
  +        <apply executable="echo" addsourcefile="false" force="true">
  +          <filelist dir="${basedir}" files="x" />
  +          <globmapper from="*" to="${basedir}/*" />
  +          <targetfile />
  +        </apply>
  +      </presetdef>
  +      <ekko outputproperty="dest" dest="${basedir}" />
  +      <ekko outputproperty="nodest" />
  +      <fail>
  +        <condition>
  +          <or>
  +            <available file="${dest}" />
  +            <not>
  +              <available file="${nodest}" />
  +            </not>
  +          </or>
  +        </condition>
  +      </fail>
  +    </target>
  +
       <target name="cleanup">
           <delete>
               <fileset refid="xyz" />
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
For additional commands, e-mail: dev-help@ant.apache.org


Mime
View raw message