diff options
| author | jagt <jagt@live.com> | 2022-04-12 12:01:47 +0800 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-04-12 06:01:25 -0400 |
| commit | b9d86c6bc8e5d475ed8613bb241d1520377e629c (patch) | |
| tree | 20371ff709d5653d4c24fae485b6fad1be6b5392 /src | |
| parent | c4aac28a426351c7718c605e0c06d9e69b60772e (diff) | |
| download | zig-b9d86c6bc8e5d475ed8613bb241d1520377e629c.tar.gz zig-b9d86c6bc8e5d475ed8613bb241d1520377e629c.zip | |
fix `link.renameTmpIntoCache` on windows when dest dir exists.
Previously it would fail as `renameW` do not ever fail with
`PathAlreadyExists`.
As a workaround we check for dest dir existence before rename
on Windows.
Diffstat (limited to 'src')
| -rw-r--r-- | src/link.zig | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/src/link.zig b/src/link.zig index 7c135a7405..139b12af99 100644 --- a/src/link.zig +++ b/src/link.zig @@ -717,19 +717,38 @@ pub const File = struct { // directly, and remove this function from link.zig. _ = base; while (true) { - std.fs.rename( - cache_directory.handle, - tmp_dir_sub_path, - cache_directory.handle, - o_sub_path, - ) catch |err| switch (err) { - error.PathAlreadyExists => { + if (builtin.os.tag == .windows) { + // workaround windows `renameW` can't fail with `PathAlreadyExists` + // See https://github.com/ziglang/zig/issues/8362 + if (cache_directory.handle.access(o_sub_path, .{})) |_| { try cache_directory.handle.deleteTree(o_sub_path); continue; - }, - else => |e| return e, - }; - break; + } else |err| switch (err) { + error.FileNotFound => {}, + else => |e| return e, + } + try std.fs.rename( + cache_directory.handle, + tmp_dir_sub_path, + cache_directory.handle, + o_sub_path, + ); + break; + } else { + std.fs.rename( + cache_directory.handle, + tmp_dir_sub_path, + cache_directory.handle, + o_sub_path, + ) catch |err| switch (err) { + error.PathAlreadyExists => { + try cache_directory.handle.deleteTree(o_sub_path); + continue; + }, + else => |e| return e, + }; + break; + } } } |
