aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjagt <jagt@live.com>2022-04-12 12:01:47 +0800
committerAndrew Kelley <andrew@ziglang.org>2022-04-12 06:01:25 -0400
commitb9d86c6bc8e5d475ed8613bb241d1520377e629c (patch)
tree20371ff709d5653d4c24fae485b6fad1be6b5392 /src
parentc4aac28a426351c7718c605e0c06d9e69b60772e (diff)
downloadzig-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.zig41
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;
+ }
}
}