git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278155 13f79535-47bb-0310-9956-ffa450edef68master
@@ -91,6 +91,12 @@ to send input to it is via the input and inputstring attributes.</p> | |||
executed.</td> | |||
<td align="center" valign="top">No</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">osfamily</td> | |||
<td valign="top">OS family as used in the <os> condition. | |||
<em>since Ant 1.7</em></td> | |||
<td align="center" valign="top">No</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">output</td> | |||
<td valign="top">the file to which the output of the command | |||
@@ -17,7 +17,7 @@ systems.</p> | |||
<p>Note that you cannot interact with the forked program, the only way | |||
to send input to it is via the input and inputstring attributes. Also note that | |||
in Ant 1.6, any attempt to read input in the forked program will receive an | |||
since Ant 1.6, any attempt to read input in the forked program will receive an | |||
EOF (-1). This is a change from Ant 1.5, where such an attempt would block.</p> | |||
@@ -115,7 +115,14 @@ or the task will fail as follows: | |||
<td valign="top">list of Operating Systems on which the command may be | |||
executed. If the current OS's name is contained in this list, the command will | |||
be executed. The OS's name is determined by the Java Virtual machine and is set | |||
in the "os.name" system property.</td> | |||
in the "os.name" system property. | |||
</td> | |||
<td align="center" valign="top">No</td> | |||
</tr> | |||
<tr> | |||
<td valign="top">osfamily</td> | |||
<td valign="top">OS family as used in the <os> condition. | |||
<em>since Ant 1.7</em></td> | |||
<td align="center" valign="top">No</td> | |||
</tr> | |||
<tr> | |||
@@ -329,6 +329,34 @@ | |||
</fail> | |||
</target> | |||
<!-- test will succeed as the OS wont match--> | |||
<target name="testExecUnknownOS"> | |||
<exec executable="nonexistent-program-we-expect" | |||
failonerror="true" | |||
os="ZX81"> | |||
</exec> | |||
</target> | |||
<target name="testExecOSFamily"> | |||
<exec executable="uptime" | |||
failonerror="true" | |||
osFamily="unix"> | |||
</exec> | |||
<exec executable="time" | |||
failonerror="true" | |||
osFamily="nt"> | |||
<arg value="/t" /> | |||
</exec> | |||
</target> | |||
<target name="testExecInconsistentSettings"> | |||
<exec executable="nonexistent-program-we-expect" | |||
failonerror="true" | |||
osFamily="WIN9X" | |||
os="linux unix"> | |||
</exec> | |||
</target> | |||
<target name="cleanup"> | |||
<delete> | |||
<fileset file="${logFile}" /> | |||
@@ -21,10 +21,13 @@ import java.io.File; | |||
import java.io.IOException; | |||
import java.util.Enumeration; | |||
import java.util.Vector; | |||
import java.util.Locale; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.Task; | |||
import org.apache.tools.ant.ProjectComponent; | |||
import org.apache.tools.ant.taskdefs.condition.Os; | |||
import org.apache.tools.ant.types.Commandline; | |||
import org.apache.tools.ant.types.Environment; | |||
import org.apache.tools.ant.types.Path; | |||
@@ -43,6 +46,7 @@ public class ExecTask extends Task { | |||
private static final FileUtils FILE_UTILS = FileUtils.getFileUtils(); | |||
private String os; | |||
private String osFamily; | |||
private File dir; | |||
protected boolean failOnError = false; | |||
@@ -382,6 +386,15 @@ public class ExecTask extends Task { | |||
} | |||
/** | |||
* Restrict this execution to a single OS Family | |||
* @param osFamily | |||
*/ | |||
public void setOsFamily(String osFamily) { | |||
this.osFamily = osFamily.toLowerCase(Locale.US); | |||
} | |||
/** | |||
* The method attempts to figure out where the executable is so that we can feed | |||
* the full path. We first try basedir, then the exec dir, and then | |||
@@ -516,21 +529,33 @@ public class ExecTask extends Task { | |||
* @return boolean. | |||
* <ul> | |||
* <li> | |||
* <code>true</code> if the os under which Ant is running is | |||
* matches one os in the os attribute | |||
* or if the os attribute is null</li> | |||
* <li><code>true</code> if the os and osfamily attributes are null.</li> | |||
* <li><code>true</code> if osfamily is set, and the os family and must match | |||
* that of the current OS, according to the logic of | |||
* {@link Os#isOs(String, String, String, String)}, and the result of the | |||
* <code>os</code> attribute must also evaluate true. | |||
* </li> | |||
* <li> | |||
* <code>true</code> if os is set, and the system.property os.name | |||
* is found in the os attribute,</li> | |||
* <li><code>false</code> otherwise.</li> | |||
* </ul> | |||
*/ | |||
protected boolean isValidOs() { | |||
// test if os match | |||
//hand osfamily off to Os class, if set | |||
if(osFamily!=null && !Os.isOs(osFamily,null,null,null)) { | |||
return false; | |||
} | |||
//the Exec OS check is different from Os.isOs(), which | |||
//probes for a specific OS. Instead it searches the os field | |||
//for the current os.name | |||
String myos = System.getProperty("os.name"); | |||
log("Current OS is " + myos, Project.MSG_VERBOSE); | |||
if ((os != null) && (os.indexOf(myos) < 0)) { | |||
// this command will be executed only on the specified OS | |||
log("This OS, " + myos | |||
+ " was not found in the specified list of valid OSes: " + os, | |||
Project.MSG_VERBOSE); | |||
+ " was not found in the specified list of valid OSes: " + os, | |||
Project.MSG_VERBOSE); | |||
return false; | |||
} | |||
return true; | |||
@@ -383,6 +383,18 @@ public class ExecTaskTest extends BuildFileTest { | |||
assertTrue("log file found after spawn", logFile.exists()); | |||
} | |||
public void testExecUnknownOS() { | |||
executeTarget("testExecUnknownOS"); | |||
} | |||
public void testExecOSFamily() { | |||
executeTarget("testExecOSFamily"); | |||
} | |||
public void testExecInconsistentSettings() { | |||
executeTarget("testExecInconsistentSettings"); | |||
} | |||
private static class MonitoredBuild implements Runnable { | |||
private Thread worker; | |||
private File myBuildFile = null; | |||