diff --git a/source/dub/internal/vibecompat/inet/path.d b/source/dub/internal/vibecompat/inet/path.d index 745d8c4..b00176d 100644 --- a/source/dub/internal/vibecompat/inet/path.d +++ b/source/dub/internal/vibecompat/inet/path.d @@ -152,8 +152,9 @@ assert(this.absolute && parentPath.absolute); version(Windows){ // a path such as ..\C:\windows is not valid, so force the path to stay absolute in this case - if( this.absolute && !this.empty && m_nodes[0].toString().endsWith(":") && - !parentPath.startsWith(this[0 .. 1]) ) + if( this.absolute && !this.empty && + (m_nodes[0].toString().endsWith(":") && !parentPath.startsWith(this[0 .. 1]) || + m_nodes[0] == "\\" && !parentPath.startsWith(this[0 .. min(2, $)]))) { return this; } @@ -437,5 +438,20 @@ auto subfilep = Path(subfile); auto subfile_rel = "child"; assert(subfilep.relativeTo(parentpathp).toString() == subfile_rel); - } + } + + { // relative paths across Windows devices are not allowed + auto p1 = Path("\\\\server\\share"); assert(p1.absolute); + auto p2 = Path("\\\\server\\othershare"); assert(p2.absolute); + auto p3 = Path("\\\\otherserver\\share"); assert(p3.absolute); + auto p4 = Path("C:\\somepath"); assert(p4.absolute); + auto p5 = Path("C:\\someotherpath"); assert(p5.absolute); + auto p6 = Path("D:\\somepath"); assert(p6.absolute); + assert(p4.relativeTo(p5) == Path("../somepath")); + assert(p4.relativeTo(p6) == Path("C:\\somepath")); + assert(p4.relativeTo(p1) == Path("C:\\somepath")); + assert(p1.relativeTo(p2) == Path("../share")); + assert(p1.relativeTo(p3) == Path("\\\\server\\share")); + assert(p1.relativeTo(p4) == Path("\\\\server\\share")); + } }