From c15f2f31482e6612fd19bb04e4eebd59f56437d3 Mon Sep 17 00:00:00 2001 From: Sergey Simonchik Date: Mon, 2 Jul 2018 13:55:03 +0300 Subject: [PATCH] ensure 3rd char is slash in FileUtil.isWindowsAbsolutePath (IDEA-CR-34321) --- .../intellij/openapi/util/io/FileUtil.java | 9 +++++++-- .../openapi/util/io/FileUtilLightTest.java | 20 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java index 56c6238a5667..40a8d3dd866e 100644 --- a/platform/util/src/com/intellij/openapi/util/io/FileUtil.java +++ b/platform/util/src/com/intellij/openapi/util/io/FileUtil.java @@ -1430,8 +1430,13 @@ public class FileUtil extends FileUtilRt { return path.startsWith("/"); } - public static boolean isWindowsAbsolutePath(@NotNull String pathString) { - return pathString.length() >= 2 && Character.isLetter(pathString.charAt(0)) && pathString.charAt(1) == ':'; + public static boolean isWindowsAbsolutePath(@NotNull String path) { + boolean ok = path.length() >= 2 && Character.isLetter(path.charAt(0)) && path.charAt(1) == ':'; + if (ok && path.length() > 2) { + char separatorChar = path.charAt(2); + ok = separatorChar == '/' || separatorChar == '\\'; + } + return ok; } @Contract("null -> null; !null -> !null") diff --git a/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilLightTest.java b/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilLightTest.java index 820d1f328669..e45a7ad68aba 100644 --- a/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilLightTest.java +++ b/platform/util/testSrc/com/intellij/openapi/util/io/FileUtilLightTest.java @@ -231,4 +231,24 @@ public class FileUtilLightTest { assertFalse(FileUtil.containsWindowsShortName("C:/dir/file.~1")); assertFalse(FileUtil.containsWindowsShortName("C:/dir/file.ext~1")); } + + @Test + public void windowsAbsolutePath() { + assertTrue(FileUtil.isWindowsAbsolutePath("C:\\Users")); + assertTrue(FileUtil.isWindowsAbsolutePath("C:/Users")); + assertTrue(FileUtil.isWindowsAbsolutePath("X:/Users")); + assertTrue(FileUtil.isWindowsAbsolutePath("X:/")); + assertTrue(FileUtil.isWindowsAbsolutePath("X:")); + assertTrue(FileUtil.isWindowsAbsolutePath("X:\\")); + assertTrue(FileUtil.isWindowsAbsolutePath("X:\\Users\\user.data.txt")); + + assertFalse(FileUtil.isWindowsAbsolutePath("")); + assertFalse(FileUtil.isWindowsAbsolutePath("/")); + assertFalse(FileUtil.isWindowsAbsolutePath("/home")); + assertFalse(FileUtil.isWindowsAbsolutePath("C")); + assertFalse(FileUtil.isWindowsAbsolutePath("1")); + assertFalse(FileUtil.isWindowsAbsolutePath("1:")); + assertFalse(FileUtil.isWindowsAbsolutePath("C:C")); + assertFalse(FileUtil.isWindowsAbsolutePath("C?")); + } }