Compare commits

...

1 Commits

Author SHA1 Message Date
Zack Radisic
572c984a03 make mv work cross device 2024-07-08 20:05:29 +08:00
2 changed files with 24 additions and 9 deletions

View File

@@ -158,7 +158,7 @@ pub fn moveFileZSlow(from_dir: bun.FileDescriptor, filename: [:0]const u8, to_di
pub fn moveFileZSlowMaybe(from_dir: bun.FileDescriptor, filename: [:0]const u8, to_dir: bun.FileDescriptor, destination: [:0]const u8) Maybe(void) {
const in_handle = switch (bun.sys.openat(from_dir, filename, bun.O.RDONLY | bun.O.CLOEXEC, if (Environment.isWindows) 0 else 0o644)) {
.result => |f| f,
.err => |e| return .{ .err = e },
.err => |e| return .{ .err = e.withPath(filename) },
};
defer _ = bun.sys.close(in_handle);
_ = bun.sys.unlinkat(from_dir, filename);
@@ -199,7 +199,7 @@ pub fn copyFileZSlowWithHandle(in_handle: bun.FileDescriptor, to_dir: bun.FileDe
if (comptime Environment.isPosix) 0o644 else 0,
)) {
.result => |fd| fd,
.err => |e| return .{ .err = e },
.err => |e| return .{ .err = e.withPath(destination) },
};
defer _ = bun.sys.close(out_handle);

View File

@@ -8346,13 +8346,25 @@ pub const Interpreter = struct {
return;
}
switch (Syscall.renameat(this.cwd, src, this.cwd, this.target)) {
.err => |e| {
if (e.getErrno() == .NOTDIR) {
this.err = e.withPath(this.target);
} else this.err = e;
var err = switch (bun.sys.renameat2(this.cwd, src, this.cwd, this.target, .{
.exclude = true,
})) {
.err => |err| brk: {
if (err.getErrno() == .XDEV) {
if (bun.C.moveFileZSlowMaybe(this.cwd, src, this.cwd, this.target).asErr()) |e| {
break :brk e;
}
return;
}
break :brk err;
},
else => {},
.result => return,
};
if (err.getErrno() == .NOTDIR) {
this.err = err.withPath(this.target);
} else {
this.err = err;
}
}
@@ -8486,7 +8498,10 @@ pub const Interpreter = struct {
},
else => {
const sys_err = e.toSystemError();
const buf = this.bltn.fmtErrorArena(.mv, "{s}: {s}\n", .{ sys_err.path.byteSlice(), sys_err.message.byteSlice() });
const buf = if (sys_err.path.length() > 0)
this.bltn.fmtErrorArena(.mv, "{s}: {s}\n", .{ sys_err.path.byteSlice(), sys_err.message.byteSlice() })
else
this.bltn.fmtErrorArena(.mv, "{s}\n", .{sys_err.message.byteSlice()});
return this.writeFailingError(buf, 1);
},
}