bodewig     2003/05/19 05:18:10

  Modified:    .        WHATSNEW build.xml
               docs/manual/CoreTasks apply.html chmod.html
               src/main/org/apache/tools/ant/taskdefs Chmod.java
                        ExecuteOn.java
  Log:
  You can now limit the parallelism of <apply> and <chmod> by using the
  new maxparallel attribute.
  Submitted by: Frank A. Hunleth <fhunleth at cs dot wustl dot edu>
  used in build.xml to fix PR: 17640
  
  With the new addsourcefile attribute, you can make <apply> ommit the
  source file names from the command line.
  PR: 13654
  
  <apply> and <chmod> now support nested <filelist>s as well.
  PR: 15929
  
  <apply> and <chmod> will display a summary if you set the new verbose
  attribute to true.
  PR: 19883
  
  Revision  Changes    Path
  1.421     +12 -0     ant/WHATSNEW
  
  Index: WHATSNEW
  ===================================================================
  RCS file: /home/cvs/ant/WHATSNEW,v
  retrieving revision 1.420
  retrieving revision 1.421
  diff -u -r1.420 -r1.421
  --- WHATSNEW  16 May 2003 09:22:28 -0000      1.420
  +++ WHATSNEW  19 May 2003 12:18:07 -0000      1.421
  @@ -346,6 +346,18 @@
     that can be used to turn of Microsoft extensions while using the jvc
     compiler.  Bugzilla Report 19826.
   
  +* You can now limit the parallelism of <apply> and <chmod> by using the new
  +  maxparallel attribute.
  +
  +* With the new addsourcefile attribute, you can make <apply> ommit the
  +  source file names from the command line.  Bugzilla Report 13654.
  +
  +* <apply> and <chmod> now support nested <filelist>s as well.
  +  Bugzilla Report 15929.
  +
  +* <apply> and <chmod> will display a summary if you set the new
  +  verbose attribute to true.  Bugzilla Report 19883.
  +
   Changes from Ant 1.5.2 to Ant 1.5.3
   ===================================
   
  
  
  
  1.377     +3 -2      ant/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/ant/build.xml,v
  retrieving revision 1.376
  retrieving revision 1.377
  diff -u -r1.376 -r1.377
  --- build.xml 13 May 2003 14:36:59 -0000      1.376
  +++ build.xml 19 May 2003 12:18:07 -0000      1.377
  @@ -26,6 +26,7 @@
   
     <property name="debug" value="true"/>
     <property name="chmod.fail" value="true"/>
  +  <property name="chmod.maxparallel" value="250"/>
     <property name="deprecation" value="false"/>
     <property name="optimize" value="true"/>
     <property name="javac.target" value="1.1"/>
  @@ -963,7 +964,7 @@
       <chmod perm="ugo+rx" dir="${dist.dir}" type="dir" includes="**"
              failonerror="${chmod.fail}"/>
       <chmod perm="ugo+r" dir="${dist.dir}" type="file" includes="**"
  -           failonerror="${chmod.fail}"/>
  +           failonerror="${chmod.fail}" maxparallel="${chmod.maxparallel}"/>
       <chmod perm="ugo+x" type="file" failonerror="${chmod.fail}">
          <fileset dir="${dist.bin}">
            <include name="**/ant"/>
  @@ -1037,7 +1038,7 @@
       <chmod perm="ugo+rx" dir="${dist.dir}" type="dir" includes="**"
              failonerror="${chmod.fail}"/>
       <chmod perm="ugo+r" dir="${dist.dir}" type="file" includes="**"
  -           failonerror="${chmod.fail}"/>
  +           failonerror="${chmod.fail}" maxparallel="${chmod.maxparallel}"/>
       <chmod perm="ugo+x" type="file" failonerror="${chmod.fail}">
          <fileset dir="${dist.bin}">
            <include name="**/ant"/>
  
  
  
  1.21      +33 -5     ant/docs/manual/CoreTasks/apply.html
  
  Index: apply.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTasks/apply.html,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- apply.html        27 Mar 2003 13:22:33 -0000      1.20
  +++ apply.html        19 May 2003 12:18:08 -0000      1.21
  @@ -15,14 +15,15 @@
   the command is only executed when Ant is run on one of the specified 
