This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-io.git


The following commit(s) were added to refs/heads/master by this push:
     new 558e930  [IO-600] Fix getPrefixLength method for Linux filename (#179)
558e930 is described below

commit 558e930612120d8594fa3cdbca15788da19c184c
Author: Abhyankar Chaubey <abhyankar.chau...@gmail.com>
AuthorDate: Fri Jan 1 06:40:17 2021 +0800

    [IO-600] Fix getPrefixLength method for Linux filename (#179)
    
    * IO-600: fix getPrefixLength method for Linux filename
    
    * IO-600: fix javadoc
---
 .../java/org/apache/commons/io/FilenameUtils.java  | 34 +++++++++++---------
 .../apache/commons/io/FilenameUtilsTestCase.java   | 37 +++++++++++++++++++---
 2 files changed, 52 insertions(+), 19 deletions(-)

diff --git a/src/main/java/org/apache/commons/io/FilenameUtils.java 
b/src/main/java/org/apache/commons/io/FilenameUtils.java
index 478a1e3..bd92853 100644
--- a/src/main/java/org/apache/commons/io/FilenameUtils.java
+++ b/src/main/java/org/apache/commons/io/FilenameUtils.java
@@ -605,22 +605,23 @@ public class FilenameUtils {
      * than the length of the input string.
      * <pre>
      * Windows:
-     * a\b\c.txt           --&gt; ""          --&gt; relative
-     * \a\b\c.txt          --&gt; "\"         --&gt; current drive absolute
-     * C:a\b\c.txt         --&gt; "C:"        --&gt; drive relative
-     * C:\a\b\c.txt        --&gt; "C:\"       --&gt; absolute
-     * \\server\a\b\c.txt  --&gt; "\\server\" --&gt; UNC
-     * \\\a\b\c.txt        --&gt;  error, length = -1
+     * a\b\c.txt           --&gt; 0           --&gt; relative
+     * \a\b\c.txt          --&gt; 1           --&gt; current drive absolute
+     * C:a\b\c.txt         --&gt; 2           --&gt; drive relative
+     * C:\a\b\c.txt        --&gt; 3           --&gt; absolute
+     * \\server\a\b\c.txt  --&gt; 9           --&gt; UNC
+     * \\\a\b\c.txt        --&gt; -1          --&gt; error
      *
      * Unix:
-     * a/b/c.txt           --&gt; ""          --&gt; relative
-     * /a/b/c.txt          --&gt; "/"         --&gt; absolute
-     * ~/a/b/c.txt         --&gt; "~/"        --&gt; current user
-     * ~                   --&gt; "~/"        --&gt; current user (slash added)
-     * ~user/a/b/c.txt     --&gt; "~user/"    --&gt; named user
-     * ~user               --&gt; "~user/"    --&gt; named user (slash added)
-     * //server/a/b/c.txt  --&gt; "//server/"
-     * ///a/b/c.txt        --&gt; error, length = -1
+     * a/b/c.txt           --&gt; 0           --&gt; relative
+     * /a/b/c.txt          --&gt; 1           --&gt; absolute
+     * ~/a/b/c.txt         --&gt; 2           --&gt; current user
+     * ~                   --&gt; 2           --&gt; current user (slash added)
+     * ~user/a/b/c.txt     --&gt; 6           --&gt; named user
+     * ~user               --&gt; 6           --&gt; named user (slash added)
+     * //server/a/b/c.txt  --&gt; 9
+     * ///a/b/c.txt        --&gt; -1          --&gt; error
+     * C:                  --&gt; 0           --&gt; valid filename as only 
null byte and / are reserved characters
      * </pre>
      * <p>
      * The output will be the same irrespective of the machine that the code 
is running on.
@@ -665,7 +666,10 @@ public class FilenameUtils {
         if (ch1 == ':') {
             ch0 = Character.toUpperCase(ch0);
             if (ch0 >= 'A' && ch0 <= 'Z') {
-                if (len == 2 || isSeparator(fileName.charAt(2)) == false) {
+                if (len == 2 && 
!FileSystem.getCurrent().supportsDriveLetter()) {
+                    return 0;
+                }
+                if (len == 2 || !isSeparator(fileName.charAt(2))) {
                     return 2;
                 }
                 return 3;
diff --git a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java 
b/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
index 2fe5028..5a6599e 100644
--- a/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
+++ b/src/test/java/org/apache/commons/io/FilenameUtilsTestCase.java
@@ -31,6 +31,7 @@ import java.util.Arrays;
 import java.util.Collection;
 
 import org.apache.commons.io.test.TestUtils;
+import org.apache.commons.lang3.SystemUtils;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.io.TempDir;
@@ -554,7 +555,14 @@ public class FilenameUtilsTestCase {
 
         assertEquals(0, FilenameUtils.getPrefixLength(""));
         assertEquals(1, FilenameUtils.getPrefixLength("\\"));
-        assertEquals(2, FilenameUtils.getPrefixLength("C:"));
+
+        if (SystemUtils.IS_OS_WINDOWS) {
+            assertEquals(2, FilenameUtils.getPrefixLength("C:"));
+        }
+        if (SystemUtils.IS_OS_LINUX) {
+            assertEquals(0, FilenameUtils.getPrefixLength("C:"));
+        }
+
         assertEquals(3, FilenameUtils.getPrefixLength("C:\\"));
         assertEquals(9, FilenameUtils.getPrefixLength("//server/"));
         assertEquals(2, FilenameUtils.getPrefixLength("~"));
@@ -645,7 +653,14 @@ public class FilenameUtilsTestCase {
 
         assertEquals("", FilenameUtils.getPrefix(""));
         assertEquals("\\", FilenameUtils.getPrefix("\\"));
-        assertEquals("C:", FilenameUtils.getPrefix("C:"));
+
+        if (SystemUtils.IS_OS_WINDOWS) {
+            assertEquals("C:", FilenameUtils.getPrefix("C:"));
+        }
+        if (SystemUtils.IS_OS_LINUX) {
+            assertEquals("", FilenameUtils.getPrefix("C:"));
+        }
+
         assertEquals("C:\\", FilenameUtils.getPrefix("C:\\"));
         assertEquals("//server/", FilenameUtils.getPrefix("//server/"));
         assertEquals("~/", FilenameUtils.getPrefix("~"));
@@ -786,7 +801,14 @@ public class FilenameUtilsTestCase {
         assertEquals(null, FilenameUtils.getFullPath("//a"));
 
         assertEquals("", FilenameUtils.getFullPath(""));
-        assertEquals("C:", FilenameUtils.getFullPath("C:"));
+
+        if (SystemUtils.IS_OS_WINDOWS) {
+            assertEquals("C:", FilenameUtils.getFullPath("C:"));
+        }
+        if (SystemUtils.IS_OS_LINUX) {
+            assertEquals("", FilenameUtils.getFullPath("C:"));
+        }
+
         assertEquals("C:/", FilenameUtils.getFullPath("C:/"));
         assertEquals("//server/", FilenameUtils.getFullPath("//server/"));
         assertEquals("~/", FilenameUtils.getFullPath("~"));
@@ -821,7 +843,14 @@ public class FilenameUtilsTestCase {
         assertEquals(null, FilenameUtils.getFullPathNoEndSeparator("//a"));
 
         assertEquals("", FilenameUtils.getFullPathNoEndSeparator(""));
-        assertEquals("C:", FilenameUtils.getFullPathNoEndSeparator("C:"));
+
+        if (SystemUtils.IS_OS_WINDOWS) {
+            assertEquals("C:", FilenameUtils.getFullPathNoEndSeparator("C:"));
+        }
+        if (SystemUtils.IS_OS_LINUX) {
+            assertEquals("", FilenameUtils.getFullPathNoEndSeparator("C:"));
+        }
+
         assertEquals("C:/", FilenameUtils.getFullPathNoEndSeparator("C:/"));
         assertEquals("//server/", 
FilenameUtils.getFullPathNoEndSeparator("//server/"));
         assertEquals("~", FilenameUtils.getFullPathNoEndSeparator("~"));

Reply via email to