You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by bo...@apache.org on 2012/03/16 17:10:21 UTC
svn commit: r1301622 - in
/hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common:
./ src/main/java/org/apache/hadoop/fs/shell/
src/test/java/org/apache/hadoop/fs/
Author: bobby
Date: Fri Mar 16 16:10:20 2012
New Revision: 1301622
URL: http://svn.apache.org/viewvc?rev=1301622&view=rev
Log:
svn merge -c 1301612 from trunk to branch-0.23.2 FIXES HADOOP-8176. Disambiguate the destination of FsShell copies (Daryn Sharp via bobby)
Modified:
hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/CHANGES.txt
hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java
hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/PathData.java
hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShellCopy.java
Modified: hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1301622&r1=1301621&r2=1301622&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/CHANGES.txt (original)
+++ hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/CHANGES.txt Fri Mar 16 16:10:20 2012
@@ -94,6 +94,9 @@ Release 0.23.2 - UNRELEASED
HADOOP-8175. Add -p option to mkdir in FsShell. (Daryn Sharp via szetszwo)
+ HADOOP-8176. Disambiguate the destination of FsShell copies (Daryn Sharp
+ via bobby)
+
Release 0.23.1 - 2012-02-17
INCOMPATIBLE CHANGES
Modified: hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java?rev=1301622&r1=1301621&r2=1301622&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java (original)
+++ hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java Fri Mar 16 16:10:20 2012
@@ -200,6 +200,8 @@ abstract class CommandWithDestination ex
// a child path if dst is a dir; after recursion, it's always a dir
if ((getDepth() > 0) || (dst.exists && dst.stat.isDirectory())) {
target = dst.getPathDataForChild(src);
+ } else if (dst.representsDirectory()) { // see if path looks like a dir
+ target = dst.getPathDataForChild(src);
} else {
target = dst;
}
Modified: hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/PathData.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/PathData.java?rev=1301622&r1=1301621&r2=1301622&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/PathData.java (original)
+++ hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/PathData.java Fri Mar 16 16:10:20 2012
@@ -188,12 +188,21 @@ public class PathData implements Compara
* @throws IOException upon unexpected error
*/
public boolean parentExists() throws IOException {
+ return representsDirectory()
+ ? fs.exists(path) : fs.exists(path.getParent());
+ }
+
+ /**
+ * Check if the path represents a directory as determined by the basename
+ * being "." or "..", or the path ending with a directory separator
+ * @return boolean if this represents a directory
+ */
+ public boolean representsDirectory() {
String uriPath = uri.getPath();
String name = uriPath.substring(uriPath.lastIndexOf("/")+1);
// Path will munch off the chars that indicate a dir, so there's no way
// to perform this test except by examining the raw basename we maintain
- return (name.isEmpty() || name.equals(".") || name.equals(".."))
- ? fs.exists(path) : fs.exists(path.getParent());
+ return (name.isEmpty() || name.equals(".") || name.equals(".."));
}
/**
Modified: hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShellCopy.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShellCopy.java?rev=1301622&r1=1301621&r2=1301622&view=diff
==============================================================================
--- hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShellCopy.java (original)
+++ hadoop/common/branches/branch-0.23.2/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestFsShellCopy.java Fri Mar 16 16:10:20 2012
@@ -226,6 +226,54 @@ public class TestFsShellCopy {
}
@Test
+ public void testRepresentsDir() throws Exception {
+ Path subdirDstPath = new Path(dstPath, srcPath.getName());
+ String argv[] = null;
+ lfs.delete(dstPath, true);
+ assertFalse(lfs.exists(dstPath));
+
+ argv = new String[]{ "-put", srcPath.toString(), dstPath.toString() };
+ assertEquals(0, shell.run(argv));
+ assertTrue(lfs.exists(dstPath) && lfs.isFile(dstPath));
+
+ lfs.delete(dstPath, true);
+ assertFalse(lfs.exists(dstPath));
+
+ // since dst path looks like a dir, it should not copy the file and
+ // rename it to what looks like a directory
+ lfs.delete(dstPath, true); // make copy fail
+ for (String suffix : new String[]{ "/", "/." } ) {
+ argv = new String[]{
+ "-put", srcPath.toString(), dstPath.toString()+suffix };
+ assertEquals(1, shell.run(argv));
+ assertFalse(lfs.exists(dstPath));
+ assertFalse(lfs.exists(subdirDstPath));
+ }
+
+ // since dst path looks like a dir, it should not copy the file and
+ // rename it to what looks like a directory
+ for (String suffix : new String[]{ "/", "/." } ) {
+ // empty out the directory and create to make copy succeed
+ lfs.delete(dstPath, true);
+ lfs.mkdirs(dstPath);
+ argv = new String[]{
+ "-put", srcPath.toString(), dstPath.toString()+suffix };
+ assertEquals(0, shell.run(argv));
+ assertTrue(lfs.exists(subdirDstPath));
+ assertTrue(lfs.isFile(subdirDstPath));
+ }
+
+ // ensure .. is interpreted as a dir
+ String dotdotDst = dstPath+"/foo/..";
+ lfs.delete(dstPath, true);
+ lfs.mkdirs(new Path(dstPath, "foo"));
+ argv = new String[]{ "-put", srcPath.toString(), dotdotDst };
+ assertEquals(0, shell.run(argv));
+ assertTrue(lfs.exists(subdirDstPath));
+ assertTrue(lfs.isFile(subdirDstPath));
+ }
+
+ @Test
public void testCopyMerge() throws Exception {
Path root = new Path(testRootDir, "TestMerge");
Path f1 = new Path(root, "f1");