diff --git a/src/main/java/org/apache/maven/shared/utils/PathTool.java b/src/main/java/org/apache/maven/shared/utils/PathTool.java index 95ee050c..8ae64cd9 100644 --- a/src/main/java/org/apache/maven/shared/utils/PathTool.java +++ b/src/main/java/org/apache/maven/shared/utils/PathTool.java @@ -142,11 +142,17 @@ public static String getRelativeFilePath(final String oldPath, final String newP String fromPath = new File(oldPath).getPath(); String toPath = new File(newPath).getPath(); - // strip any leading slashes if its a windows path - if (toPath.matches("^\\[a-zA-Z]:")) { + // strip any leading backslash before a Windows drive letter + if (toPath.length() > 2 + && toPath.charAt(0) == '\\' + && Character.isLetter(toPath.charAt(1)) + && toPath.charAt(2) == ':') { toPath = toPath.substring(1); } - if (fromPath.matches("^\\[a-zA-Z]:")) { + if (fromPath.length() > 2 + && fromPath.charAt(0) == '\\' + && Character.isLetter(fromPath.charAt(1)) + && fromPath.charAt(2) == ':') { fromPath = fromPath.substring(1); } diff --git a/src/test/java/org/apache/maven/shared/utils/PathToolTest.java b/src/test/java/org/apache/maven/shared/utils/PathToolTest.java index 31537659..3315b1ac 100644 --- a/src/test/java/org/apache/maven/shared/utils/PathToolTest.java +++ b/src/test/java/org/apache/maven/shared/utils/PathToolTest.java @@ -102,6 +102,14 @@ public void testGetRelativePath2Parm() { assertEquals("", PathTool.getRelativePath("/usr/local/java/bin/java.sh", "/usr/local/")); } + @Test + public void testGetRelativeFilePathWithDifferentWindowsDrives() { + // Verifies that a leading backslash before a Windows drive letter (e.g. "\C:\\...") + // is stripped so the drive-letter comparison logic runs. + // Different drives should return null. + assertNull(PathTool.getRelativeFilePath("\\C:\\usr\\local", "\\D:\\usr\\local\\java\\bin")); + } + @Test public void testUppercaseDrive() { assertNull(PathTool.uppercaseDrive(null));