[FLINK-1848] Fix for file paths with Windows drive letters

This closes #712


Project: http://git-wip-us.apache.org/repos/asf/flink/repo
Commit: http://git-wip-us.apache.org/repos/asf/flink/commit/7164b2b6
Tree: http://git-wip-us.apache.org/repos/asf/flink/tree/7164b2b6
Diff: http://git-wip-us.apache.org/repos/asf/flink/diff/7164b2b6

Branch: refs/heads/master
Commit: 7164b2b643985b99c6688b62174de42a71deb71b
Parents: 21207fd
Author: Fabian Hueske <fhue...@apache.org>
Authored: Thu May 21 22:24:12 2015 +0200
Committer: Fabian Hueske <fhue...@apache.org>
Committed: Wed May 27 00:39:08 2015 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/flink/core/fs/Path.java    |  6 +++++-
 .../org/apache/flink/core/fs/local/LocalFileSystem.java |  7 ++++++-
 .../test/java/org/apache/flink/core/fs/PathTest.java    | 12 ++++++++++++
 3 files changed, 23 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flink/blob/7164b2b6/flink-core/src/main/java/org/apache/flink/core/fs/Path.java
----------------------------------------------------------------------
diff --git a/flink-core/src/main/java/org/apache/flink/core/fs/Path.java 
b/flink-core/src/main/java/org/apache/flink/core/fs/Path.java
index 75155eb..c47bc0d 100644
--- a/flink-core/src/main/java/org/apache/flink/core/fs/Path.java
+++ b/flink-core/src/main/java/org/apache/flink/core/fs/Path.java
@@ -260,7 +260,11 @@ public class Path implements IOReadableWritable, 
Serializable {
                path = path.replaceAll("/+", "/");
 
                // remove tailing separator
-               if(!path.equals(SEPARATOR) && path.endsWith(SEPARATOR)) {
+               if(!path.equals(SEPARATOR) &&                   // UNIX root 
path
+                               !path.matches("/\\p{Alpha}+:/") &&  // Windows 
root path
+                               path.endsWith(SEPARATOR))
+               {
+                       // remove tailing slash
                        path = path.substring(0, path.length() - 
SEPARATOR.length());
                }
 

http://git-wip-us.apache.org/repos/asf/flink/blob/7164b2b6/flink-core/src/main/java/org/apache/flink/core/fs/local/LocalFileSystem.java
----------------------------------------------------------------------
diff --git 
a/flink-core/src/main/java/org/apache/flink/core/fs/local/LocalFileSystem.java 
b/flink-core/src/main/java/org/apache/flink/core/fs/local/LocalFileSystem.java
index 2313a41..9dd9e30 100644
--- 
a/flink-core/src/main/java/org/apache/flink/core/fs/local/LocalFileSystem.java
+++ 
b/flink-core/src/main/java/org/apache/flink/core/fs/local/LocalFileSystem.java
@@ -228,8 +228,13 @@ public class LocalFileSystem extends FileSystem {
         */
        public boolean mkdirs(final Path f) throws IOException {
 
-               final Path parent = f.getParent();
                final File p2f = pathToFile(f);
+
+               if(p2f.isDirectory()) {
+                       return true;
+               }
+
+               final Path parent = f.getParent();
                return (parent == null || mkdirs(parent)) && (p2f.mkdir() || 
p2f.isDirectory());
        }
 

http://git-wip-us.apache.org/repos/asf/flink/blob/7164b2b6/flink-core/src/test/java/org/apache/flink/core/fs/PathTest.java
----------------------------------------------------------------------
diff --git a/flink-core/src/test/java/org/apache/flink/core/fs/PathTest.java 
b/flink-core/src/test/java/org/apache/flink/core/fs/PathTest.java
index 8fa2cea..66816ad 100644
--- a/flink-core/src/test/java/org/apache/flink/core/fs/PathTest.java
+++ b/flink-core/src/test/java/org/apache/flink/core/fs/PathTest.java
@@ -117,12 +117,24 @@ public class PathTest {
                p = new Path("y:/my/abs/windows/path");
                assertTrue(p.isAbsolute());
 
+               p = new Path("/y:/my/abs/windows/path");
+               assertTrue(p.isAbsolute());
+
                p = new Path("b:\\my\\abs\\windows\\path");
                assertTrue(p.isAbsolute());
 
+               p = new Path("/c:/my/dir");
+               assertTrue(p.isAbsolute());
+
+               p = new Path("/C:/");
+               assertTrue(p.isAbsolute());
+
                p = new Path("C:");
                assertFalse(p.isAbsolute());
 
+               p = new Path("C:/");
+               assertTrue(p.isAbsolute());
+
                p = new Path("C:my\\relative\\path");
                assertFalse(p.isAbsolute());
 

Reply via email to