authorgravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2023-06-19 17:03:18-07:00
committergravatar for squeek502@hotmail.comRyan Liptak <squeek502@hotmail.com> 2023-06-30 15:29:43-07:00
log2eae013378882910257be38917cd0f9e70b80c31
tree9562f7a5f57c92dc98325161f11f54ce2037535b
parentcfcf9cd9b7acd1dec2cc5c079ccac373bd8b392c

fs.path: Fix Windows path component comparison being ASCII-only

We can use eqlIgnoreCaseUtf8 to get Unicode-aware Windows-compliant case insensitive path component comparison

1 files changed, 8 insertions(+), 7 deletions(-)

lib/std/fs/path.zig+8-7
...@@ -423,8 +423,7 @@ fn networkShareServersEql(ns1: []const u8, ns2: []const u8) bool {...@@ -423,8 +423,7 @@ fn networkShareServersEql(ns1: []const u8, ns2: []const u8) bool {
423 var it1 = mem.tokenizeScalar(u8, ns1, sep1);423 var it1 = mem.tokenizeScalar(u8, ns1, sep1);
424 var it2 = mem.tokenizeScalar(u8, ns2, sep2);424 var it2 = mem.tokenizeScalar(u8, ns2, sep2);
425425
426 // TODO ASCII is wrong, we actually need full unicode support to compare paths.426 return windows.eqlIgnoreCaseUtf8(it1.next().?, it2.next().?);
427 return ascii.eqlIgnoreCase(it1.next().?, it2.next().?);
428}427}
429428
430fn compareDiskDesignators(kind: WindowsPath.Kind, p1: []const u8, p2: []const u8) bool {429fn compareDiskDesignators(kind: WindowsPath.Kind, p1: []const u8, p2: []const u8) bool {
...@@ -444,8 +443,7 @@ fn compareDiskDesignators(kind: WindowsPath.Kind, p1: []const u8, p2: []const u8...@@ -444,8 +443,7 @@ fn compareDiskDesignators(kind: WindowsPath.Kind, p1: []const u8, p2: []const u8
444 var it1 = mem.tokenizeScalar(u8, p1, sep1);443 var it1 = mem.tokenizeScalar(u8, p1, sep1);
445 var it2 = mem.tokenizeScalar(u8, p2, sep2);444 var it2 = mem.tokenizeScalar(u8, p2, sep2);
446445
447 // TODO ASCII is wrong, we actually need full unicode support to compare paths.446 return windows.eqlIgnoreCaseUtf8(it1.next().?, it2.next().?) and windows.eqlIgnoreCaseUtf8(it1.next().?, it2.next().?);
448 return ascii.eqlIgnoreCase(it1.next().?, it2.next().?) and ascii.eqlIgnoreCase(it1.next().?, it2.next().?);
449 },447 },
450 }448 }
451}449}
...@@ -1084,8 +1082,7 @@ pub fn relativeWindows(allocator: Allocator, from: []const u8, to: []const u8) !...@@ -1084,8 +1082,7 @@ pub fn relativeWindows(allocator: Allocator, from: []const u8, to: []const u8) !
1084 const from_component = from_it.next() orelse return allocator.dupe(u8, to_it.rest());1082 const from_component = from_it.next() orelse return allocator.dupe(u8, to_it.rest());
1085 const to_rest = to_it.rest();1083 const to_rest = to_it.rest();
1086 if (to_it.next()) |to_component| {1084 if (to_it.next()) |to_component| {
1087 // TODO ASCII is wrong, we actually need full unicode support to compare paths.1085 if (windows.eqlIgnoreCaseUtf8(from_component, to_component))
1088 if (ascii.eqlIgnoreCase(from_component, to_component))
1089 continue;1086 continue;
1090 }1087 }
1091 var up_index_end = "..".len;1088 var up_index_end = "..".len;
...@@ -1162,7 +1159,7 @@ test "relative" {...@@ -1162,7 +1159,7 @@ test "relative" {
1162 try testRelativeWindows("c:/blah\\blah", "d:/games", "D:\\games");1159 try testRelativeWindows("c:/blah\\blah", "d:/games", "D:\\games");
1163 try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa", "..");1160 try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa", "..");
1164 try testRelativeWindows("c:/aaaa/bbbb", "c:/cccc", "..\\..\\cccc");1161 try testRelativeWindows("c:/aaaa/bbbb", "c:/cccc", "..\\..\\cccc");
1165 try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa/bbbb", "");1162 try testRelativeWindows("c:/aaaa/bbbb", "C:/aaaa/bbbb", "");
1166 try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa/cccc", "..\\cccc");1163 try testRelativeWindows("c:/aaaa/bbbb", "c:/aaaa/cccc", "..\\cccc");
1167 try testRelativeWindows("c:/aaaa/", "c:/aaaa/cccc", "cccc");1164 try testRelativeWindows("c:/aaaa/", "c:/aaaa/cccc", "cccc");
1168 try testRelativeWindows("c:/", "c:\\aaaa\\bbbb", "aaaa\\bbbb");1165 try testRelativeWindows("c:/", "c:\\aaaa\\bbbb", "aaaa\\bbbb");
...@@ -1188,6 +1185,10 @@ test "relative" {...@@ -1188,6 +1185,10 @@ test "relative" {
1188 try testRelativeWindows("a/b/c", "a", "..\\..");1185 try testRelativeWindows("a/b/c", "a", "..\\..");
1189 try testRelativeWindows("a/b/c", "a\\b\\c\\d", "d");1186 try testRelativeWindows("a/b/c", "a\\b\\c\\d", "d");
11901187
1188 try testRelativeWindows("\\\\FOO\\bar\\baz", "\\\\foo\\BAR\\BAZ", "");
1189 // Unicode-aware case-insensitive path comparison
1190 try testRelativeWindows("\\\\кириллица\\ελληνικά\\português", "\\\\КИРИЛЛИЦА\\ΕΛΛΗΝΙΚΆ\\PORTUGUÊS", "");
1191
1191 try testRelativePosix("/var/lib", "/var", "..");1192 try testRelativePosix("/var/lib", "/var", "..");
1192 try testRelativePosix("/var/lib", "/bin", "../../bin");1193 try testRelativePosix("/var/lib", "/bin", "../../bin");
1193 try testRelativePosix("/var/lib", "/var/lib", "");1194 try testRelativePosix("/var/lib", "/var/lib", "");