From d7d179bfaf31e59aef0dee230427ff1265e70159 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 1 Jul 2026 08:34:02 -0400 Subject: [PATCH 1/3] Add failing test: PathTool Windows drive letter regex --- .../java/org/apache/maven/shared/utils/PathToolTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) 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..c93e586b 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,15 @@ public void testGetRelativePath2Parm() { assertEquals("", PathTool.getRelativePath("/usr/local/java/bin/java.sh", "/usr/local/")); } + @Test + public void testGetRelativeFilePathWithDifferentWindowsDrives() { + // Tests that the regex fix at line 146 correctly strips a leading backslash + // before a Windows drive letter. The old regex "^\\[a-zA-Z]:" matched the + // literal string "[a-zA-Z]:" instead of a backslash + drive letter. + // Different drives with leading backslash should return null. + assertNull(PathTool.getRelativeFilePath("\\C:\\usr\\local", "\\D:\\usr\\local\\java\\bin")); + } + @Test public void testUppercaseDrive() { assertNull(PathTool.uppercaseDrive(null)); From b5f9159590d23737e048f2981add4ad23fbfab07 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 1 Jul 2026 08:35:35 -0400 Subject: [PATCH 2/3] PathTool.getRelativeFilePath: fix broken Windows drive-letter regex --- src/main/java/org/apache/maven/shared/utils/PathTool.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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..2284aa4f 100644 --- a/src/main/java/org/apache/maven/shared/utils/PathTool.java +++ b/src/main/java/org/apache/maven/shared/utils/PathTool.java @@ -143,10 +143,12 @@ public static String getRelativeFilePath(final String oldPath, final String newP String toPath = new File(newPath).getPath(); // strip any leading slashes if its a windows path - if (toPath.matches("^\\[a-zA-Z]:")) { + 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); } From c488da36dc7edde116248d935e803c8022c7f253 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 1 Jul 2026 09:01:50 -0400 Subject: [PATCH 3/3] spotless:apply formatting --- .../java/org/apache/maven/shared/utils/PathTool.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) 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 2284aa4f..ed9c547c 100644 --- a/src/main/java/org/apache/maven/shared/utils/PathTool.java +++ b/src/main/java/org/apache/maven/shared/utils/PathTool.java @@ -143,12 +143,16 @@ public static String getRelativeFilePath(final String oldPath, final String newP String toPath = new File(newPath).getPath(); // strip any leading slashes if its a windows path - if (toPath.length() > 2 && toPath.charAt(0) == '\\' - && Character.isLetter(toPath.charAt(1)) && toPath.charAt(2) == ':') { + if (toPath.length() > 2 + && toPath.charAt(0) == '\\' + && Character.isLetter(toPath.charAt(1)) + && toPath.charAt(2) == ':') { toPath = toPath.substring(1); } - if (fromPath.length() > 2 && fromPath.charAt(0) == '\\' - && Character.isLetter(fromPath.charAt(1)) && fromPath.charAt(2) == ':') { + if (fromPath.length() > 2 + && fromPath.charAt(0) == '\\' + && Character.isLetter(fromPath.charAt(1)) + && fromPath.charAt(2) == ':') { fromPath = fromPath.substring(1); }