diff --git a/base/path.jl b/base/path.jl index b0b6c52b8903f..047db17675ac4 100644 --- a/base/path.jl +++ b/base/path.jl @@ -501,6 +501,13 @@ function relpath(path::String, startpath::String = ".") path == startpath && return curdir path_arr = split(abspath(path), path_separator_re) start_arr = split(abspath(startpath), path_separator_re) + if Sys.iswindows() + if lowercase(path_arr[1]) != lowercase(start_arr[1]) # no relative paths between drives + return abspath(path) + elseif path_arr[1] != start_arr[1] # paths are case-sensitive but cannot go above drive's root directory + path_arr[1] = start_arr[1] + end + end i = 0 while i < min(length(path_arr), length(start_arr)) i += 1 diff --git a/test/path.jl b/test/path.jl index e09a46ef9370e..2e54802143598 100644 --- a/test/path.jl +++ b/test/path.jl @@ -271,6 +271,20 @@ test_relpath() end + if Sys.iswindows() + @testset "issue #23646" begin + @test lowercase(relpath("E:\\a\\b", "C:\\c")) == "e:\\a\\b" + @test lowercase(relpath("E:\\a\\b", "c:\\c")) == "e:\\a\\b" + @test lowercase(relpath("e:\\a\\b", "C:\\c")) == "e:\\a\\b" + @test lowercase(relpath("e:\\a\\b", "c:\\c")) == "e:\\a\\b" + + @test relpath("C:\\a\\b", "c:\\a\\b") == "." + @test relpath("c:\\a\\b", "C:\\a\\b") == "." + @test lowercase(relpath("C:\\a\\b", "c:\\c\\d")) == "..\\..\\a\\b" + @test lowercase(relpath("c:\\a\\b", "C:\\c\\d")) == "..\\..\\a\\b" + end + end + @testset "type stability" begin @test isa(joinpath(S("a"), S("b")), String) @test isa(joinpath(S(abspath("a")), S("b")), String)