operating
   systems.</p>
   <p>The files and/or directories of a number of <a
  -href="../CoreTypes/fileset.html">FileSet</a>s are passed as arguments
  +href="../CoreTypes/fileset.html">FileSet</a>s or <a
  +href="../CoreTypes/filelist.html">FileList</a>s are passed as arguments
   to the system command.</p>
   <p>If you specify a nested <a
   href="../CoreTypes/mapper.html">mapper</a> and the <i>dest</i> attribute,
   the timestamp of each source file is compared to the timestamp of a
   target file which is defined by the nested mapper element and searched
   for in the given dest.</p>
  -<p>At least one fileset is required, and you must not specify more than
  +<p>At least one fileset or filelist is required, and you must not specify 
more than
   one mapper.</p>
   <h3>Parameters</h3>
   <table border="1" cellpadding="2" cellspacing="0">
  @@ -53,7 +54,7 @@
       <td valign="top">relative</td>
       <td valign="top">whether the filenames should be passed on the
         command line as absolute or relative pathnames (relative to the
  -      base directory of the corresponding fileset for source files or
  +      base directory of the corresponding fileset/list for source files or
         the <i>dest</i> attribute for target files).</td>
       <td align="center" valign="top">No, default is <i>false</i></td>
     </tr>
  @@ -120,7 +121,8 @@
       <td valign="top">skipemptyfilesets</td>
       <td valign="top">Don't run the command, if no source files have
         been found or are newer than their corresponding target
  -      files.</td>
  +      files.  Despite its name, this attribute applies to filelists as
  +      well.</td>
       <td align="center" valign="top">No, default is <i>false</i></td>
     </tr>
     <tr>
  @@ -158,19 +160,45 @@
           false as well.</td>
       <td align="center" valign="top">No, default is <i>true</i></td>
     </tr>
  +  <tr>
  +    <td valign="top">maxparallel</td>
  +    <td valign="top">Limit the amount of parallelism by passing at
  +      most this many sourcefiles at once.  Set it to &lt;= 0 for
  +      unlimited.  Defaults to unlimited.  <em>Since Ant 1.6.</em></td>
  +    <td align="center" valign="top">No</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">addsourcefile</td>
  +    <td valign="top">Whether source file names should be added to the
  +      command automatically.  Defaults to <code>true</code>.  
  +      <em>Since Ant 1.6.</em></td>
  +    <td align="center" valign="top">No</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">verbose</td>
  +    <td valign="top">Whether to print a summary after execution or not.
  +      Defaults to <code>false</code>.  <em>Since Ant 1.6.</em></td>
  +    <td align="center" valign="top">No</td>
  +  </tr>
   </table>
   <h3>Parameters specified as nested elements</h3>
   <h4>fileset</h4>
   <p>You can use any number of nested <code>&lt;fileset&gt;</code>
   elements to define the files for this task and refer to
   <code>&lt;fileset&gt;</code>s defined elsewhere.</p>
  +<h4>filelist</h4>
  +<p><em>Since Ant 1.6</em></p>
  +<p>You can use any number of nested <code>&lt;filelist&gt;</code>
  +elements to define the files for this task and refer to
  +<code>&lt;filelist&gt;</code>s defined elsewhere.</p>
   <h4>arg</h4>
   <p>Command line arguments should be specified as nested
   <code>&lt;arg&gt;</code> elements. See <a
   href="../using.html#arg">Command line arguments</a>.</p>
   <h4>srcfile</h4>
   <p>By default the file names of the source files will be added to the
  -end of the command line. If you need to place it somewhere different,
  +end of the command line (unless you set addsourcefile to
  +<code>false</code>). If you need to place it somewhere different,
   use a nested <code>&lt;srcfile&gt;</code> element between your
   <code>&lt;arg&gt;</code> elements to mark the insertion point.</p>
   <h4>targetfile</h4>
  
  
  
  1.11      +17 -0     ant/docs/manual/CoreTasks/chmod.html
  
  Index: chmod.html
  ===================================================================
  RCS file: /home/cvs/ant/docs/manual/CoreTasks/chmod.html,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- chmod.html        14 Mar 2003 16:01:03 -0000      1.10
  +++ chmod.html        19 May 2003 12:18:08 -0000      1.11
  @@ -19,6 +19,10 @@
   supports all of FileSet's attributes and nested elements
   directly. More FileSets can be specified using nested
   <code>&lt;fileset&gt;</code> elements.</p>
  +
  +<p>Starting with Ant 1.6, this task also supports nested <a
  +href="../CoreTypes/filelist.html">filelist</a>s.</p>
  +
   <h3>Parameters</h3>
   <table border="1" cellpadding="2" cellspacing="0">
     <tr>
  @@ -73,6 +77,19 @@
         plain files are going to be changed. If set to <i>dir</i>, only
         the directories are considered.</td>
       <td align="center" valign="top">No, default is <i>file</i></td>
  +  </tr>
  +  <tr>
  +    <td valign="top">maxparallel</td>
  +    <td valign="top">Limit the amount of parallelism by passing at
  +      most this many sourcefiles at once.  Set it to &lt;= 0 for
  +      unlimited.  Defaults to unlimited.  <em>Since Ant 1.6.</em></td>
  +    <td align="center" valign="top">No</td>
  +  </tr>
  +  <tr>
  +    <td valign="top">verbose</td>
  +    <td valign="top">Whether to print a summary after execution or not.
  +      Defaults to <code>false</code>.  <em>Since Ant 1.6.</em></td>
  +    <td align="center" valign="top">No</td>
     </tr>
   </table>
   <h3>Examples</h3>
  
  
  
  1.37      +8 -0      ant/src/main/org/apache/tools/ant/taskdefs/Chmod.java
  
  Index: Chmod.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Chmod.java,v
  retrieving revision 1.36
  retrieving revision 1.37
  diff -u -r1.36 -r1.37
  --- Chmod.java        14 Mar 2003 16:01:03 -0000      1.36
  +++ Chmod.java        19 May 2003 12:18:08 -0000      1.37
  @@ -254,6 +254,14 @@
               + " doesn\'t support the skipemptyfileset attribute", 
