You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pig.apache.org by da...@apache.org on 2012/10/31 23:20:17 UTC

svn commit: r1404388 - in /pig/branches/branch-0.10: CHANGES.txt src/org/apache/pig/impl/streaming/ExecutableManager.java src/org/apache/pig/tools/grunt/GruntParser.java

Author: daijy
Date: Wed Oct 31 22:20:16 2012
New Revision: 1404388

URL: http://svn.apache.org/viewvc?rev=1404388&view=rev
Log:
PIG-2801:  grunt "sh" command should invoke the shell implicitly instead of calling exec directly with the command tokens
(jgordon via daijy)

Modified:
    pig/branches/branch-0.10/CHANGES.txt
    pig/branches/branch-0.10/src/org/apache/pig/impl/streaming/ExecutableManager.java
    pig/branches/branch-0.10/src/org/apache/pig/tools/grunt/GruntParser.java

Modified: pig/branches/branch-0.10/CHANGES.txt
URL: http://svn.apache.org/viewvc/pig/branches/branch-0.10/CHANGES.txt?rev=1404388&r1=1404387&r2=1404388&view=diff
==============================================================================
--- pig/branches/branch-0.10/CHANGES.txt (original)
+++ pig/branches/branch-0.10/CHANGES.txt Wed Oct 31 22:20:16 2012
@@ -36,6 +36,9 @@ PIG-2727: PigStorage Source tagging does
 
 BUG FIXES
 
+PIG-2801:  grunt "sh" command should invoke the shell implicitly instead of calling exec directly with the command tokens
+(jgordon via daijy)
+
 PIG-2800: pig.additional.jars path separator should align with File.pathSeparator instead of being hard-coded to ":"
 (jgordon via azaroth)
 

Modified: pig/branches/branch-0.10/src/org/apache/pig/impl/streaming/ExecutableManager.java
URL: http://svn.apache.org/viewvc/pig/branches/branch-0.10/src/org/apache/pig/impl/streaming/ExecutableManager.java?rev=1404388&r1=1404387&r2=1404388&view=diff
==============================================================================
--- pig/branches/branch-0.10/src/org/apache/pig/impl/streaming/ExecutableManager.java (original)
+++ pig/branches/branch-0.10/src/org/apache/pig/impl/streaming/ExecutableManager.java Wed Oct 31 22:20:16 2012
@@ -214,14 +214,6 @@ public class ExecutableManager {
         String cwd = (dir != null) ? dir.getAbsolutePath() : System
                 .getProperty("user.dir");
 
-        if (System.getProperty("os.name").toUpperCase().startsWith("WINDOWS")) {
-            String unixCwd = FileLocalizer.parseCygPath(cwd, FileLocalizer.STYLE_UNIX);
-            if (unixCwd == null)
-                throw new RuntimeException(
-                        "Can not convert Windows path to Unix path under cygwin");
-            cwd = unixCwd;
-        }
-
         String envPath = env.get(PATH);
         if (envPath == null) {
             envPath = cwd;
@@ -243,12 +235,19 @@ public class ExecutableManager {
     protected void exec() throws IOException {
         // Set the actual command to run with 'bash -c exec ...'
         List<String> cmdArgs = new ArrayList<String>();
-        cmdArgs.add(BASH);
-        cmdArgs.add("-c");
-        StringBuffer sb = new StringBuffer();
-        sb.append("exec ");
-        sb.append(argvAsString);
-        cmdArgs.add(sb.toString());
+
+        if (System.getProperty("os.name").toUpperCase().startsWith("WINDOWS")) {
+          cmdArgs.add("cmd");
+          cmdArgs.add("/c");
+          cmdArgs.add(argvAsString);
+        } else {
+          cmdArgs.add(BASH);
+          cmdArgs.add("-c");
+          StringBuffer sb = new StringBuffer();
+          sb.append("exec ");
+          sb.append(argvAsString);
+          cmdArgs.add(sb.toString());
+        }
 
         // Start the external process
         ProcessBuilder processBuilder = new ProcessBuilder(cmdArgs

Modified: pig/branches/branch-0.10/src/org/apache/pig/tools/grunt/GruntParser.java
URL: http://svn.apache.org/viewvc/pig/branches/branch-0.10/src/org/apache/pig/tools/grunt/GruntParser.java?rev=1404388&r1=1404387&r2=1404388&view=diff
==============================================================================
--- pig/branches/branch-0.10/src/org/apache/pig/tools/grunt/GruntParser.java (original)
+++ pig/branches/branch-0.10/src/org/apache/pig/tools/grunt/GruntParser.java Wed Oct 31 22:20:16 2012
@@ -32,6 +32,7 @@ import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.util.AbstractList;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.Enumeration;
@@ -1024,7 +1025,34 @@ public class GruntParser extends PigScri
             try {
                 executeBatch();
                 
-                Process executor = Runtime.getRuntime().exec(cmdTokens);
+                // For sh command, create a process with the following syntax
+                // <shell exe> <invoke arg> <command-as-string>
+                String  shellName = "sh";
+                String  shellInvokeArg = "-c";
+
+                // Insert cmd /C in front of the array list to execute to
+                // support built-in shell commands like mkdir on Windows
+                if (System.getProperty("os.name").startsWith("Windows")) {
+                    shellName      = "cmd";
+                    shellInvokeArg = "/C";
+                }
+
+                List<String> stringList = new ArrayList<String>();
+                stringList.add(shellName);
+                stringList.add(shellInvokeArg);
+
+                StringBuffer commandString = new StringBuffer();
+                for (String currToken : cmdTokens) {
+                    commandString.append(" ");
+                    commandString.append(currToken);
+                }
+
+                stringList.add(commandString.toString());
+
+                String[] newCmdTokens = stringList.toArray(new String[0]);
+
+                Process executor = Runtime.getRuntime().exec(newCmdTokens);
+
                 StreamPrinter outPrinter = new StreamPrinter(executor.getInputStream(), null, System.out);
                 StreamPrinter errPrinter = new StreamPrinter(executor.getErrorStream(), null, System.err);