mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
fix(shell): handle cwd paths with non ascii characters (#11990)
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
This commit is contained in:
@@ -1321,8 +1321,8 @@ pub const Interpreter = struct {
|
||||
};
|
||||
|
||||
var pathbuf: bun.PathBuffer = undefined;
|
||||
const cwd: [:0]const u8 = switch (Syscall.getcwd(&pathbuf)) {
|
||||
.result => |cwd| cwd.ptr[0..cwd.len :0],
|
||||
const cwd: [:0]const u8 = switch (Syscall.getcwdZ(&pathbuf)) {
|
||||
.result => |cwd| cwd,
|
||||
.err => |err| {
|
||||
return .{ .err = .{ .sys = err.toSystemError() } };
|
||||
},
|
||||
|
||||
19
src/sys.zig
19
src/sys.zig
@@ -345,18 +345,23 @@ pub fn Maybe(comptime ReturnTypeT: type) type {
|
||||
|
||||
pub fn getcwd(buf: *bun.PathBuffer) Maybe([]const u8) {
|
||||
const Result = Maybe([]const u8);
|
||||
buf[0] = 0;
|
||||
const rc = std.c.getcwd(buf, bun.MAX_PATH_BYTES);
|
||||
return if (rc != null)
|
||||
Result{ .result = std.mem.sliceTo(rc.?[0..bun.MAX_PATH_BYTES], 0) }
|
||||
else
|
||||
Result.errnoSys(0, .getcwd).?;
|
||||
return switch (getcwdZ(buf)) {
|
||||
.err => |err| Result{ .err = err },
|
||||
.result => |cwd| Result{ .result = cwd },
|
||||
};
|
||||
}
|
||||
|
||||
pub fn getcwdZ(buf: *bun.PathBuffer) Maybe([:0]const u8) {
|
||||
const Result = Maybe([:0]const u8);
|
||||
buf[0] = 0;
|
||||
buf[buf.len - 1] = 0;
|
||||
|
||||
if (comptime Environment.isWindows) {
|
||||
var wbuf: bun.WPathBuffer = undefined;
|
||||
const len: windows.DWORD = kernel32.GetCurrentDirectoryW(wbuf.len, &wbuf);
|
||||
if (Result.errnoSys(len, .getcwd)) |err| return err;
|
||||
return Result{ .result = bun.strings.fromWPath(buf, wbuf[0..len]) };
|
||||
}
|
||||
|
||||
const rc: ?[*:0]u8 = @ptrCast(std.c.getcwd(buf, bun.MAX_PATH_BYTES));
|
||||
return if (rc != null)
|
||||
Result{ .result = rc.?[0..std.mem.len(rc.?) :0] }
|
||||
|
||||
@@ -2,7 +2,8 @@ import { $ } from "bun";
|
||||
import { describe, test, expect } from "bun:test";
|
||||
import { createTestBuilder } from "./test_builder";
|
||||
const TestBuilder = createTestBuilder(import.meta.path);
|
||||
import { bunEnv } from "harness";
|
||||
import { bunEnv, tmpdirSync } from "harness";
|
||||
import { join } from "path";
|
||||
|
||||
const BUN = process.argv0;
|
||||
|
||||
@@ -75,4 +76,14 @@ describe("bun exec", () => {
|
||||
expect(val.stderr.toString()).not.toContain("bun: command not found: bun");
|
||||
expect(val.stdout.toString()).toContain("Bun is a fast JavaScript runtime");
|
||||
});
|
||||
|
||||
test("works with latin1 paths", async () => {
|
||||
const tempdir = tmpdirSync();
|
||||
await Bun.write(join(tempdir, "Í", "hi"), "text");
|
||||
const result = await $`bun exec ls`
|
||||
.env({ ...(bunEnv as any) })
|
||||
.cwd(join(tempdir, "Í"))
|
||||
.quiet();
|
||||
expect(result.text()).toBe("hi\n");
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user