getLocation());
       }
   
  +    /**
  +     * @ant.attribute ignore="true"
  +     */
  +    public void setAddsourcefile(boolean b) {
  +        throw new BuildException(getTaskType()
  +            + " doesn\'t support the addsourcefile attribute", 
getLocation());
  +    }
  +
       protected boolean isValidOs() {
           return (Os.isFamily("unix") || Os.isFamily("tandem")) 
               && super.isValidOs();
  
  
  
  1.39      +151 -10   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.38
  retrieving revision 1.39
  diff -u -r1.38 -r1.39
  --- ExecuteOn.java    27 Mar 2003 13:14:31 -0000      1.38
  +++ ExecuteOn.java    19 May 2003 12:18:08 -0000      1.39
  @@ -63,6 +63,7 @@
   import org.apache.tools.ant.Project;
   import org.apache.tools.ant.types.Commandline;
   import org.apache.tools.ant.types.EnumeratedAttribute;
  +import org.apache.tools.ant.types.FileList;
   import org.apache.tools.ant.types.FileSet;
   import org.apache.tools.ant.types.Mapper;
   import org.apache.tools.ant.util.FileNameMapper;
  @@ -81,6 +82,7 @@
   public class ExecuteOn extends ExecTask {
   
       protected Vector filesets = new Vector();
  +    private Vector filelists = new Vector();
       private boolean relative = false;
       private boolean parallel = false;
       private boolean forwardSlash = false;
  @@ -91,6 +93,9 @@
       protected Mapper mapperElement = null;
       protected FileNameMapper mapper = null;
       protected File destDir = null;
  +    private int maxParallel = -1;
  +    private boolean addSourceFile = true;
  +    private boolean verbose = false;
   
       /**
        * Has &lt;srcfile&gt; been specified before &lt;targetfile&gt;
  @@ -105,6 +110,13 @@
       }
   
       /**
  +     * Source files to operate upon.
  +     */
  +    public void addFilelist(FileList list) {
  +        filelists.addElement(list);
  +    }
  +
  +    /**
        * 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
  @@ -154,6 +166,38 @@
       }
   
       /**
  +     * Limit the command line length by passing at maximum this many
  +     * sourcefiles at once to the command.
  +     *
  +     * <p>Set to &lt;= 0 for unlimited - this is the default.</p>
  +     *
  +     * @since Ant 1.6
  +     */
  +    public void setMaxParallel(int max) {
  +        maxParallel = max;
  +    }
  +
  +    /**
  +     * Whether to send the source file name on the command line.
  +     *
  +     * <p>Defaults to <code>true</code>.
  +     *
  +     * @since Ant 1.6
  +     */
  +    public void setAddsourcefile(boolean b) {
  +        addSourceFile = b;
  +    }
  +
  +    /**
  +     * Whether to print a verbose summary after execution.
  +     *
  +     * @since Ant 1.6
  +     */
  +    public void setVerbose(boolean b) {
  +        verbose = b;
  +    }
  +
  +    /**
        * Marker that indicates where the name of the source file should
        * be put on the command line.
        */
  @@ -202,8 +246,9 @@
           }
           
           super.checkConfiguration();
  -        if (filesets.size() == 0) {
  -            throw new BuildException("no filesets specified", getLocation());
  +        if (filesets.size() == 0 && filelists.size() == 0) {
  +            throw new BuildException("no filesets and no filelists 
specified",
  +                                     getLocation());
           }
   
           if (targetFilePos != null || mapperElement != null 
  @@ -221,6 +266,9 @@
       }
   
       protected void runExec(Execute exe) throws BuildException {
  +        int totalFiles = 0;
  +        int totalDirs = 0;
  +        boolean haveExecuted = false;
           try {
   
               Vector fileNames = new Vector();
  @@ -233,6 +281,7 @@
                   if (!"dir".equals(type)) {
                       String[] s = getFiles(base, ds);
                       for (int j = 0; j < s.length; j++) {
  +                        totalFiles++;
                           fileNames.addElement(s[j]);
                           baseDirs.addElement(base);
                       }
  @@ -241,6 +290,7 @@
                   if (!"file".equals(type)) {
                       String[] s = getDirs(base, ds);;
                       for (int j = 0; j < s.length; j++) {
  +                        totalDirs++;
                           fileNames.addElement(s[j]);
                           baseDirs.addElement(base);
                       }
  @@ -261,6 +311,50 @@
                               Project.MSG_VERBOSE);
                           exe.setCommandline(command);
                           runExecute(exe);
  +                        haveExecuted = true;
  +                    }
  +                    fileNames.removeAllElements();
  +                    baseDirs.removeAllElements();
  +                }
  +            }
  +
  +            for (int i = 0; i < filelists.size(); i++) {
  +                FileList list = (FileList) filelists.elementAt(i);
  +                File base = list.getDir(getProject());
  +                String[] names = list.getFiles(getProject());
  +
  +                for (int j = 0; j < names.length; j++) {
  +                    File f = new File(base, names[j]);
  +                    if ((f.isFile() && !"dir".equals(type))
  +                        || (f.isDirectory() && !"file".equals(type))) {
  +
  +                        if (f.isFile()) {
  +                            totalFiles++;
  +                        } else {
  +                            totalDirs++;
  +                        }
  +
  +                        fileNames.addElement(names[j]);
  +                        baseDirs.addElement(base);
  +                    }
  +                }
  +
  +                if (fileNames.size() == 0 && skipEmpty) {
  +                    log("Skipping filelist for directory "
  +                        + base + ". It is empty.", Project.MSG_INFO);
  +                    continue;
  +                }
  +
  +                if (!parallel) {
  +                    String[] s = new String[fileNames.size()];
  +                    fileNames.copyInto(s);
  +                    for (int j = 0; j < s.length; j++) {
  +                        String[] command = getCommandline(s[j], base);
  +                        log(Commandline.describeCommand(command), 
  +                            Project.MSG_VERBOSE);
  +                        exe.setCommandline(command);
  +                        runExecute(exe);
  +                        haveExecuted = true;
                       }
                       fileNames.removeAllElements();
                       baseDirs.removeAllElements();
  @@ -268,14 +362,17 @@
               }
   
               if (parallel && (fileNames.size() > 0 || !skipEmpty)) {
  -                String[] s = new String[fileNames.size()];
  -                fileNames.copyInto(s);
  -                File[] b = new File[baseDirs.size()];
  -                baseDirs.copyInto(b);
  -                String[] command = getCommandline(s, b);
  -                log(Commandline.describeCommand(command), 
Project.MSG_VERBOSE);
  -                exe.setCommandline(command);
  -                runExecute(exe);
  +                runParallel(exe, fileNames, baseDirs);
  +                haveExecuted = true;
  +            }
  +
  +            if (haveExecuted) {
  +                log("Applied " + cmdl.getExecutable() + " to "
  +                    + totalFiles + " file"
  +                    + (totalFiles != 1 ? "s" : "") + " and "
  +                    + totalDirs + " director"
  +                    + (totalDirs != 1 ? "ies" : "y") + ".",
  +                    verbose ? Project.MSG_INFO : Project.MSG_VERBOSE);
               }
   
           } catch (IOException e) {
  @@ -321,6 +418,10 @@
           String[] targetFiles = new String[targets.size()];
           targets.copyInto(targetFiles);
           
  +        if (!addSourceFile) {
  +            srcFiles = new String[0];
  +        }
  +
           String[] orig = cmdl.getCommandline();
           String[] result 
               = new String[orig.length + srcFiles.length + targetFiles.length];
  @@ -436,6 +537,46 @@
                                   mapper);
           } else {
               return ds.getIncludedDirectories();
  +        }
  +    }
  +
  +    /**
  +     * Runs the command in "parallel" mode, making sure that at most
  +     * maxParallel sourcefiles get passed on the command line.
  +     *
  +     * @since Ant 1.6
  +     */
  +    protected void runParallel(Execute exe, Vector fileNames, 
  +                               Vector baseDirs)
  +        throws IOException, BuildException {
  +        String[] s = new String[fileNames.size()];
  +        fileNames.copyInto(s);
  +        File[] b = new File[baseDirs.size()];
  +        baseDirs.copyInto(b);
  +
  +        if (maxParallel <= 0 
  +            || s.length == 0 /* this is skipEmpty == false */) {
  +            String[] command = getCommandline(s, b);
  +            log(Commandline.describeCommand(command), Project.MSG_VERBOSE);
  +            exe.setCommandline(command);
  +            runExecute(exe);
  +        } else {
  +            int stillToDo = fileNames.size();
  +            int currentOffset = 0;
  +            while (stillToDo > 0) {
  +                int currentAmount = Math.min(stillToDo, maxParallel);
  +                String[] cs = new String[currentAmount];
  +                System.arraycopy(s, currentOffset, cs, 0, currentAmount);
  +                File[] cb = new File[currentAmount];
  +                System.arraycopy(b, currentOffset, cb, 0, currentAmount);
  +                String[] command = getCommandline(cs, cb);
  +                log(Commandline.describeCommand(command), 
Project.MSG_VERBOSE);
  +                exe.setCommandline(command);
  +                runExecute(exe);
  +
  +                stillToDo -= currentAmount;
  +                currentOffset += currentAmount;
  +            }
           }
       }
   
  
  
  

Reply via email to