From 616d4a4f42c9e258dc56d1ecbc91aa2236187cf6 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 1 Jul 2026 08:34:02 -0400 Subject: [PATCH 1/5] 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 86d6878cbd4d0603138180518c7c4cbba0d4eeae Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 1 Jul 2026 08:35:35 -0400 Subject: [PATCH 2/5] 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 10c0767a468ec21ca4f0c4708b56f5c288203409 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Wed, 1 Jul 2026 09:01:50 -0400 Subject: [PATCH 3/5] 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); } From 43eb1ef0d4107e232d9fa9da9eeb64dee59df647 Mon Sep 17 00:00:00 2001 From: Elliotte Rusty Harold Date: Fri, 24 Jul 2026 13:12:44 +0000 Subject: [PATCH 4/5] Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../java/org/apache/maven/shared/utils/PathToolTest.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 c93e586b..3315b1ac 100644 --- a/src/test/java/org/apache/maven/shared/utils/PathToolTest.java +++ b/src/test/java/org/apache/maven/shared/utils/PathToolTest.java @@ -104,10 +104,9 @@ public void testGetRelativePath2Parm() { @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. + // 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")); } From 6dd93210c722b995cc1df17e37aee58510f5188b Mon Sep 17 00:00:00 2001 From: opencode Date: Fri, 24 Jul 2026 13:25:30 +0000 Subject: [PATCH 5/5] Fix misleading comment: code strips backslash before drive letter, not 'any leading slashes' --- src/main/java/org/apache/maven/shared/utils/PathTool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ed9c547c..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,7 +142,7 @@ 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 + // strip any leading backslash before a Windows drive letter if (toPath.length() > 2 && toPath.charAt(0) == '\\' && Character.isLetter(toPath.charAt(1))