diff --git a/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java b/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java index d7755b6e8d8..e15a63399a4 100644 --- a/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java +++ b/liquibase-core/src/main/java/liquibase/resource/AbstractPathResourceAccessor.java @@ -2,6 +2,7 @@ import liquibase.Scope; import liquibase.logging.Logger; +import liquibase.util.FileUtil; import java.io.File; import java.io.IOException; @@ -48,7 +49,20 @@ public List getAll(String path) throws IOException { private String standardizePath(String path) { try { - return new File(path).toPath().normalize().toString().replace("\\", "/").replaceFirst("^/", ""); + // + // Flip the separators to Linux-style and replace the first separator + // If then root path is the absolute path for Linux or Windows then return that result + // + String rootPath = getRootPath().toString(); + String result = new File(path).toPath().normalize().toString().replace("\\", "/").replaceFirst("^/", ""); + if (rootPath.equals("/") || rootPath.equals("\\")) { + return result; + } + + // + // Strip off any Windows drive prefix and return the result + // + return result.replaceFirst("^\\w:/",""); } catch (InvalidPathException e) { Scope.getCurrentScope().getLog(getClass()).warning("Failed to standardize path " + path, e); return path; diff --git a/liquibase-core/src/main/java/liquibase/util/FileUtil.java b/liquibase-core/src/main/java/liquibase/util/FileUtil.java index 77fa42dc122..3cd117443dc 100644 --- a/liquibase-core/src/main/java/liquibase/util/FileUtil.java +++ b/liquibase-core/src/main/java/liquibase/util/FileUtil.java @@ -52,11 +52,10 @@ public static String getFileNotFoundMessage(String physicalChangeLogLocation) { return message; } - public static boolean isAbsolute(String path) throws IOException { + public static boolean isAbsolute(String path) { if (path == null) { return false; } return new File(path).isAbsolute(); } - } diff --git a/liquibase-core/src/test/groovy/liquibase/resource/DirectoryResourceAccessorTest.groovy b/liquibase-core/src/test/groovy/liquibase/resource/DirectoryResourceAccessorTest.groovy index a908aa78b23..561a119244e 100644 --- a/liquibase-core/src/test/groovy/liquibase/resource/DirectoryResourceAccessorTest.groovy +++ b/liquibase-core/src/test/groovy/liquibase/resource/DirectoryResourceAccessorTest.groovy @@ -93,14 +93,15 @@ class DirectoryResourceAccessorTest extends Specification { simpleTestAccessor.getAll(path)*.getPath() == expected where: - path | expected - "liquibase/resource/DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] - "/liquibase/resource/DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] - "liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] - "\\liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] - "com/example/file with space.txt" | ["com/example/file with space.txt"] - "com\\example\\file with space.txt" | ["com/example/file with space.txt"] - "com/example/file with space.txt" | ["com/example/file with space.txt"] + path | expected + "liquibase/resource/DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] + "/liquibase/resource/DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] + "liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] + "\\liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] + "com/example/file with space.txt" | ["com/example/file with space.txt"] + "com\\example\\file with space.txt" | ["com/example/file with space.txt"] + "com/example/file with space.txt" | ["com/example/file with space.txt"] + "c:\\liquibase\\resource\\DirectoryResourceAccessorTest.class" | ["liquibase/resource/DirectoryResourceAccessorTest.class"] } def "getAll returns empty if nothing matches"() {