std.fs: fix relative symbolic links on Windows

closes #17564
This commit is contained in:
Andrew Kelley 2023-10-16 20:41:28 -07:00
parent 0b8fca5a19
commit 877393d17a
2 changed files with 20 additions and 1 deletions

View File

@ -160,6 +160,23 @@ fn testReadLink(dir: Dir, target_path: []const u8, symlink_path: []const u8) !vo
try testing.expectEqualStrings(target_path, given);
}
test "relative symlink to parent directory" {
var tmp = tmpDir(.{});
defer tmp.cleanup();
var subdir = try tmp.dir.makeOpenPath("subdir", .{});
defer subdir.close();
const expected_link_name = ".." ++ std.fs.path.sep_str ++ "b.txt";
try subdir.symLink(expected_link_name, "a.txt", .{});
var buf: [1000]u8 = undefined;
const link_name = try subdir.readLink("a.txt", &buf);
try testing.expectEqualStrings(expected_link_name, link_name);
}
test "openDir" {
try testWithAllSupportedPathTypes(struct {
fn impl(ctx: *TestContext) !void {

View File

@ -766,7 +766,9 @@ pub fn CreateSymbolicLink(
// it will still resolve the path relative to the root of
// the C:\ drive.
.rooted => break :target_path target_path,
else => {},
// Keep relative paths relative, but anything else needs to get NT-prefixed.
else => if (!std.fs.path.isAbsoluteWindowsWTF16(target_path))
break :target_path target_path,
},
// Already an NT path, no need to do anything to it
.nt => break :target_path target_path,