Browse Source

HADOOP-3175. Fix FsShell.CommandFormat to handle - in arguments. (Edward J. Yoon via rangadi)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/core/branches/branch-0.17@646478 13f79535-47bb-0310-9956-ffa450edef68
Raghu Angadi 17 years ago
parent
commit
c96821b61f

+ 3 - 0
CHANGES.txt

@@ -530,6 +530,9 @@ Release 0.17.0 - Unreleased
     since cygwin symlinks are unsupported.
     (Mahadev konar via cdouglas)
 
+    HADOOP-3175. Fix FsShell.CommandFormat to handle "-" in arguments.
+    (Edward J. Yoon via rangadi)
+
 Release 0.16.3 - Unreleased
 
   BUG FIXES

+ 2 - 2
src/java/org/apache/hadoop/fs/FsShell.java

@@ -428,7 +428,7 @@ public class FsShell extends Configured implements Tool {
     final int minPar, maxPar;
     final Map<String, Boolean> options = new HashMap<String, Boolean>();
 
-    private CommandFormat(String n, int min, int max, String ... possibleOpt) {
+    CommandFormat(String n, int min, int max, String ... possibleOpt) {
       name = n;
       minPar = min;
       maxPar = max;
@@ -439,7 +439,7 @@ public class FsShell extends Configured implements Tool {
     List<String> parse(String[] args, int pos) {
       List<String> parameters = new ArrayList<String>();
       for(; pos < args.length; pos++) {
-        if (args[pos].charAt(0) == '-') {
+        if (args[pos].charAt(0) == '-' && args[pos].length() > 1) {
           String opt = args[pos].substring(1);
           if (options.containsKey(opt))
             options.put(opt, Boolean.TRUE);

+ 16 - 0
src/test/org/apache/hadoop/fs/TestFileSystem.java

@@ -31,6 +31,7 @@ import org.apache.commons.logging.Log;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
 import org.apache.hadoop.dfs.MiniDFSCluster;
+import org.apache.hadoop.fs.FsShell.CommandFormat;
 import org.apache.hadoop.io.LongWritable;
 import org.apache.hadoop.io.SequenceFile;
 import org.apache.hadoop.io.UTF8;
@@ -85,6 +86,21 @@ public class TestFileSystem extends TestCase {
     fs.delete(READ_DIR, true);
   }
 
+  public static void testCommandFormat() throws Exception {
+    // This should go to TestFsShell.java when it is added.
+    CommandFormat cf;
+    cf= new CommandFormat("copyToLocal", 2,2,"crc","ignoreCrc");
+    assertEquals(cf.parse(new String[] {"-get","file", "-"}, 1).get(1), "-");
+    assertEquals(cf.parse(new String[] {"-get","file","-ignoreCrc","/foo"}, 1).get(1),"/foo");
+    cf = new CommandFormat("tail", 1, 1, "f");
+    assertEquals(cf.parse(new String[] {"-tail","fileName"}, 1).get(0),"fileName");
+    assertEquals(cf.parse(new String[] {"-tail","-f","fileName"}, 1).get(0),"fileName");
+    cf = new CommandFormat("setrep", 2, 2, "R", "w");
+    assertEquals(cf.parse(new String[] {"-setrep","-R","2","/foo/bar"}, 1).get(1), "/foo/bar");
+    cf = new CommandFormat("put", 2, 10000);
+    assertEquals(cf.parse(new String[] {"-put", "-", "dest"}, 1).get(1), "dest"); 
+  }
+
   public static void createControlFile(FileSystem fs,
                                        long megaBytes, int numFiles,
                                        long seed) throws Exception {