bodewig 2003/09/25 05:36:31 Modified: docs/manual/CoreTasks Tag: ANT_16_BRANCH exec.html src/main/org/apache/tools/ant Tag: ANT_16_BRANCH DirectoryScanner.java src/main/org/apache/tools/ant/taskdefs Tag: ANT_16_BRANCH Execute.java src/main/org/apache/tools/ant/util Tag: ANT_16_BRANCH FileUtils.java Log: Merge with HEAD Revision Changes Path No revision No revision 1.34.2.1 +14 -7 ant/docs/manual/CoreTasks/exec.html Index: exec.html =================================================================== RCS file: /home/cvs/ant/docs/manual/CoreTasks/exec.html,v retrieving revision 1.34 retrieving revision 1.34.2.1 diff -u -r1.34 -r1.34.2.1 --- exec.html 19 Sep 2003 08:44:22 -0000 1.34 +++ exec.html 25 Sep 2003 12:36:31 -0000 1.34.2.1 @@ -20,20 +20,27 @@ </p> <h4>OpenVMS Users</h4> - <p>The command specified using <code>executable</code> and <code><arg></code> elements is executed exactly as specified -inside a temporary DCL script. This means that paths have to be -written in VMS style. It is also required that the logical -<code>JAVA$FORK_SUPPORT_CHDIR</code> is set to <code>TRUE</code> (see -the <i>JDK Release Notes</i>).</p> - +inside a temporary DCL script. This has some implications: +<ul> +<li>paths have to be written in VMS style</li> +<li>if your <code>executable</code> points to a DCL script remember to +prefix it with an <code>@</code>-sign +(e.g. <code>executable="@[FOO]BAR.COM"</code>), just as you would in a +DCL script</li> +</ul> +For <code><exec></code> to work in an environment with a Java VM +older than version 1.4.1-2 it is also <i>required</i> that the logical +<code>JAVA$FORK_SUPPORT_CHDIR</code> is set to <code>TRUE</code> in +the job table (see the <i>JDK Release Notes</i>).</p> + <p>Please note that the Java VM provided by HP doesn't follow OpenVMS' conventions of exit codes. If you run a Java VM with this task, the task may falsely claim that an error occured (or silently ignore an error). Don't use this task to run <code>JAVA.EXE</code>, use a <code><java></code> task with the <code>fork</code> attribute -set ti <code>true</code> instead as this task will follow the VM's +set to <code>true</code> instead as this task will follow the VM's interpretation of exit codes.</p> <h3>Parameters</h3> No revision No revision 1.64.2.1 +4 -1 ant/src/main/org/apache/tools/ant/DirectoryScanner.java Index: DirectoryScanner.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/DirectoryScanner.java,v retrieving revision 1.64 retrieving revision 1.64.2.1 diff -u -r1.64 -r1.64.2.1 --- DirectoryScanner.java 13 Sep 2003 12:58:33 -0000 1.64 +++ DirectoryScanner.java 25 Sep 2003 12:36:31 -0000 1.64.2.1 @@ -65,6 +65,7 @@ import java.util.Set; import java.util.Vector; +import org.apache.tools.ant.taskdefs.condition.Os; import org.apache.tools.ant.types.Resource; import org.apache.tools.ant.types.ResourceFactory; import org.apache.tools.ant.types.selectors.FileSelector; @@ -163,6 +164,8 @@ public class DirectoryScanner implements FileScanner, SelectorScanner, ResourceFactory { + /** Is OpenVMS the operating system we're running on? */ + private static final boolean ON_VMS = Os.isFamily("openvms"); /** * Patterns which should be excluded by default. @@ -725,7 +728,7 @@ File canonFile = myfile.getCanonicalFile(); String path = fileUtils.removeLeadingPath(canonBase, canonFile); - if (!path.equals(currentelement)) { + if (!path.equals(currentelement) || ON_VMS) { myfile = findFile(basedir, currentelement); if (myfile != null) { currentelement = No revision No revision 1.68.2.1 +32 -8 ant/src/main/org/apache/tools/ant/taskdefs/Execute.java Index: Execute.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/Execute.java,v retrieving revision 1.68 retrieving revision 1.68.2.1 diff -u -r1.68 -r1.68.2.1 --- Execute.java 19 Sep 2003 08:31:06 -0000 1.68 +++ Execute.java 25 Sep 2003 12:36:31 -0000 1.68.2.1 @@ -621,6 +621,13 @@ * @return the patched environment */ private String[] patchEnvironment() { + // On OpenVMS Runtime#exec() doesn't support the environment array, + // so we only return the new values which then will be set in + // the generated DCL script, inheriting the parent process environment + if (Os.isFamily("openvms")) { + return env; + } + Vector osEnv = (Vector) getProcEnvironment().clone(); for (int i = 0; i < env.length; i++) { int pos = env[i].indexOf('='); @@ -1119,7 +1126,7 @@ */ public Process exec(Project project, String[] cmd, String[] env) throws IOException { - String[] vmsCmd = {createCommandFile(cmd).getPath()}; + String[] vmsCmd = {createCommandFile(cmd, env).getPath()}; return super.exec(project, vmsCmd, env); } @@ -1131,7 +1138,7 @@ */ public Process exec(Project project, String[] cmd, String[] env, File workingDir) throws IOException { - String[] vmsCmd = {createCommandFile(cmd).getPath()}; + String[] vmsCmd = {createCommandFile(cmd, env).getPath()}; return super.exec(project, vmsCmd, env, workingDir); } @@ -1139,17 +1146,34 @@ * Writes the command into a temporary DCL script and returns the * corresponding File object. The script will be deleted on exit. */ - private File createCommandFile(String[] cmd) throws IOException { + private File createCommandFile(String[] cmd, String[] env) + throws IOException { File script = File.createTempFile("ANT", ".COM"); script.deleteOnExit(); PrintWriter out = null; try { out = new PrintWriter(new FileWriter(script)); - StringBuffer dclCmd = new StringBuffer("$"); - for (int i = 0; i < cmd.length; i++) { - dclCmd.append(' ').append(cmd[i]); + + // add the environment as logicals to the DCL script + if (env != null) { + int eqIndex; + for (int i = 1; i < env.length ; i++) { + eqIndex = env[i].indexOf('='); + if (eqIndex != -1) { + out.print("$ DEFINE/NOLOG "); + out.print(env[i].substring(0, eqIndex)); + out.print(" \""); + out.print(env[i].substring(eqIndex + 1)); + out.println('\"'); + } + } + } + + out.print("$ " + cmd[0]); + for (int i = 1; i < cmd.length ; i++) { + out.println(" -"); + out.print(cmd[i]); } - out.println(dclCmd.toString()); } finally { if (out != null) { out.close(); No revision No revision 1.56.2.1 +62 -1 ant/src/main/org/apache/tools/ant/util/FileUtils.java Index: FileUtils.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/FileUtils.java,v retrieving revision 1.56 retrieving revision 1.56.2.1 diff -u -r1.56 -r1.56.2.1 --- FileUtils.java 21 Sep 2003 20:20:03 -0000 1.56 +++ FileUtils.java 25 Sep 2003 12:36:31 -0000 1.56.2.1 @@ -824,6 +824,8 @@ * <li>DOS style paths that start with a drive letter will have * \ as the separator.</li> * </ul> + * Unlike <code>File#getCanonicalPath()</code> it specifically doesn't + * resolve symbolic links. * * @param path the path to be normalized * @return the normalized version of the path. @@ -935,6 +937,65 @@ path = path.replace('/', '\\'); } return new File(path); + } + + /** + * Returns a VMS String representation of a <code>File</code> object. + * This is useful since the JVM by default internally converts VMS paths + * to Unix style. + * The returned String is always an absolute path. + * + * @param f The <code>File</code> to get the VMS path for. + * @return The absolute VMS path to <code>f</code>. + */ + public String toVMSPath(File f) { + // format: "DEVICE:[DIR.SUBDIR]FILE" + String osPath; + String path = normalize(f.getAbsolutePath()).getPath(); + String name = f.getName(); + boolean isAbsolute = path.charAt(0) == File.separatorChar; + // treat directories specified using .DIR syntax as files + boolean isDirectory = f.isDirectory() && + !name.regionMatches(true, name.length() - 4, ".DIR", 0, 4); + + String device = null; + StringBuffer directory = null; + String file = null; + + int index = 0; + + if (isAbsolute) { + index = path.indexOf(File.separatorChar, 1); + if (index == -1) { + return path.substring(1) + ":[000000]"; + } else { + device = path.substring(1, index++); + } + } + if (isDirectory) { + directory = new StringBuffer(path.substring(index). + replace(File.separatorChar, '.')); + } else { + int dirEnd = + path.lastIndexOf(File.separatorChar, path.length()); + if (dirEnd == -1 || dirEnd < index) { + file = path.substring(index); + } else { + directory = new StringBuffer(path.substring(index, dirEnd). + replace(File.separatorChar, '.')); + index = dirEnd + 1; + if (path.length() > index) { + file = path.substring(index); + } + } + } + if (!isAbsolute && directory != null) { + directory.insert(0, '.'); + } + osPath = ((device != null) ? device + ":" : "") + + ((directory != null) ? "[" + directory + "]" : "") + + ((file != null) ? file : ""); + return osPath; } /**
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]