diff --git a/src/main/org/apache/tools/ant/taskdefs/Execute.java b/src/main/org/apache/tools/ant/taskdefs/Execute.java index 0096a96cd..603af5d04 100644 --- a/src/main/org/apache/tools/ant/taskdefs/Execute.java +++ b/src/main/org/apache/tools/ant/taskdefs/Execute.java @@ -1,7 +1,7 @@ /* * The Apache Software License, Version 1.1 * - * Copyright (c) 2000-2002 The Apache Software Foundation. All rights + * Copyright (c) 2000-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without @@ -118,8 +118,8 @@ public class Execute { // Mac shellLauncher = new MacCommandLauncher(new CommandLauncher()); } else if (Os.isFamily("os/2")) { - // OS/2 - use same mechanism as Windows 2000 - shellLauncher = new WinNTCommandLauncher(new CommandLauncher()); + // OS/2 + shellLauncher = new OS2CommandLauncher(new CommandLauncher()); } else if (Os.isFamily("windows")) { // Windows. Need to determine which JDK we're running in @@ -690,6 +690,52 @@ public class Execute { private CommandLauncher _launcher; } + /** + * A command launcher for OS/2 that uses 'cmd.exe' when launching + * commands in directories other than the current working + * directory. + * + *
Unlike Windows NT and friends, OS/2's cd doesn't support the + * /d switch to change drives and directories in one go.
+ */ + private static class OS2CommandLauncher extends CommandLauncherProxy { + OS2CommandLauncher(CommandLauncher launcher) { + super(launcher); + } + + /** + * Launches the given command in a new process, in the given working + * directory. + */ + public Process exec(Project project, String[] cmd, String[] env, + File workingDir) throws IOException { + File commandDir = workingDir; + if (workingDir == null) { + if (project != null) { + commandDir = project.getBaseDir(); + } else { + return exec(project, cmd, env); + } + } + + // Use cmd.exe to change to the specified drive and + // directory before running the command + final int preCmdLength = 7; + final String cmdDir = commandDir.getAbsolutePath(); + String[] newcmd = new String[cmd.length + preCmdLength]; + newcmd[0] = "cmd"; + newcmd[1] = "/c"; + newcmd[2] = cmdDir.substring(0, 2); + newcmd[3] = "&&"; + newcmd[4] = "cd"; + newcmd[5] = cmdDir.substring(2); + newcmd[6] = "&&"; + System.arraycopy(cmd, 0, newcmd, preCmdLength, cmd.length); + + return exec(project, newcmd, env); + } + } + /** * A command launcher for Windows XP/2000/NT that uses 'cmd.exe' when * launching commands in directories other than the current working