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 <= 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><fileset></code> elements to define the files for this task and refer to <code><fileset></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><filelist></code> +elements to define the files for this task and refer to +<code><filelist></code>s defined elsewhere.</p> <h4>arg</h4> <p>Command line arguments should be specified as nested <code><arg></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><srcfile></code> element between your <code><arg></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><fileset></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 <= 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 <srcfile> been specified before <targetfile> @@ -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 <= 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; + } } }